动画效果

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/

更多相关文章

  1. view变化监听器ViewTreeObserver介绍
  2. android XML 画图
  3. android 放烟花效果
  4. Android从上到下抽屉式效果
  5. Android传感器之距离传感器
  6. TextSwitcher切换动画
  7. Android——点击水纹效果
  8. 监听电话
  9. android刮刮卡效果

随机推荐

  1. Android(安卓)Sync 同步 源码问题解决方
  2. Android(安卓)Studio真机调试无法找到设
  3. Android(安卓)studio 生成 lib.so
  4. android UI小结(四)
  5. Android(安卓)计算ImageView的大小
  6. 做WebView的时候遇到的错误
  7. Android(安卓)PopupWindow GridView onIt
  8. android 移动图片
  9. Android关于buildToolVersion与CompileSd
  10. 分析通话记录信息是通过什么写入的 andro