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>
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>
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>
看看效果:
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>
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>
1 Intent intent=new Intent(MainActivity.this,OtherActivity.class); 2 startActivity(intent); 3 overridePendingTransition(R.anim.enter_anim,R.anim.exit_anim);
效果:
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 }
你看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 }
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 }
也可以 用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();
最後看看效果:
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.開啟硬體加速 對動畫效率 有好處。