Android 動畫 6問6答

希爾瓦娜斯女神發表於2016-02-09

1.view 動畫有哪些需要注意的?

答:view動畫 本身比較簡單。http://www.cnblogs.com/punkisnotdead/p/5179115.html 看這篇文章的第五問就可以了。

 

2.如何給viewGroup 子元素出場時增加動畫效果?

答:以listview 為例。

1 <?xml version="1.0" encoding="utf-8"?>
2 <layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
3     android:delay="0.5"
4     android:animationOrder="normal"
5     android:animation="@anim/viewanim"
6     >
7 </layoutAnimation>
View Code
 1 <?xml version="1.0" encoding="utf-8"?>
 2 <set xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:duration="1000">
 4 
 5     <alpha android:fromAlpha="0.0"
 6         android:toAlpha="1.0"></alpha>
 7     <translate android:fromXDelta="500"
 8         android:toXDelta="0"></translate>
 9 
10 </set>
View Code
1 <ListView
2         android:id="@+id/lv"
3         android:layout_width="match_parent"
4         android:layout_height="match_parent"
5         android:layoutAnimation="@anim/lv_anim"></ListView>
View Code

看看效果:

 

3.如何給activity和fragment 設定切換效果?

答:activity:

1 <?xml version="1.0" encoding="utf-8"?>
2 <set xmlns:android="http://schemas.android.com/apk/res/android"
3     android:duration="1000">
4     <alpha android:fromAlpha="0.0"
5         android:toAlpha="1.0"></alpha>
6 </set>
View Code
1 <?xml version="1.0" encoding="utf-8"?>
2 <set xmlns:android="http://schemas.android.com/apk/res/android"
3     android:duration="1000">
4     <alpha android:fromAlpha="1.0"
5         android:toAlpha="0.0"></alpha>
6 </set>
View Code
1  Intent intent=new Intent(MainActivity.this,OtherActivity.class);
2                 startActivity(intent);
3                 overridePendingTransition(R.anim.enter_anim,R.anim.exit_anim);
View Code

效果:

fragment差不多 就是要使用相容包,setCustomAniamtions 即可。

 

4.使用屬性動畫需要哪些條件?

答:如果相對屬性abc 來進行屬性動畫的操作的話,必須要提供setAbc方法。 如果動畫沒有提供初始值,還有提供getAbc方法

因為系統要取abc的初始值,取不到初始值肯定要報錯。

除此之外就是 setAbc方法 必須要能對view的實際ui有改觀,讓人能感覺出來ui的變化,否則 屬性動畫可以執行 但是因為沒有效果,

也是看不出來的

 

 

5.對Button的 width 屬性使用屬性動畫,為什麼無效?有哪些解決方案?

答:

1   @android.view.RemotableViewMethod
2     public void setWidth(int pixels) {
3         mMaxWidth = mMinWidth = pixels;
4         mMaxWidthMode = mMinWidthMode = PIXELS;
5 
6         requestLayout();
7         invalidate();
8     }
View Code

你看Button 明顯雖然有setWidth方法 但是 這個方法裡 並沒有實際修改這個view的layout屬性 所以當然是無效的。

解決方法:可以用一個類,間接的來提供get set 方法。

 1  static class Wrapper
 2     {
 3         private View mTarget;
 4 
 5         public Wrapper(View target)
 6         {
 7             mTarget=target;
 8         }
 9 
10         public int getWidth()
11         {
12             return mTarget.getLayoutParams().width;
13         }
14 
15         public void setWidth(int width)
16         {
17             mTarget.getLayoutParams().width=width;
18             mTarget.requestLayout();
19         }
20 
21     }
View Code
1  bt=(Button)findViewById(R.id.iv);
2         final Wrapper wrapper=new Wrapper(bt);
3         bt.setOnClickListener(new View.OnClickListener() {
4             @Override
5             public void onClick(View v) {
6 
7                 ObjectAnimator.ofInt(wrapper, "width", 500).setDuration(5000).start();
8 }
View Code

也可以 用ValueAnimator  監聽動畫過程 然後在過程裡修改view本身的屬性值即可。

 1 public void onClick(View v) {
 2 
 3                 ValueAnimator valueAnimator=ValueAnimator.ofInt(1,100);
 4                 valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
 5                     //為了簡單 我們就線性變化就行了
 6                     private IntEvaluator mEvaluator=new IntEvaluator();
 7                     @Override
 8                     public void onAnimationUpdate(ValueAnimator animation) {
 9                         int currentValue=(Integer)animation.getAnimatedValue();
10                         float fraction=animation.getAnimatedFraction();
11                         bt.getLayoutParams().width=mEvaluator.evaluate(fraction,bt.getLayoutParams().width,500);
12                         bt.requestLayout();
13                     }
14                 });
15                 valueAnimator.setDuration(5000).start();
View Code

最後看看效果:

 

6.使用動畫需要注意哪些要點?

答:1.幀動畫 儘量別用,因為圖片過多 過大時 就oom

      2.如果你的動畫是無限迴圈的,比如屬性動畫裡面,那你activity退出的時候 記得 要把動畫停掉 不然會memory leak

  3.view動畫 再說一遍是對view的 ui層也就是使用者可感知的層面做了變化,實際ui的本質沒有變。如果出現使用view動畫 以後異常的現象,可以嘗試呼叫clearAnimation 恢復正常。

  4.動畫要使用dp 別用px。

  5.注意對3.0一下的api 相容,不過個人建議 還是不要支援4.0以下的裝置了2016年了。

  6.開啟硬體加速 對動畫效率 有好處。

 

相關文章