Android三种动画的基本实现总结

来源:互联网 发布:淘宝互刷安全么 编辑:程序博客网 时间:2024/06/07 13:46

编写不易,如有转载,请声明出处: 梦回河口:http://blog.csdn.net/zxc514257857/article/details/76036753

前言

  总的来说,Android动画可以分为两类,最初的传统动画和Android3.0 之后出现的属性动画(Property Animation);传动动画又分为两类,帧动画(Frame Animation)和补间动画(Tweened Animation)

Demo展示图片

布局代码

// (layout)activity_main.xml<RelativeLayout    xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent">    <ImageView        android:id="@+id/imageView"        android:layout_centerInParent="true"        android:layout_width="wrap_content"        android:layout_height="wrap_content"/></RelativeLayout>----------------------------------------------------------------------------------------// (menu)main.xml<menu xmlns:android="http://schemas.android.com/apk/res/android">    <item        android:id="@+id/frameAnimation"        android:showAsAction="never"        android:title="FrameAnim"/>    <item        android:id="@+id/tweenAnimation_alpha"        android:showAsAction="never"        android:title="TweenAnim_alpha"/>    <item        android:id="@+id/tweenAnimation_rotate"        android:showAsAction="never"        android:title="TweenAnim_rotate"/>    <item        android:id="@+id/tweenAnimation_set"        android:showAsAction="never"        android:title="TweenAnim_set"/>    <item        android:id="@+id/propertyAnimation"        android:showAsAction="never"        android:title="PropertyAnim"/></menu>----------------------------------------------------------------------------------------// (drawable)frame_anim.xml  帧动画的xml文件<animation-list xmlns:android="http://schemas.android.com/apk/res/android">    <item        android:drawable="@drawable/pic1"        android:duration="100"/>    <item        android:drawable="@drawable/pic2"        android:duration="100"/>    <item        android:drawable="@drawable/pic3"        android:duration="100"/>    <item        android:drawable="@drawable/pic4"        android:duration="100"/>    <item        android:drawable="@drawable/pic5"        android:duration="100"/>    <item        android:drawable="@drawable/pic6"        android:duration="100"/>    <item        android:drawable="@drawable/pic7"        android:duration="100"/>    <item        android:drawable="@drawable/pic8"        android:duration="100"/>    <item        android:drawable="@drawable/pic9"        android:duration="100"/>    <item        android:drawable="@drawable/pic10"        android:duration="100"/>    <item        android:drawable="@drawable/pic11"        android:duration="100"/>    <item        android:drawable="@drawable/pic12"        android:duration="100"/>    <item        android:drawable="@drawable/pic13"        android:duration="100"/>    <item        android:drawable="@drawable/pic14"        android:duration="100"/>    <item        android:drawable="@drawable/pic15"        android:duration="100"/></animation-list>----------------------------------------------------------------------------------------// (anim)anim_alpha.xml  补间动画的xml文件<alpha xmlns:android="http://schemas.android.com/apk/res/android"       android:fromAlpha="0.0"       android:toAlpha="1.0"       android:repeatCount="infinite"       android:repeatMode="reverse"       android:duration= "3000"       android:fillAfter= "true"/><!--android:fillAfter= "true" 动画结束后,是否保留这个动画的最后一帧效果--><!--android:repeatCount="infinite" 表示重复次数为无限重复--><!--android:repeatMode="reverse" 表示倒序回放-->----------------------------------------------------------------------------------------// (anim)anim_rotate.xml  补间动画的xml文件<rotate xmlns:android="http://schemas.android.com/apk/res/android"        android:duration="1000"        android:fillAfter="true"        android:fromDegrees="0"        android:pivotX="30%"        android:pivotY="70%"        android:repeatCount="infinite"        android:repeatMode="reverse"        android:toDegrees="120"        android:interpolator="@android:anim/overshoot_interpolator"/><!--pivotX 设置动画执行的参考位置   默认是以左上角为中心进行旋转--><!--设置android:pivotX="50%" android:pivotY="50%" 表示沿中心旋转--><!--android:interpolator 设置系统中提供的动画插值器-->

activity代码

import android.animation.AnimatorSet;import android.animation.ObjectAnimator;import android.content.Context;import android.graphics.drawable.AnimationDrawable;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.Menu;import android.view.MenuItem;import android.view.animation.AccelerateDecelerateInterpolator;import android.view.animation.Animation;import android.view.animation.AnimationSet;import android.view.animation.AnimationUtils;import android.view.animation.ScaleAnimation;import android.view.animation.TranslateAnimation;import android.widget.ImageView;public class MainActivity extends AppCompatActivity {    private Context mContext = MainActivity.this;    private ImageView mImageView;    private AnimatorSet mAnimSet;    private AnimationSet mAnimationSet;    private Animation mAnimationRotate;    private Animation mAnimationAlpha;    private AnimationDrawable mDrawable;    /**     * 1,属性动画是真正实现了View的移动,补间动画对View的移动只是在不同地方绘制了一个影子,实际的对象还是处于原来的地方     * 2,使用帧动画需要注意,不要使用过多大图,容易导致内存不足     * 3,xml文件实现的补间动画,复用率极高.在Activity切换,窗口弹出时等情景中有着很好的效果     * 4,把动画的repeatCount设置为无限循环,如果在Activity退出时没有及时将动画停止,属性动画会导致Activity无法释放而导致内存泄漏,     *   因此,使用属性动画时切记在Activity执行 onStop 方法时顺便将动画停止     */    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mImageView = (ImageView) findViewById(R.id.imageView);    }    @Override    public boolean onCreateOptionsMenu(Menu menu) {        getMenuInflater().inflate(R.menu.main , menu);        return true;    }    @Override    public boolean onOptionsItemSelected(MenuItem item) {        switch (item.getItemId()) {            // 帧动画(用xml方式定义)            case R.id.frameAnimation:                mImageView.setImageResource(R.drawable.frame_anim);                mDrawable = (AnimationDrawable) mImageView.getDrawable();                // 重复执行                mDrawable.setOneShot(false);                // 开始帧动画                mDrawable.start();                break;            // 单个补间动画(用xml方式定义)            case R.id.tweenAnimation_alpha:                // 4种形式: alpha(淡入淡出)translate(位移)scale(缩放大小)rotate(旋转)                mAnimationAlpha = AnimationUtils.loadAnimation(mContext, R.anim.anim_alpha);                mImageView.setImageResource(R.drawable.pic_1);                mImageView.startAnimation(mAnimationAlpha);                break;            // 单个补间动画(用xml方式定义)            // 用xml方式定义 方便代码复用            case R.id.tweenAnimation_rotate:                // 4种形式: alpha(淡入淡出)translate(位移)scale(缩放大小)rotate(旋转)                mAnimationRotate = AnimationUtils.loadAnimation(mContext, R.anim.anim_rotate);                mImageView.setImageResource(R.drawable.pic_1);                mImageView.startAnimation(mAnimationRotate);                break;            // 补间动画集合(用代码方式定义)            // 用代码方式定义 方便属性值的动态调整            case R.id.tweenAnimation_set:                mImageView.setImageResource(R.drawable.pic_1);                mAnimationSet = new AnimationSet(mContext , null);                ScaleAnimation scaleAnimation = new ScaleAnimation(1.0f, 0.5f, 1.0f, 0.5f);                scaleAnimation.setDuration(2000);                // 设置动画插值器 控制动画的快慢节奏                scaleAnimation.setInterpolator(new AccelerateDecelerateInterpolator());                scaleAnimation.setRepeatMode(Animation.REVERSE);                scaleAnimation.setRepeatCount(Animation.INFINITE);                TranslateAnimation translateAnimation = new TranslateAnimation(0f, 800f, 0f, 0f);                translateAnimation.setDuration(3000);                // 设置动画插值器 控制动画的快慢节奏                scaleAnimation.setInterpolator(new AccelerateDecelerateInterpolator());                translateAnimation.setRepeatMode(Animation.REVERSE);                translateAnimation.setRepeatCount(Animation.INFINITE);                mAnimationSet.addAnimation(scaleAnimation);                mAnimationSet.addAnimation(translateAnimation);                mImageView.startAnimation(mAnimationSet);                break;            case R.id.propertyAnimation:                mImageView.setImageResource(R.drawable.pic_1);                // 更改旋转中心点位置                mImageView.setPivotX(mImageView.getWidth() / 2);                mImageView.setPivotY(mImageView.getHeight());                // 沿(250 , 250)方向移动 旋转360度                ObjectAnimator objectAnimator1 = ObjectAnimator.ofFloat(mImageView, "translationY", 0.0f, 250.0f, 0.0f);                ObjectAnimator objectAnimator2 = ObjectAnimator.ofFloat(mImageView, "translationX", 0.0f, 250.0f, 0.0f);                ObjectAnimator objectAnimator3 = ObjectAnimator.ofFloat(mImageView, "rotationY", 0.0f, 360.0f);                objectAnimator1.setRepeatCount(ObjectAnimator.INFINITE);                objectAnimator1.setRepeatMode(ObjectAnimator.REVERSE);                objectAnimator2.setRepeatCount(ObjectAnimator.INFINITE);                objectAnimator2.setRepeatMode(ObjectAnimator.REVERSE);                objectAnimator3.setRepeatCount(ObjectAnimator.INFINITE);                objectAnimator3.setRepeatMode(ObjectAnimator.REVERSE);                // set 只设置播放方式,播放时间和开始播放 是否重复播放不受set控制                // 组合动画                mAnimSet = new AnimatorSet();                // 1 2先一同执行,3再执行(复杂动画需要分开一点点写)                mAnimSet.play(objectAnimator1).with(objectAnimator2);                mAnimSet.play(objectAnimator2).before(objectAnimator3);                // 同时执行                // animSet.playTogether(objectAnimator1 , objectAnimator2 , objectAnimator3);                // 依次执行                // animSet.playSequentially(objectAnimator1 , objectAnimator2 , objectAnimator3);                mAnimSet.setDuration(3000);                mAnimSet.setInterpolator(new AccelerateDecelerateInterpolator());                mAnimSet.start();                break;            default:                break;        }        return super.onOptionsItemSelected(item);    }    @Override    protected void onStop() {        super.onStop();        mImageView.clearAnimation();        mAnimSet.cancel();        mAnimationSet.cancel();        mAnimationRotate.cancel();        mAnimationAlpha.cancel();        mDrawable.stop();    }}

Demo下载请移步:http://download.csdn.net/detail/zxc514257857/9909089


———-因本人才疏学浅,如博客或Demo中有错误的地方请大家随意指出,与大家一起讨论,共同进步,谢谢!———-