Android Property Animation,androidproperty
Property Animation介紹:
出生在3.0,是利用了View所擁有的屬性,進行一系列的操作。比如一個View有什麼樣的setAbc的屬性,那麼理論上就可以設定它。
它不僅改變View的繪製,也改變了View的屬性;而Tween Animation 只改變View的繪製。
ValueAnimator 為動畫的基類,它有一個子類ObjectAnimator。需要Interpolator和TypeEvaluator來計算屬性值。
Interpolator 時間插入器,動畫的運動速率,參見上一篇Tween Animation
TypeEvaluator Animator的Factory 方法 of方法能建立屬性為任何值類型的對象。TypeEvaluator就是用來計算屬性值的
3.0以後新增了一些View的屬性:
1)translationX 和 translationY:這兩個屬性控制了View所處的位置,
它們的值是由layout容器設定的,是相對於座標原點(0,0左上方)的一個位移量。
2)rotation, rotationX 和 rotationY:控制View繞著軸點(pivotX和pivotY)旋轉。它的表現跟Tween Animation中的RotateAnimation不一致。
RotateAnimation 的旋轉,表現為平面的旋轉
而rotationX、Y 旋轉,是立體的旋轉,預設是以View的中心點,做x y的水平線,面向水平線進行翻轉
3)scaleX 和 scaleY:控制View基於pivotX和pivotY的縮放。
4)pivotX 和 pivotY:旋轉的軸點和縮放的基準點,預設是View的中心點。
5)x 和 y:描述了view在其父容器中的最終位置,是左上方左標和位移量(translationX,translationY)的和。
6)aplha:透明度,1是完全不透明,0是完全透明。
以上這些屬性與Tween Animation的動畫屬性值差不多
ObjectAnimator 對象動畫
該動畫,一次只能表示一個動作屬性。
ObjectAnimator的xml實現xml定義動畫
res/animator/scale_object_animator.xml
<?xml version="1.0" encoding="utf-8"?><objectAnimator xmlns:android="http://schemas.android.com/apk/res/android" android:duration="2000" android:propertyName="scaleX" android:repeatCount="1" android:repeatMode="reverse" android:valueFrom="1.0" android:valueTo="2.0" ></objectAnimator>
代碼載入 動畫xml
imageview_scale.setBackground(getResources().getDrawable(R.drawable.a11));ObjectAnimator scaleAnimator = (ObjectAnimator) AnimatorInflater.loadAnimator(this, R.animator.scale_object_animator);scaleAnimator.setTarget(imageview_scale);//設定動畫作用的目標對象scaleAnimator.setDuration(1000);scaleAnimator.setRepeatCount(50);scaleAnimator.start();
AnimatorSet 動畫集
由ObjectAnimator 和 ValueAnimator 組成,對應的xml中的寫法 類似為 <se> <objectAnimator /> <animator /> </set>
xml定義動畫
res/animator/set_rotate_scale.xml
<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android" android:ordering="together"> <!-- android:ordering together表示同時運行動畫, sequentially 表示按順序執行以下動畫 --> <set> <objectAnimator android:propertyName="rotationX" android:repeatCount="50" android:repeatMode="reverse" android:valueFrom="0" android:valueTo="20" /> <objectAnimator android:propertyName="rotationY" android:repeatCount="50" android:repeatMode="reverse" android:valueFrom="0" android:valueTo="45" android:valueType="floatType" /> </set> <set> <objectAnimator android:propertyName="scaleX" android:repeatCount="50" android:repeatMode="reverse" android:valueFrom="1.0" android:valueTo="2.0" > </objectAnimator> <objectAnimator android:propertyName="scaleY" android:repeatCount="50" android:repeatMode="reverse" android:valueFrom="1.0" android:valueTo="2.0" > </objectAnimator> </set></set>
代碼載入 動畫xml
imageview_rotate.setBackground(getResources().getDrawable(R.drawable.a11));AnimatorSet animatorSet = (AnimatorSet) AnimatorInflater.loadAnimator(this, R.animator.set_rotate_scale);animatorSet.setTarget(imageview_rotate);animatorSet.setDuration(1000);animatorSet.setInterpolator(new BounceInterpolator());//設定end時的彈跳插入器animatorSet.start();
PropertyValuesHolder
//使用PropertyValuesHolder 構造 Animator 組合成類似set的效果PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("scaleX",0f,2.5f);PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat("scaleY",0f,3f); ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(imageview, pvhX,pvhY);animator.setDuration(2000);animator.start();ViewPropertyAnimator
通過view.animate()來擷取ViewPropertyAnimator
imageview.setBackground(getResources().getDrawable(R.drawable.a11));ViewPropertyAnimator animate = imageview.animate();//該對象沒有setRepeat的方法//通過一些動畫屬性來設定 組合成類似set的效果animate.alpha(0);animate.rotationX(50);animate.translationXBy(500);animate.scaleX(1.5f);animate.scaleY(1.5f);animate.setInterpolator(new BounceInterpolator());animate.setDuration(2000);animate.start();
ValueAnimator
ValueAnimator代碼和xml設定中 沒有setPropertyName 因為不是操作對象,只是根據value進行某種動作
需要加監聽器,監聽值的變化 做相應的處理
xml定義動畫
<?xml version="1.0" encoding="utf-8"?><animator xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_interpolator" android:duration="10000" android:startOffset="1000" android:repeatCount="infinite" android:repeatMode="restart" android:valueFrom="1" android:valueTo="100" android:valueType="intType"></animator>
代碼載入 動畫xml
ValueAnimator valueAnimator = (ValueAnimator) AnimatorInflater.loadAnimator(this, R.animator.animator);valueAnimator.setTarget(tv_num);valueAnimator.setEvaluator(new TypeEvaluator<Integer>() {@Override public Integer evaluate(float fraction, Integer startValue, Integer endValue) {System.out.println("百分比,fraction:" + fraction);System.out.println("結果值:" + (int)((startValue + fraction * (endValue - startValue)) / 10 * 10)); return (int)((startValue + fraction * (endValue - startValue)) / 10 * 10);}});valueAnimator.addUpdateListener(new AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {//在onAnimationUpdate中 該值返回第一個動畫的 當前幀的evaluate 值System.out.println("animation.getAnimatedValue()==" + animation.getAnimatedValue());tv_num.setText(animation.getAnimatedValue() + "");}});//valueAnimator.setInterpolator(new LinearInterpolator());valueAnimator.start();
Animator的監聽器AnimatorListener
new AnimatorListener() {@Overridepublic void onAnimationStart(Animator animation) {}@Overridepublic void onAnimationRepeat(Animator animation) {}@Overridepublic void onAnimationEnd(Animator animation) {}@Overridepublic void onAnimationCancel(Animator animation) {}}
AnimatorListenerAdapter
new AnimatorListenerAdapter() {//空實現了AnimatorListener@Overridepublic void onAnimationCancel(Animator animation) {super.onAnimationCancel(animation);}@Overridepublic void onAnimationEnd(Animator animation) {super.onAnimationEnd(animation);}@Overridepublic void onAnimationRepeat(Animator animation) {super.onAnimationRepeat(animation);}@Overridepublic void onAnimationStart(Animator animation) {super.onAnimationStart(animation);}@Overridepublic void onAnimationPause(Animator animation) {super.onAnimationPause(animation);}@Overridepublic void onAnimationResume(Animator animation) {super.onAnimationResume(animation);}}AnimatorUpdateListener
new AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {//在onAnimationUpdate中 該值返回第一個動畫的 當前幀的evaluate 值System.out.println("animation.getAnimatedValue()==" + animation.getAnimatedValue());}}
一些操作函數:animator.pause(); animator.resume();animator.reverse(); animator.end();animator.cancel();
animator.start();animator.isStarted();animator.isPaused();animator.isRunning();
用屬性動畫換背景色
詳見ApiDemo要下的 BouncingBalls.java
private static final int RED = 0xffFF8080;private static final int BLUE = 0xff8080FF;private static final int CYAN = 0xff80ffff;private static final int GREEN = 0xff80ff80;{//動畫 變色 ObjectAnimator colorAnim = ObjectAnimator.ofInt(this, "backgroundColor", CYAN, BLUE, RED);colorAnim.setTarget(ll_animation);colorAnim.setEvaluator(new ArgbEvaluator());colorAnim.setRepeatCount(ValueAnimator.INFINITE);colorAnim.setRepeatMode(ValueAnimator.REVERSE);colorAnim.setDuration(3000);colorAnim.start();}
LayoutTransition
/* * ViewGroup中使用LayoutTransition 進行 監聽布局的改變,而建立動畫 * LayoutTransition.APPEARING 新增出現時 * CHANGE_APPEARING * CHANGE_DISAPPEARING 子view消失時 * CHANGING * ViewGroup布局中:android:animateLayoutChanges="true" 使用的預設的LayoutTransition製作動畫 */LayoutTransition layoutTransition = new LayoutTransition();layoutTransition.setDuration(5000);layoutTransition.setAnimator(LayoutTransition.APPEARING, scaleAnimator);ll_animation.setLayoutTransition(layoutTransition);final TextView tv = new TextView(this);tv.setWidth(100);tv.setHeight(100);tv.setText("中華人民共和國");ll_animation.addView(tv);//對應type = APPEARINGll_animation.postDelayed(new Runnable() {@Overridepublic void run() {ll_animation.removeView(tv);}}, 2000);
參考例子見:ApiDemos下的 LayoutAnimations.java
我想要在android程式中,出現一副動畫,怎做?
在Android的FrameWork中,提供三種動畫的實現方式:逐幀(Frame)動畫、視圖動畫(View Animation)和屬性動畫(Property Animation)。
根據SDK中的描述,這三者的功能強大程度為:逐幀動畫<視圖動畫<屬性動畫。
一、逐幀動畫:
該動畫的方式就是將動畫的過程的每一張靜態圖片都收集起來,然後依次顯示這些圖片,利用人眼的“視覺停留”的原理,給使用者產生動畫的效果。
二、視圖動畫:
也稱為補間(Tween)動畫,根據這兩個定義可以看出該動畫方式的一些特徵:
1)該動畫方式只是針對於View對象,例如ImageView、Button等;
2)實現該動畫時,只需要給出兩個主要畫面格的相關屬性,Android會給你生給定成時間段內的兩主要畫面格的動畫漸層過程。
三、屬性動畫:
Android在3.0中引入了屬性動畫。和視圖動畫專註與視圖效果不同,它更專註於對象的屬性的變化,通過改變對象的屬性而實現動畫,不論該對象是否可見。例如:你使用視圖動畫將一個Button放大一倍,在介面上的效果可以實現,但是該Button的觸摸響應地區還是和原來的一樣,也就是說,視圖動畫並不是真正的將該Button放大一倍。
www.linuxidc.com/Linux/2013-01/78069.htm
Android 開發中Animation首次不運行,第二次開始正常?
最開始你的numberbtn是隱藏的嗎?如果是就添加上一句numberbtn.setVisible(true);如果不是你執行前numberbtn.clearAnimation();試試,不太明白你描述的邏輯