当前位置: 代码迷 >> Android >> Android-补间动画片
  详细解决方案

Android-补间动画片

热度:103   发布时间:2016-04-28 00:05:40.0
Android-补间动画

Android-补间动画
一 动画的分类
1,View Animation即Tween Animation**补间动画**
用于对象本身的变化例如:
主要的类型
Alpha透明度:Alpha Animation渐变动画

scale缩放大小:ScaleAnimation旋转动画

Translate位置移动:Translate Animation位移动画

rotate旋转:Trranslate Animation旋转动画

2 Drawable Animation即Frame Animation帧动画
用于对象之间的变化

3 Property Animation 属性动画,可以不用,上面两种即可
View Animation和ObjectAnimation
二 使用方法
1,创建动画
在xml中定义(官方建议方式)
通过代码动态实现

2,为View指定动画

mImageView.startAnimation(_scaleAnimation);

3,监控动画的执行过程

_alphaAnimation.setAnimationListener(new AnimationListener(){@Overridepublic void onAnimationStart(Animation arg0){// TODO Auto-generated method stubLog.i("chengzhi", "onAnimationStart");}@Overridepublic void onAnimationRepeat(Animation arg0){// TODO Auto-generated method stubLog.i("chengzhi", "onAnimationRepeat");}@Overridepublic void onAnimationEnd(Animation arg0){// TODO Auto-generated method stubLog.i("chengzhi", "onAnimationEnd");}}); 

下面是一个综合补间动画Demo:
运行结果是点击四个不同的按钮,图片显示上面的四种不同的动画,
点击comples按钮,四种动画一起启动,分别用了xml方式和动态代码方式
主Activity类:

  public class MainActivity extends Activity{    private ImageView mImageView;    @Override    protected void onCreate(Bundle savedInstanceState)    {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //实例化图片对象        mImageView = (ImageView)findViewById(R.id.imageView1);        //定义透明按钮,并设置点击事件        Button _buttonAlpha = (Button)findViewById(R.id.buttonAlpha);        _buttonAlpha.setOnClickListener(new AnimationClickListener(AnimationType.Alpha));        //定义旋转按钮,并设置点击事件        Button _buttonRotate = (Button)findViewById(R.id.buttonRotate);        _buttonRotate.setOnClickListener(new AnimationClickListener(AnimationType.Rotate));        //定义缩放按钮,并设置点击事件        Button _buttonScale = (Button)findViewById(R.id.buttonScale);        _buttonScale.setOnClickListener(new AnimationClickListener(AnimationType.Scale));        //定义位移按钮,并设置点击事件        Button _buttonTranslate = (Button)findViewById(R.id.buttonTranslate);        _buttonTranslate.setOnClickListener(new AnimationClickListener(AnimationType.Translate));        //定义复杂按钮,并设置点击事件        Button _buttonComplex = (Button)findViewById(R.id.buttonComplex);        _buttonComplex.setOnClickListener(new AnimationClickListener(AnimationType.Complex));    }       //动画枚举类    enum AnimationType    {        Alpha,        Rotate,        Scale,        Translate,        Complex    }    //实现的动画的事件监听类    class AnimationClickListener implements OnClickListener    {        private AnimationType mAnimationType;        public AnimationClickListener(AnimationType p_AnimationType)        {            mAnimationType = p_AnimationType;         }        @Override        public void onClick(View arg0)        {            // TODO Auto-generated method stub            switch (mAnimationType)            {            case Alpha:                                //1,----------------动态编码方式-----------------                /*//定义动画                AlphaAnimation _alphaAnimation = new AlphaAnimation(1f, 0.1f);                  _alphaAnimation.setDuration(3000);                _alphaAnimation.setFillAfter(true);                _alphaAnimation.setRepeatCount(5);                _alphaAnimation.setRepeatMode(Animation.REVERSE);                _alphaAnimation.setAnimationListener(new AnimationListener()                {                    @Override                    public void onAnimationStart(Animation arg0)                    {                        // TODO Auto-generated method stub                        Log.i("chengzhi", "onAnimationStart");                    }                    @Override                    public void onAnimationRepeat(Animation arg0)                    {                        // TODO Auto-generated method stub                        Log.i("chengzhi", "onAnimationRepeat");                    }                    @Override                    public void onAnimationEnd(Animation arg0)                    {                        // TODO Auto-generated method stub                        Log.i("chengzhi", "onAnimationEnd");                    }                });                //启动动画                mImageView.startAnimation(_alphaAnimation);  */                //2 --------------xml方式-------------------                Animation _animationUtils = AnimationUtils.loadAnimation(MainActivity.this, R.anim.my_alpha_anim);                mImageView.startAnimation(_animationUtils);                break;            case Rotate:                //1,--------------动态编码方式--------------                /*//定义动画                                                                       RotateAnimation _rotateAnimation = new RotateAnimation                (0, //起始度数                90, //旋转的度数                Animation.RELATIVE_TO_PARENT,//旋转中心的x坐标的参照物,是参照父布局,还是参照动画本身                0f, //x的值                Animation.RELATIVE_TO_PARENT, //旋转中心的y坐标的参照物,是参照父布局,还是参照动画本身                0f);//y的值                 //RotateAnimation _rotateAnimation3 = new RotateAnimation(fromDegrees, toDegrees, pivotXType, pivotXValue, pivotYType, pivotYValue)                //设置动画重复次数                _rotateAnimation.setRepeatCount(3);                //设置动画重复模式                _rotateAnimation.setRepeatMode(Animation.REVERSE);                //设置动画的完成状态                _rotateAnimation.setFillAfter(true);                //设置选装时间间隔                _rotateAnimation.setDuration(3000);                //设置动画的监听事件                _rotateAnimation.setAnimationListener(new AnimationListener()                {                    @Override                    public void onAnimationStart(Animation arg0)                    {                        // TODO Auto-generated method stub                        Log.i("chengzhi", "onAnimationStart");                    }                    @Override                    public void onAnimationRepeat(Animation arg0)                    {                        // TODO Auto-generated method stub                        Log.i("chengzhi", "onAnimationRepeat");                    }                    @Override                    public void onAnimationEnd(Animation arg0)                    {                        // TODO Auto-generated method stub                        Log.i("chengzhi", "onAnimationEnd");                    }                });                //启动动画                mImageView.startAnimation(_rotateAnimation);                break;*/                Animation _rotateAnimation = AnimationUtils.loadAnimation(MainActivity.this, R.anim.my_rotate_anim);                mImageView.startAnimation(_rotateAnimation);                break;            case Scale:                //1,--------------动态编码方式--------------                /*//定义动画                ScaleAnimation _scaleAnimation = new ScaleAnimation(                        0, 2.0f,                         0, 2.0f,                         Animation.RELATIVE_TO_SELF, 0f,                         Animation.RELATIVE_TO_SELF, 0f);                _scaleAnimation.setDuration(3000);                //?s                _scaleAnimation.setZAdjustment(10);                _scaleAnimation.setRepeatCount(3);                _scaleAnimation.setRepeatMode(Animation.REVERSE);                //启动动画                mImageView.startAnimation(_scaleAnimation);                */                //2 -----------xml方式--------------                Animation _scaleAnimation = AnimationUtils.loadAnimation(MainActivity.this, R.anim.my_scale_anim);                mImageView.startAnimation(_scaleAnimation);                break;            case Translate:                //1,--------------动态编码方式--------------                /*TranslateAnimation _translateAnimation = new TranslateAnimation(                        Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 2f,                         Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 2f);                _translateAnimation.setDuration(3000);                _translateAnimation.setRepeatCount(3);                _translateAnimation.setRepeatMode(Animation.REVERSE);                 mImageView.startAnimation(_translateAnimation);                 */                //2 -----------xml方式--------------                  Animation _translateAnimation = AnimationUtils.loadAnimation(MainActivity.this, R.anim.my_translate_anim);                mImageView.startAnimation(_translateAnimation);                break;             case Complex:                 //1,--------------动态编码方式--------------                /* AlphaAnimation _alphaAnimation2 = new AlphaAnimation(1.0f, 0.1f);                 _alphaAnimation2.setRepeatCount(5);                 //_alphaAnimation2.setDuration(3000);                 ScaleAnimation _scaleAnimation2 = new ScaleAnimation                         (0, 2.0f,                           0, 2.0f,                           Animation.RELATIVE_TO_SELF, 0,                           Animation.RELATIVE_TO_SELF, 0);                _scaleAnimation2.setRepeatCount(5);                //_scaleAnimation2.setDuration(3000);                RotateAnimation _rotateAnimation2 = new RotateAnimation                        (       0, 360,                                 Animation.RELATIVE_TO_SELF, 0,                                 Animation.RELATIVE_TO_SELF, 0);                 _rotateAnimation2.setRepeatCount(5);                //_rotateAnimation2.setDuration(3000);                TranslateAnimation _translateAnimation2 = new TranslateAnimation                        (Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 2f,                         Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 2f);                _translateAnimation2.setRepeatCount(5);                //_translateAnimation2.setDuration(3000);                //设置动画集对象                AnimationSet _animationSet = new AnimationSet(true);                _animationSet.setInterpolator(new AccelerateDecelerateInterpolator());                _animationSet.addAnimation(_translateAnimation2);                _animationSet.addAnimation(_rotateAnimation2);                _animationSet.addAnimation(_scaleAnimation2);                _animationSet.addAnimation(_alphaAnimation2);                _animationSet.setDuration(10000);                mImageView.startAnimation(_animationSet);*/                //2 -----------xml方式--------------                Animation _setAnimation = AnimationUtils.loadAnimation(MainActivity.this, R.anim.my_anim_set);                mImageView.startAnimation(_setAnimation);                break;            default:                break;            }           }     }      @Override    public boolean onCreateOptionsMenu(Menu menu)    {        // Inflate the menu; this adds items to the action bar if it is present.        getMenuInflater().inflate(R.menu.main, menu);        return true;    }

下面是4个定义好的动画的xml:

Tween Animation动画定义在res/anim文件夹下<?xml version="1.0" encoding="utf-8"?><alpha xmlns:android="http://schemas.android.com/apk/res/android"    android:interpolator="@android:anim/accelerate_interpolator"    android:fromAlpha="1.0"//起始透明度    android:toAlpha="0.1"//终止透明度    android:repeatCount="5"//变换的次数    android:duration="5">//变换的时间</alpha><?xml version="1.0" encoding="utf-8"?><rotate xmlns:android="http://schemas.android.com/apk/res/android"    android:fromDegrees="0"//开始旋转的位置    android:toDegrees="360"//结束旋转的位置,以度数为单位    android:pivotX="0"//旋转中心点的x坐标,加上%以自身为参考,加上%p以父类为参考,不加默认以自己为参考,下同    android:pivotY="0"//旋转中心点的y坐标    android:duration="3000"    android:repeatCount="3"> </rotate><?xml version="1.0" encoding="utf-8"?><scale xmlns:android="http://schemas.android.com/apk/res/android"    android:interpolator="@android:anim/accelerate_interpolator"    android:fromXScale="0"//起始的x方向的尺寸    android:toXScale="2"//终止的x方向的尺寸    android:fromYScale="0"//起始的y方向的尺寸    android:toYScale="2"//终止的y方向上的尺寸    android:pivotX="0"//进行尺寸变换的中心点的x坐标    android:pivotY="0"//进行尺寸变换的中心点的y坐标    android:duration="3000"    android:repeatCount="3"> </scale><?xml version="1.0" encoding="utf-8"?><translate xmlns:android="http://schemas.android.com/apk/res/android"    android:fromXDelta="0"//起始x的位置    android:toXDelta="4%"//终止x的位置    android:fromYDelta="0"//起始y的位置    android:toYDelta="4%"//终止y的位置    android:duration="3000"    android:repeatCount="3"> </translate>

下面是定义的一个动画集xml:

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android"    android:shareInterpolator="false">//动画插入器设置为false,即不应用加速度等效果    //参数同上面介绍相同    <alpha         android:fromAlpha="0.0"        android:toAlpha="1.0"        android:duration="3000"/>    <rotate         android:fromDegrees="0"        android:toDegrees="+360"        android:pivotX="50%"        android:pivotY="50%"        android:duration="3000"/>    <scale        android:fromXScale="0.0"        android:toXScale="1.0"        android:fromYScale="0.0"        android:toYScale="1.0"        android:pivotX="0.0"        android:pivotY="0.0"/>    <translate         android:fromXDelta="0"        android:toXDelta="500"        android:fromYDelta="0"        android:toYDelta="50"/> </set>

三 Interpolator动画的插入器
插入器用于动画执行的过程中的过程效果,例如有一个加速度的效果
CycleInterpolator
AccelerateInterpolator加速插入器
DecelerateInterpolator加速插入器
AccelerateDecelerateInterpolator先加速后减速插入器
类似的效果还有其他的

使用的方法也是可以xml配置,或者动态编写:

AnimationSet _animationSet = new AnimationSet(true);_animationSet.setInterpolator(new AccelerateDecelerateInterpolator());

不过还是建议xml配置:

android:shareInterpolator="false"

版权声明:欢迎交流指正文章的错误,必定虚心接受,QQ872785786

  相关解决方案