Android 动画 6问6答

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 动画 6问6答相关的知识,希望对你有一定的参考价值。

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.开启硬件加速 对动画效率 有好处。

 

以上是关于Android 动画 6问6答的主要内容,如果未能解决你的问题,请参考以下文章

Android 动画嵌套片段

Android使用片段在viewpager中的页面滚动上放置动画

Android 多进程编程 15问15答!

动画《区块链100问》第6集:密码朋克是什么?

Android 6.0 修改开机动画

Android 动画布局和视图