AnimationDrawable不会更改帧

时间:2011-09-05 09:26:01

标签: android animation drawable

我很困惑“动画可以不改变帧”的问题已经有一段时间了。我确认我已经将所有需要的帧添加到AnimationDrawable对象中,并且我调用了start(),结果我调用isRunning()为true,但AnimationDrawable无法更改框架。

我在MainActivity的处理程序中调用了start(),而不是onCreate()或onResume(),尽管start()的调用处于onResume()状态。

感谢您的想法。

---- ^ _ ^ banlalaotou。

添加了有问题的代码。

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;
    private 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();
}

我没有上传相框,因为我的声誉不到10。 如果执行代码,则需要找到一些图片才能让动画运行。

感谢。

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

现在,我知道如何让结果显示,但我不知道这个结果。

问题的解决方案是在显示所有ImageView之前将一个ImageView对象添加到布局对象中,并且“添加一个ImageView ...”和“显示所有ImageView”无法处理一个函数。正确的方法就像“if(..){add a ImageView} else {show all ImageView}”。

虽然,这种方法可以解决我困惑的问题,但为什么Android无法在第一时间显示所有ImageView的动画?

1 个答案:

答案 0 :(得分:0)

当焦点为真时,尝试在start()中使用onWindowFocusChange(boolean focus)