zoukankan      html  css  js  c++  java
  • 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.开启硬件加速 对动画效率 有好处。

  • 相关阅读:
    EF基于方法的查询语法
    &,^,|,的简化计算与理解
    会计中阿拉伯数字变数字繁体大写
    接口对接请求方法
    经验总结之Android framework开发
    android开机过程简单描述
    为什么一个类的全局变量默认以m开头?
    使用DataOutputStream写入int类型数字不能显示
    20151128学习总结
    sky简介
  • 原文地址:https://www.cnblogs.com/punkisnotdead/p/5185557.html
Copyright © 2011-2022 走看看