Android Property Animation,androidproperty

來源:互聯網
上載者:User

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();試試,不太明白你描述的邏輯
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.