andorid animation

13 篇文章 0 订阅
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;
}
}
}

完整的实例代码在压缩包中!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值