Android 动画效果

动画效果

public class AnimationTestActivity extends Activity {
    private final String TAG = "xmp";
    private Button alphaBtn;
    private Button transBtn;
    private Button scaleBtn;
    private Button rotateBtn;
    private Button scaleRotateBtn;
    private Button frameBtn;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        initControls();
    }

    private void initControls() {
        alphaBtn = (Button) findViewById(R.id.alpha);
        transBtn = (Button) findViewById(R.id.translate);
        scaleBtn = (Button) findViewById(R.id.scale);
        rotateBtn = (Button) findViewById(R.id.rotate);
        scaleRotateBtn = (Button)findViewById(R.id.scale_rotate);
        frameBtn = (Button) findViewById(R.id.frame);

        alphaBtn.setOnClickListener(new BtnOnClickListener());
        transBtn.setOnClickListener(new BtnOnClickListener());
        scaleBtn.setOnClickListener(new BtnOnClickListener());
        rotateBtn.setOnClickListener(new BtnOnClickListener());
        scaleRotateBtn.setOnClickListener(new BtnOnClickListener());
        frameBtn.setOnClickListener(new BtnOnClickListener());
    }

    class BtnOnClickListener implements OnClickListener {
        @Override
        public void onClick(View v) {
            Log.v(TAG,"--------------->onClick");
            switch (v.getId()) {
                case R.id.alpha:
                    testAlphaEffect();
                    break;
                case R.id.translate:
                    testTransEffect();
                    break;
                case R.id.scale:
                    testScaleEffect();
                    break;
                case R.id.rotate:
                    testRotateEffect();
                    break;
                case R.id.scale_rotate:
                    testScaleRotateEffect();
                    break;
                case R.id.frame:
                    testFrameEffect();
                    break;
                default:
                    break;
            }
        }
    }

    private void testAlphaEffect() {
        Intent intent = new Intent("anim.test");
        intent.addCategory(Intent.CATEGORY_DEFAULT);
        intent.putExtra(TestEffectActivity.TYPE, TestEffectActivity.EFFECT_ALPHA);
        startActivity(intent);
        Log.v(TAG,"--------->testAlphaEffect");
    }
    private void testTransEffect() {
        Intent intent = new Intent("anim.test");
        intent.addCategory(Intent.CATEGORY_DEFAULT);
        intent.putExtra(TestEffectActivity.TYPE, TestEffectActivity.EFFECT_TRANS);
        startActivity(intent);
        Log.v(TAG,"--------->testTransEffect");
    }
    private void testScaleEffect() {
        Intent intent = new Intent("anim.test");
        intent.addCategory(Intent.CATEGORY_DEFAULT);
        intent.putExtra(TestEffectActivity.TYPE, TestEffectActivity.EFFECT_SCALE);
        startActivity(intent);
        Log.v(TAG,"--------->testTransEffect");
    }
    private void testRotateEffect() {
        Intent intent = new Intent("anim.test");
        intent.addCategory(Intent.CATEGORY_DEFAULT);
        intent.putExtra(TestEffectActivity.TYPE, TestEffectActivity.EFFECT_ROTATE);
        startActivity(intent);
        Log.v(TAG,"--------->testTransEffect");
    }
    private void testScaleRotateEffect(){
        Intent intent = new Intent("anim.test");
        intent.addCategory(Intent.CATEGORY_DEFAULT);
        intent.putExtra(TestEffectActivity.TYPE, TestEffectActivity.EFFECT_SCALE_ROTATE);
        startActivity(intent);
        Log.v(TAG,"--------->testTransEffect");
    }
    private void testFrameEffect(){
        Intent intent = new Intent("anim.test");
        intent.addCategory(Intent.CATEGORY_DEFAULT);
        intent.putExtra(TestEffectActivity.TYPE, TestEffectActivity.EFFECT_FRAME);
        startActivity(intent);
        Log.v(TAG,"--------->testFrameEffect");
    }
}
public class TestEffectActivity extends Activity {
    private final String TAG = "xmp";
    private Context mContext;
    private View effectView ;
    private TextView textWidget;
    public final static String TYPE = "type";
    public final static int EFFECT_ALPHA = 1;
    public final static int EFFECT_TRANS = 2;
    public final static int EFFECT_SCALE = 3;
    public final static int EFFECT_ROTATE = 4;
    public final static int EFFECT_SCALE_ROTATE = 5;
    public final static int EFFECT_FRAME = 6;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.test_effect);
        mContext = this;
    }
    @Override
    protected void onStart() {
        super.onStart();
        handleEffect();
    }

    private void handleEffect() {
        Intent intent = getIntent();
        int effectType = intent.getIntExtra(TYPE, 0);
        switch (effectType) {
        case EFFECT_ALPHA:
            handleAlphaEffect();
            break;
        case EFFECT_TRANS:
            handleTransEffect();
            break;
        case EFFECT_SCALE:
            handleScaleEffect();
            break;
        case EFFECT_ROTATE:
            handleRotateEffect();
            break;
        case EFFECT_SCALE_ROTATE:
            handleScaleRotateEffect();
            break;
        case EFFECT_FRAME:
            handleFrameEffect();
            break;
        default:
            break;
        }
    }
    private void exit(){
        finish();
    }

    /*
     * 监听是否播放状态
     */
    class EffectAnimationListener implements AnimationListener{
        @Override
        public void onAnimationEnd(Animation animation) {
            exit();
        }
        @Override
        public void onAnimationRepeat(Animation animation) {}
        @Override
        public void onAnimationStart(Animation animation) {}
    }
    private void handleAlphaEffect() {
        Animation anim = AnimationUtils.loadAnimation(mContext, R.anim.alpha);
        anim.setAnimationListener(new EffectAnimationListener());
        textWidget = (TextView)findViewById(R.id.text_widget);
        textWidget.setText(" 渐变透明度动画效果");
        textWidget.startAnimation(anim);
        Log.v(TAG,"--------------->handleAlphaEffect");
    }

    private void handleTransEffect() {
        Animation anim = AnimationUtils.loadAnimation(mContext, R.anim.trans);
        anim.setAnimationListener(new EffectAnimationListener());
        textWidget = (TextView)findViewById(R.id.text_widget);
        textWidget.setText(" 转换位置移动动画效果");
        textWidget.startAnimation(anim);
        Log.v(TAG,"--------------->handleTransEffect");
    }

    private void handleScaleEffect() {
        Animation anim = AnimationUtils.loadAnimation(mContext, R.anim.scale);
        anim.setAnimationListener(new EffectAnimationListener());
        textWidget = (TextView)findViewById(R.id.text_widget);
        textWidget.setText(" 渐变尺寸伸缩动画效果");
        textWidget.startAnimation(anim);
        Log.v(TAG,"--------------->handleTransEffect");
    }

    private void handleRotateEffect() {
        Animation anim = AnimationUtils.loadAnimation(mContext, R.anim.rotate);
        anim.setAnimationListener(new EffectAnimationListener());
        textWidget = (TextView)findViewById(R.id.text_widget);
        textWidget.setText(" 画面转移旋转动画效果");
        textWidget.startAnimation(anim);
        Log.v(TAG,"--------------->handleRotateEffect");
    }
    private void handleScaleRotateEffect(){
        Animation anim = AnimationUtils.loadAnimation(mContext, R.anim.scale_rotate);
        anim.setAnimationListener(new EffectAnimationListener());
        textWidget = (TextView)findViewById(R.id.text_widget);
        textWidget.setText(" 画面缩放旋转动画效果");
        textWidget.startAnimation(anim);
        Log.v(TAG,"--------------->handleRotateEffect");
    }

    /*
     * 监听是否播放状态
     */
    class FrameAnimationListener implements AnimationDrawableListener{
        @Override
        public void onAnimationEnd(AnimationDrawable animation) {
            exit();
        }
        @Override
        public void onAnimationStart(AnimationDrawable animation) {

        }
    }
    private void handleFrameEffect() {
        AnimationDrawable anim = (AnimationDrawable)getResources().
                getDrawable(R.drawable.frame);
        CustomAnimDrawable cusAnim = new CustomAnimDrawable(anim);
        cusAnim.setAnimationListener(new FrameAnimationListener());
        textWidget = (TextView)findViewById(R.id.text_widget);
        textWidget.setText(" 画面逐帧动画效果");
        textWidget.setBackgroundDrawable(anim);
        cusAnim.start();
        Log.v(TAG,"--------------->handleFrameEffect");
    }
}
public class CustomAnimDrawable extends AnimationDrawable {
    private final String TAG = "xmp";
    private AnimationDrawable mOriAnim;
    private AnimationDrawable mSelf;
    private Handler mHandler;
    private boolean mStarted;
    private AnimEndListenerRunnable mEndRunnable;
    private AnimationDrawableListener mListener;

    public CustomAnimDrawable(AnimationDrawable anim) {
        mOriAnim = anim;
        initialize();
    }

    private void initialize() {
        mSelf = this;
        mStarted = false;
        mHandler = new Handler();
        mEndRunnable = new AnimEndListenerRunnable();
        for (int i = 0; i < mOriAnim.getNumberOfFrames(); i++) {
            mSelf.addFrame(mOriAnim.getFrame(i), mOriAnim.getDuration(i));
        }
    }

    @Override
    public void start() {
        mOriAnim.start();
        mStarted = true;
        mHandler.post(mEndRunnable);
        if (mListener != null) {
            mListener.onAnimationStart(mSelf);
        }
        Log.v(TAG, "------CustomAnimDrawable------>start");
    }

    /**
     * 循环检测 动画的状态
     */
    class AnimEndListenerRunnable implements Runnable {
        @Override
        public void run() {
            // 动画已开始
            if (!mStarted) {
                return;
            }
            // 未停止继续监听
            if (!isEnd()) {
                //这里的延迟时间是跟你的每一帧动画时间有关,基本保持一致就可以,最后一帧也会完整播放
                //上面动画时间为每一帧1000ms,所以这里设为了1000ms
                mHandler.postDelayed(mEndRunnable,1000);
                return;
            }
            Log.v(TAG, "----------->over");
            // 动画已结束
            if (mListener != null) {
                mStarted = false;
                mListener.onAnimationEnd(mSelf);
            }
        }
    }
    /**
     * 判断动画是否结束 采用反射机制
     * @return
     */
    private boolean isEnd(){
        Class<AnimationDrawable> animClass = AnimationDrawable.class;
        try{
            //利用Java反射方法判断是否结束
            //获得私有方法  例如
            //Method method = animClass.getDeclaredMethod("nextFrame",boolean.class);

            //访问其私有变量
            Field field = animClass.getDeclaredField("mCurFrame");
            field.setAccessible(true);

            int currFrameNum = field.getInt(mOriAnim);
            int totalFrameNum = mOriAnim.getNumberOfFrames();
            if((currFrameNum == totalFrameNum - 1)||
               (currFrameNum == -1)){
                return true;
            }
        }
        catch (Exception e) {
            Log.v(TAG,"-------->Exception");
        }

        return false;
    }

    public void setAnimationListener(AnimationDrawableListener listener) {
        mListener = listener;
    }

    public interface AnimationDrawableListener {
        /**
         * Notifies the start of the animation
         * @param animation
         */
        public void onAnimationStart(AnimationDrawable animation);
        /**
         * Notifies the end of the animation
         * @param animation
         */
        public void onAnimationEnd(AnimationDrawable animation);
    }
}

Code见 https://github.com/huanyi0723/animationTest/

时间: 2024-10-15 05:30:23

Android 动画效果的相关文章

Android动画效果——1.帧动画2.补间动画3.跳转画面(三)

Android--动画效果1.帧动画2.补间动画3.跳转画面 插值器类 xml属性值 说明 LinearInterpolator @android:anim/linear_interpolatorr 动画以均匀的速度改变. AccelerateInterpolator @android:anim/accelerate_interpolator 在动画开始时改变速度较慢,然后开始加速. AccelerateDecelerateInterpolator @android:anim/accelerat

Android动画效果之Frame Animation(逐帧动画)(二)(

前言: 上一篇介绍了Android的Tween Animation(补间动画) Android动画效果之Tween Animation(补间动画),今天来总结下Android的另外一种动画Frame Animation(逐帧动画). Frame Animation(逐帧动画): 逐帧动画(Frame-by-frame Animations)从字面上理解就是一帧挨着一帧的播放图片,就像放电影一样.和补间动画一样可以通过xml实现也可以通过java代码实现.接下来借助目前项目中的一个开奖的动画来总结

200多种Android动画效果的强悍框架

admin 发布于2015-10-23 14:33 363/68015 [精品推荐]200多种Android动画效果的强悍框架,太全了,不看这个,再有动画的问题,不理你了^@^ 功能模块和技术方案 只看楼主 楼层直达 200多种Android动画效果的强悍框架,太全了 概要: Android近200多种动画效果集合框架源码,太全了,总有你需要的,木有你找不到的,相当强悍,非常棒的产品开发原型参考和学习资料 主要功能列表: 1)Splash动画 (中心打开式效果 ) 2)Flip折叠效果的集合(1

Android动画效果之初识Property Animation(属性动画)(三)

前言: 前面两篇介绍了Android的Tween Animation(补间动画) Android动画效果之Tween Animation(补间动画).Frame Animation(逐帧动画)Android动画效果之Frame Animation(逐帧动画)(二),其实总结前两个的根本目的就是为了学习今天的主角Property Animation(属性动画).其实在Android最早期只提供了前两种动画方式,在Android 3.0才引入了属性动画,谷歌为何要引入属性动画呢?今天我们来总结学习一

Android动画效果之Frame Animation(逐帧动画)

前言: 上一篇介绍了Android的Tween Animation(补间动画) Android动画效果之Tween Animation(补间动画),今天来总结下Android的另外一种动画Frame Animation(逐帧动画). 其他几种动画效果: Android动画效果之Tween Animation(补间动画) Android动画效果之Frame Animation(逐帧动画) Android动画效果之初识Property Animation(属性动画) Android动画效果之Prop

android动画效果演示

第一种:TranslateAnimation  动画效果演示: public void move(View view) { // 传统动画效果 TranslateAnimation animation=new TranslateAnimation(0, 500, 0, 0); // 时间 animation.setDuration(500); // 设置移动后的位置不恢复 animation.setFillAfter(true); ImageButton img=(ImageButton) fi

Android动画效果translate、scale、alpha、rotate详解

动画类型 Android的animation由四种类型组成 XML中 alpha 渐变透明度动画效果 scale 渐变尺寸伸缩动画效果 translate 画面转换位置移动动画效果 rotate 画面转移旋转动画效果 JavaCode中 AlphaAnimation 渐变透明度动画效果 ScaleAnimation 渐变尺寸伸缩动画效果 TranslateAnimation 画面转换位置移动动画效果 RotateAnimation 画面转移旋转动画效果 Android动画模式 Animation

Android动画效果之Tween Animation(补间动画)(一)

前言: 最近公司项目下个版本迭代里面设计了很多动画效果,在以往的项目中开发中也会经常用到动画,所以在公司下个版本迭代开始之前,抽空总结一下Android动画.今天主要总结Tween Animation(补间动画). Tween Animation(补间动画): Tween动画,通过对View的内容进行一系列的图形变换 (包括平移.缩放.旋转.改变透明度)来实现动画效果.动画效果的定义可以采用XML来做也可以采用编码来做. 动画类型 XML配置方式 Java代码实现方式 渐变透明度动画效果 <al

android动画效果(转载)

一.动画基本类型: 如下表所示,Android的动画由四种类型组成,即可在xml中定义,也可在代码中定义,如下所示: XML CODE 渐变透明度动画效果 alpha AlphaAnimation 渐变尺寸伸缩动画效果 scale ScaleAnimation 画面转换位置移动动画效果 translate TranslateAnimation 画面转移旋转动画效果 rotate RotateAnimation 二.如何在XML文件中定义动画 1.alpha <?xml version="1

Android动画效果translate、scale、alpha、rotate

动画类型 Android的animation由四种类型组成 XML中 alpha 渐变透明度动画效果 scale 渐变尺寸伸缩动画效果 translate 画面转换位置移动动画效果 rotate 画面转移旋转动画效果 JavaCode中 AlphaAnimation 渐变透明度动画效果 ScaleAnimation 渐变尺寸伸缩动画效果 TranslateAnimation 画面转换位置移动动画效果 RotateAnimation 画面转移旋转动画效果 Android动画模式 Animation