一.屬性動畫的相關概念
android支援兩種動畫模式,tween animation逐幀動畫,frame animation補間動畫。
屬性動畫并不屬于Android的動畫模式,它相當于一種擴充動畫。
一般來說,我們在自定義控件或者控制一些移動操作的時候會使用到這樣的屬性動畫,其是屬性動畫并不是想象中那麼難,隻要看看用法舉一反三用用就會了~
使用動畫有三個重要的要素,開始位置、結束位置、持續時間;
比如控制一個圖像旋轉360度,代碼:
ImageView imageview=(ImageView)findViewById(R.id.img);
ObjectAnimator.ofFloat(imageView,”rotation”,0F,360F).setDuration(200).start();
參數一為控件對象,
參數三、四為移動的開始方向和結束的方向。
參數二控制屬性的一個變量,隻要屬性有get和set方法就可以通過屬性動畫操作它,也是屬性動畫最重要的一個參數,這個參數的get和set方法一般是系統幫你實作好的。
同時執行,多個動作一起執行
ImageView imageview=(ImageView)findViewById(R.id.img);
ObjectAnimator.ofFloat(imageView,”translationX”,0F,200F).setDuration(200).start();//平移X
ObjectAnimator.ofFloat(imageView,”rotation”,0F,360F).setDuration(200).start();//旋轉
ObjectAnimator.ofFloat(imageView,”translationY”,0F,200F).setDuration(200).start();//平移Y
ObjectAnimator.ofFloat(imageView,”alpha”,0F,1F).setDuration(200).start();//透明度漸變
三個動畫可使用類PropertyValuesHolder融合在一起,更加優化,性能提升
PropertyValuesHolder p1=PropertyValuesHolder.ofFloat(“rotation”,0F,360F);
PropertyValuesHolder p2=PropertyValuesHolder.ofFloat(“translationX”,0F,200F);
PropertyValuesHolder p3=PropertyValuesHolder.ofFloat(“translationY”,0F,200F);
ObjectAnimator.ofPropertyValuesHolder(imageView,p1,p2,p3).setDuration(1000).start();
也可執行AnimatorSet把所有動畫添加到一起播放
AnimatorSet set=new AnimatorSet();
ObjectAnimator am1=ObjectAnimator.ofFload(imageView,”rotation”,0F,360F);
ObjectAnimator am2=ObjectAnimator.ofFloat(imageView,”translationX”,0F,200F);
ObjectAnimator am2=ObjectAnimator.ofFloat(imageView,”translationY”,0F,200F);
set.playTogether(an1,an2,an3);
set.setDuration();
set.start();
把這句set.playTogether(an1,an2,an3);
變為
set.playSequentially(an1,an2,an3);
可實作按順序播放動畫
實作同時播放和後播放的效果:
//先執行an2和an3,後執行an1
set.play(an2).with(an3);
set.play(an1).after(an2);
動畫的監聽事件
ObjectAnimator an=ObjectAnimator.ofFloat(imageView,”alpha”,0F,1F).setDuration(200).start();//旋轉
想實作動畫結束的監聽隻要實作
an.addListener(new Animator.AnminatorListener(){
//實作裡面所有的方法,真正運用的一般都是動畫結束時的監聽
});
二.屬性動畫的一個執行個體
程式運作後,頁面顯示效果:
這裡預設顯示的内容是不超過五行的。
點選“顯示更多”後,會慢慢的顯示全部内容(動畫效果)。
注意這裡會有動畫效果。
最後的效果,如下圖所示:
點選“收起”後,還原上一個頁面的顯示。隻顯示五行的内容。
(一)顯示内容的xml布局檔案text.xml設計
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<TextView
android:id="@+id/tv_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:maxLines="5"
android:text="内容區域"
android:textColor="@android:color/black" />
<TextView
android:id="@+id/tv_more"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:text="顯示更多"
android:visibility="gone" />
</merge>
(二)控制顯示和隐藏内容的java代碼檔案
這裡建立的是自定義View布局,LinearLayout 布局頁面也是View是子類
package com.example.lesson12_listanimation;
import android.animation.ObjectAnimator;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.LinearLayout;
import android.widget.TextView;
public class ShowTextView extends LinearLayout implements OnClickListener {
//文本的內容,控制文本内容的控件
TextView tvContent, tvMore;
//是否顯示的判斷
boolean isShow;
public ShowTextView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public ShowTextView(Context context) {
super(context);
init();
}
//初始化資料
private void init() {
//有兩個元件,設定垂直排列
setOrientation(VERTICAL);
//marge标簽。後面的第三個參數要使用上下文
//如果使用普通布局的标簽,第三個參數使用的是null
View view= View.inflate(getContext(), R.layout.text, this);
tvContent = (TextView)view.findViewById(R.id.tv_content);
tvContent.setPadding(, , , );
tvMore = (TextView)view.findViewById(R.id.tv_more);
//開始設定
initText();
}
private void initText() {
//延遲的去操作view
tvContent.post(new Runnable() {
@Override
public void run() {
//判斷是否單行
if (tvContent.getLineCount() != ) {
tvContent.setGravity(Gravity.LEFT);
} else {
tvContent.setGravity(Gravity.CENTER);
}
//判斷是否超過5行
if (tvContent.getLineCount() > ) {
tvMore.setVisibility(View.VISIBLE);
tvMore.setOnClickListener(ShowTextView.this);
} else {
tvMore.setVisibility(View.GONE);
}
}
});
}
@Override
public void onClick(View arg0) {
//當使用者點選的時候
isShow = !isShow;
if (isShow) {
//把控制内容 的控件的文字設定為:收起
tvMore.setText("收起");
//顯示全部内容
//屬性動畫的使用,
//第一個參數是要設定文本的對象
//第二個參數是特征值,要具有個get和set方法,這裡系統裡面已經實作了
//第三個參數是特征值原來的值
//第四個參數是特征值要變成的值
ObjectAnimator.ofInt(tvContent, "lines",, tvContent.getLineCount()).setDuration().start();
} else {
//把控制内容 的控件的文字設定為:顯示更多
tvMore.setText("顯示更多");
//收起
//屬性動畫的使用,
ObjectAnimator.ofInt(tvContent, "lines", tvContent.getLineCount(), ).setDuration().start();
}
}
//設定文本的内容
public void setText(String text) {
tvContent.setText(text);
initText();
}
}
(三)主程式調用代碼
package com.example.lesson12_listanimation;
import android.app.Activity;
import android.widget.ListView;
import android.widget.TextView;
public class MainActivity extends Activity {
//定義自定義的View對象
ShowTextView showTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//執行個體化自定義View
showTextView=new ShowTextView(this);
//顯示自定義的View
setContentView(showTextView);
//給TextView填充資料
showTextView.setText("加載動畫\n" +
"AnimationUtils\n" +
"\n" +
"所有動畫都有的屬性\n" +
"fillAfter 動畫播放完畢後 停留在最後的動畫的狀态,不能同時播放幀動畫後停止狀态\n" +
"android:repeatCount=\"infinite\" 次數,可選數值\n" +
"android:repeatMode=\"reverse\" 反轉 模式 預設重複,\n" +
"android:interpolator=\"@android:anim/bounce_interpolator\" 彈球效果,不能在set裡面\n" +
"\n" +
"java代碼建立\n" +
" Animation anim = new ScaleAnimation(0, 1, 0, 1, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);\n" +
" \n" +
"如果沒有寫TO_SELF,那麼針對父窗體\n" +
"\n" +
"增對activity的進出場動畫\n" +
"overridePendingTransition\n" +
"必須放在finish或者startactivity還有forResult之後的一句,");
}
}
程式運作後,就可以使用功能,這裡點選文字隐藏和顯示後,顯示的效果都是有動畫效果的,比如點選“顯示更多”内容後,後面的文字會一行一行的顯示出來。點選“收起”,同樣是有動畫效果的。
其實這個程式不使用動畫的類也能實作文字的顯示和隐藏,但是就是沒有那種動畫的效果,這裡使用動畫效果就是為了讓使用者感覺比較有意思一點。
總結:
使用屬性動畫能讓内容顯示或隐藏的過程有動畫效果。
屬性動畫也能讓圖像做補間動畫的相關效果。
幀動畫和補間動畫是動畫的基礎。要熟練掌握。
屬性動畫是動畫的擴充,使用起來其實也并是不很難。
而且不用設計布局檔案。但是要對相關的類和方法做了解。
如果深入研究,還是有很多難點的。它有很多的相關類。
總結–常用方法、類
ValueAnimator
ObjectAnimator
AnimatorUpdateListener
AnimatorListenerAdapter
PropertyValuesHolder
AnimatorSet
TypeEvaluators
Interpolators
總結屬性-常用
translationX\translationY
rotation、rotationX\rotationY
scaleX\scaleY
X/Y
alpha
想要學習可以自己慢研究;
提供一個講解屬性動畫的一個網址:
http://blog.csdn.net/lmj623565791/article/details/38067475