代码如下,还望高手指点。package com.animation;import android.app.Activity;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.drawable.AnimationDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.KeyEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.AbsoluteLayout;
import android.widget.AbsoluteLayout.LayoutParams;
import android.widget.ImageView;public class MainActivity extends Activity{

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        requestWindowFeature(Window.FEATURE_NO_TITLE);//隐藏标题  
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);//设置全屏  
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);  //设置横屏。

        //动画加载和控制类的实例。
        ma = new Ma(this);
        //绝对布局实例。
        ablt = ma.ablt;
        setContentView(ablt);
        
        //启动新线程。
        mt = new MinorThread(this);
        new Thread(mt).start();
        
        //为启动整个程序逻辑,需等新线程的handler初始化结束,然后发信息给新线程。
        while(true){
         if(mt.getmHandler()==null) continue;
         else{
         Message msg = new Message();
            mt.getmHandler().sendMessage(msg);
            break;
         }
        }
    }

    
    Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
//控制动画显示位置。
ma.control();
//发信息给新线程。
Message msg1 = new Message();
mt.getmHandler().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() {
//为子线程初始化一个handler。
Looper.prepare();
mHandler = new Handler(){
@Override
public void handleMessage(Message msg){
//发信息给主线程。
Message msg2 = new Message();
mainActivity.handler.sendMessage(msg2);
   
//延时3000毫秒。
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
Looper.loop();
}
   
public MinorThread(MainActivity mainAcitivy){
this.mainActivity = mainAcitivy;
}
   
private MainActivity mainActivity = null;
private Handler mHandler = null;
   
public Handler getmHandler() {
return mHandler;
}
}class Ma{


public Ma(MainActivity context){

this.context = context;
ablt = new AbsoluteLayout(context);
TestView v = new TestView(context);
//向绝对布局对象中加入对象v做背景。
        AbsoluteLayout.LayoutParams lp = new LayoutParams(480,320,0,0);
        ablt.addView(v, lp);
        
        //创建两个动画。
Drawable d = null;
        for(int i=0;i<2;i++){
         ad = new AnimationDrawable();
        d = context.getResources().getDrawable(R.drawable.a1);
        ad.addFrame(d, 100); d = context.getResources().getDrawable(R.drawable.a2);
        ad.addFrame(d, 100); d = context.getResources().getDrawable(R.drawable.a3);
        ad.addFrame(d, 100); 
        ad.setOneShot(false);
        
        v1 = new ImageView(context);
        v1.setImageDrawable(ad);
        
        //给动画设定一个标签,便于从绝对布局对象中精确查找。
        String tag = "test"+i;
        v1.setTag(tag);
        
        //设定动画的位置。
        ablt.addView(v1, new LayoutParams(100, 40, 20, i*20));
        }
}

boolean A = false;
int count = 0;
    public void control(){

     if(!A){ //若是第一次运行control(),则显示第一个动画,否则显示第二个动画。
     //问题就出在这里了,第一个动画不能正常切换图片,第二个却可以。
     //当有多个动画时,也是第一次要显示的动画不能切换图片,而第一次之后调用显示的动画却可以。
     A = true;
    
     //显示第一个动画。
     for(count = 0;count<1;count++){
     //从绝对布局对象中找到第一个动画所在的ImageView对象。
     v1 = (ImageView) ablt.findViewWithTag("test"+count);     //若动画没有完全超出屏幕,则继续移动动画。
     if(x<480&&y<320){
     System.out.println(x+":"+y);
     x+=10;
     y+=5;
     v1.layout(x, y, x+100, y+40);
     AnimationDrawable ad = (AnimationDrawable)v1.getDrawable();
     ad.start();
     }
     }     }else{
     for(count = 1;count<2;count++){
     v1 = (ImageView) ablt.findViewWithTag("test"+count);     if(x<480&&y<320){
     System.out.println(x+":"+y);
     x+=10;
     y+=5;
     v1.layout(x, y, x+100, y+40);
     AnimationDrawable ad = (AnimationDrawable)v1.getDrawable();
     ad.start();
     }
     }
     }    }    private MainActivity context;
    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();
}

解决方案 »

  1.   

    拷贝拷贝拷贝到eclipse中去...
      

  2.   

    改成这样动画的太快了 需要延时一下再start();        //为启动整个程序逻辑,需等新线程的handler初始化结束,然后发信息给新线程。
            while(true){
                if(mt.getmHandler()==null) continue;
                else{
                     mt.getmHandler().sendEmptyMessageDelayed(0, 100);                break;            
              }
            }
      

  3.   


    fontlose,谢谢你能这么快来这里帮助我。你说的这个办法不能让第一个动画动起来,希望你能把代码运行一下试一试,看是不是其他问题。
      

  4.   

    我试过了我这里可以  两个动画显示  试试100设长点    @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            
            requestWindowFeature(Window.FEATURE_NO_TITLE);//隐藏标题  
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);//设置全屏  
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);  //设置横屏。
            
            //动画加载和控制类的实例。
            ma = new Ma(this);
            //绝对布局实例。
            ablt = ma.ablt;        
            setContentView(ablt);
            
            //启动新线程。
            mt = new MinorThread(this);
            new Thread(mt).start();
            
            //为启动整个程序逻辑,需等新线程的handler初始化结束,然后发信息给新线程。
            while(true){
                if(mt.getmHandler()==null) continue;
                else{
                   // Message msg = new Message();
                    mt.getmHandler().sendEmptyMessageDelayed(0, 100);
                    break;
                }
            }
        }
      

  5.   

    呵呵,动画可以动了。不过,为什么要延时发信息呢?
    这涉及到的是Android的什么问题?
      

  6.   


    fontlose,在吗?谁知道这个问题的本质原因?
      

  7.   

    UPUPUP, 这个问题的本质有谁知道呢?