`
eagle0824
  • 浏览: 227673 次
  • 性别: Icon_minigender_1
  • 来自: 镇江
社区版块
存档分类
最新评论

andorid animation

阅读更多
animation 在android 系统中,是一种帧动画,前段时间遇到一个问题就是,一个完整的动画分为两部分,前面一部分,只播放一次,而后面一部分要循环播放。
第一反应,是分两个动画来做,第一部分,播放完后(仅一次),再播放后面一部分,这样来做可能有个衔接问题(没试过,有兴趣的朋友可以试一下)
后来,还是采用一个动画来做。这其中用到了java中的反射,取得了DrawableAnimation中的私有成员变量mCurFrame来记录当前帧。
具体代码,大家可以参考如下:
(1)自定义一个ImageView
package com.archermin.animationtest;


import android.content.Context;
import android.graphics.Canvas;
import android.graphics.drawable.AnimationDrawable;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.ImageView;


import java.lang.reflect.Field;

public class MyAnimationImageView extends ImageView {

    public AnimationDrawable mAnimationDrawable;
    public Field field;

    public MyAnimationImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
    }

    @Override
    protected void onDraw(Canvas canvas) {
        // TODO Auto-generated method stub
        super.onDraw(canvas);
        try{
            field = AnimationDrawable.class.getDeclaredField("mCurFrame");
            field.setAccessible(true);
            int curFrame = field.getInt(mAnimationDrawable);
            Log.d("anim", "curFrame is : "  + curFrame);
            if(curFrame == 17){
                field.setInt(mAnimationDrawable, 6);
                Log.d("anim","set current animation is 6");
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }

}


主界面代码如下:
package com.archermin.animationtest;


import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.AnimationDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;

public class AnimationTest extends Activity implements OnClickListener {
    /** Called when the activity is first created. */
    private Context mContext;
    private AnimationDrawable mDownloadImageAnim;
    public static final String TAG = "AnimationTest";
    private Button btStart;
    private Button btStop;
    private Handler mHandler;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mContext = this;
        btStart = (Button)findViewById(R.id.bt_start);
        btStart.setOnClickListener(this);
        btStop = (Button)findViewById(R.id.bt_stop);
        btStop.setOnClickListener(this);
        mDownloadImageAnim = (AnimationDrawable)mContext.getResources().getDrawable(R.anim.download_dialog_animation);
        MyAnimationImageView imageView = (MyAnimationImageView)findViewById(R.id.download_image);
        imageView.setBackgroundDrawable(mDownloadImageAnim);
        imageView.mAnimationDrawable = mDownloadImageAnim;
        mHandler = new Handler();
    }

    @Override
    protected void onResume() {
        // TODO Auto-generated method stub
        super.onResume();
        mHandler.postDelayed(new StartAnimationRunnable(),500);
    }

    private class StartAnimationRunnable implements Runnable{
        @Override
        public void run() {
            // TODO Auto-generated method stub
            startAnimation();
        }
    }

    private class StopAnimationRunnable implements Runnable{
        @Override
        public void run() {

            stopAnimation();
        }
    }

    private void startAnimation(){
        if(mDownloadImageAnim != null){
            mDownloadImageAnim.stop();
            Log.d(TAG, "start animation ");
            mDownloadImageAnim.start();
        }
    }

    private void stopAnimation(){
        if(mDownloadImageAnim != null){
            Log.d(TAG, "stop animation ");
            mDownloadImageAnim.stop();
        }
    }

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        switch (v.getId()) {
            case R.id.bt_start:
                startAnimation();
                break;
            case R.id.bt_stop:
                stopAnimation();
                break;
            default:
                break;
        }
    }
}

完整的实例代码在压缩包中!
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics