开发者

AnimationDrawable not change frames

I'm puzzled with the problem "AnimationDrawable not change frames" for some time.I'm confirmed I've added all the frames I need into the AnimationDrawable object,and I've called start(),and the result I called isRunning() is true,but the AnimationDrawable can't change the frame.

I called the start() in MainActivity's handler,not in onCreate() or onResume(),although the the called of start() is in the onResume() state.

Thanks for your thinkings.

----^_^ banlalaotou.

Added code which has the problem.

public class MainActivity extends Activity{

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ma = new Ma(this);
        ablt = ma.ablt;
        setContentView(ablt);

        mt = new MinorThread(this);
        new Thread(mt).start();

        while(true){
            if(mt.mHandler==null) continue;
            else{
                Message msg = new Message();
                mt.mHandler.sendMessage(msg);
                break;
            }
        }
    }

    Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            ma.control();
            Message msg1 = new Message();
            mt.mHandler.sendMessage(msg1);
        }
    };

    @Override
    public boolean onKeyDown(int keyCode,KeyEvent event){
        switch(keyCode){
        case KeyEvent.KEYCODE_BACK:
            System.exit(0);
        }
        return true;
    }

    private MinorThread mt = null;
    private ImageView v1 = null;
    private Ma ma = null;
    private int x = 0;
    private int y = 0;
    private int width = 0;
    p开发者_C百科rivate int height = 0;
    private AbsoluteLayout ablt = null;
}

    class MinorThread implements Runnable{

   @Override
    public void run() {

       Looper.prepare();
       mHandler = new Handler(){
           @Override
           public void handleMessage(Message msg){
               Message msg2 = new Message();
               mainActivity.handler.sendMessage(msg2);
               try {
                   Thread.sleep(3000);
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }
           }
       };
       Looper.loop();
   }

   public MinorThread(MainActivity mainAcitivy){
       this.mainActivity = mainAcitivy;
   }

   private MainActivity mainActivity = null;
   public Handler mHandler = null;
}

    class Ma{

public Ma(MainActivity context){

        ablt = new AbsoluteLayout(context);
        TestView v = new TestView(context);
        AbsoluteLayout.LayoutParams lp = new LayoutParams(480,320,0,0);
        ablt.addView(v, lp);
        Drawable d = null;


        ad = new AnimationDrawable();
        d = context.getResources().getDrawable(R.drawable.f1);
        ad.addFrame(d, 100); d = context.getResources().getDrawable(R.drawable.f2);
        ad.addFrame(d, 100); d = context.getResources().getDrawable(R.drawable.f3);
        ad.addFrame(d, 100); d = context.getResources().getDrawable(R.drawable.f4);
        ad.addFrame(d, 100); d = context.getResources().getDrawable(R.drawable.f5);
        ad.addFrame(d, 100); 

        v1 = new ImageView(context);
        v1.setImageDrawable(ad);

        String tag = "test";
        v1.setTag(tag);

        ablt.addView(v1, new LayoutParams(100, 40, 20, 20));
    }

    public void control(){

        v1 = (ImageView) ablt.findViewWithTag("test");
        if(x<480&&y<320){
            x+=10;
            y+=5;
            v1.layout(x, y, x+100, y+40);
            AnimationDrawable ad = (AnimationDrawable)v1.getDrawable();
            ad.start();
        }
    }

    public AbsoluteLayout ablt = null;
    private AnimationDrawable ad = null;
    private ImageView v1 = null;
    private int x = 0;
    private int y = 0;
    private int width = 0;
    private int height = 0;
}


    class TestView extends View{

    public TestView(Context context) {
        super(context);
    }

    @Override
    public void onDraw(Canvas canvas){
        paint.setColor(Color.WHITE);
        canvas.drawRect(0,0,480,320, paint);
    }

    private Paint paint = new Paint();
}

I'sorry for not uploaded the frames,because my reputation is less than 10. If you execute the code,you need to find some pictures to let the animation run.

thanks.

=============================

Now,I know how to let the result show,but I can't know the resaon.

The solution of the problem is that add a ImageView object into the layout object before show the all ImageView,and, "add a ImageView..." and "show the all ImageView" can't been processed in an function.The right method is like that "if(..){add a ImageView}else{show the all ImageView}".

Although,this method can resolve the problem I'd puzzeled,but why Android can't show the all ImageView's animations at first time?


Try to use start() in onWindowFocusChange(boolean focus) when focus is true.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜