Android 动画 6问6答
分类:
IT文章
•
2025-01-19 23:35:07
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:andro
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.开启硬件加速 对动画效率 有好处。