2013-02-04 40 views
0

我想作一个动画,我有一个球的10张图像,我想做的事:动画,延缓

  1. Image1可见,所有其他图像隐藏
  2. Image2可见的所有其他图像隐藏
  3. ...
  4. Image10可见的所有其他图像隐藏

应我在一个动画(如何?)中做到这一点,或者我应该创建一个java方法showImage(String pathimage),它将显示位于pathimage的图像并隐藏其他图像?我可以把时间延迟的任何想法用

handler.postDelayed(new Runnable() { 
    public void run() { } 
} 

编辑,这里是我的代码 的问题是,运行()总是在什么似乎是一个无限循环调用。但我看不出哪里是我的错误

GAMEACTIVITY

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
..... 
     ImageView image2 = (ImageView) findViewById(R.id.imageView3); 
     image2.setOnTouchListener(new OnTouchListener(){ 

      @Override 
      public boolean onTouch(View arg0, MotionEvent arg1) { 
       myAsyncRunnable mar = new myAsyncRunnable(GameActivity.this); 
       mar.execute(null); 
       PhotoTask photoTask = new PhotoTask(camera,surfaceCamera,isPreview,holder,GameActivity.this); 
       photoTask.execute(null); 
       Log.w("GAMEACTIVITY","PHOTOTASK"); 
       return false; 
      } 

     }); 
} 

我的异步任务

public class myAsyncRunnable extends AsyncTask<Void, Boolean, Void> { 

    GameActivity gameactivity; 

    @Override 
    protected Void doInBackground(Void... params) { 
     pull(); 
     return null; 
    } 

public myAsyncRunnable(GameActivity gameactivity) { 
    super(); 
    this.gameactivity = gameactivity; 
} 


    public void pull() { 

     final ImageView image3 = (ImageView) gameactivity.findViewById(R.id.imageView3); 
     final int drawables[] = new int[] {R.drawable.pull2,R.drawable.pull3,R.drawable.pull4,R.drawable.pull5,R.drawable.pull6,R.drawable.pull7}; 
     Runnable runnable = new Runnable() { 

      @Override 
      public void run() { 
       for (int i=0;i<drawables.length;i++) { 
        image3.setImageResource(drawables[i]); 
        gameactivity.handler.postDelayed(this, 500); 
        Log.w("asyncrunnable","run"+i); 
       } 

      } 

     }; 
     gameactivity.handler.post(runnable); 
    } 
} 

回答

1

你不应该创建10个ImageViews做这样的动画。

只有一个ImageView应该足够了!每x毫秒左右使用一个处理程序来更新图像,使用任何味道setImage

的整数初始化数组中的图像和当前图像:

int drawables[] = new int[] {R.drawable.image1, R.drawable.image2, ...}; 
int mCurrent = 0; 

然后初始化更新:

Runnable runnable = new Runnable() { 

    @Override 
    public void run() { 
       if(mCurrent>=drawables.length)mCurrent=0; 
       imageView.setImageResource(drawables[mCurrent]); 
       mHandler.postDelayed(this, 3000); //every 3 seconds 
    } 
}; 

最后,当你想创业,只是后可运行:

mHandler.post(runnable); 

你的代码是错误的:

试试这个拉动作用(虽然我真的不批准整个代码风格,但没有时间去修复)

public void pull() { 

    final ImageView image3 = (ImageView) gameactivity.findViewById(R.id.imageView3); 
    final int drawables[] = new int[] {R.drawable.pull2,R.drawable.pull3,R.drawable.pull4,R.drawable.pull5,R.drawable.pull6,R.drawable.pull7}; 
      for (int i=0;i<drawables.length;i++) { 
       final int j = i; 
    Runnable runnable = new Runnable() { 

     @Override 
     public void run() { 
       image3.setImageResource(drawables[j]); 

     } 

    }; 
       gameactivity.handler.postDelayed(this, 500 * i); 
       Log.w("asyncrunnable","run"+i); 
      } 
} 

}

+0

那你知道我是怎么可能会做一个循环? 因为\t \t image3.setImageResource(R.drawable.pathimagei)当然不起作用,因为pathimagei不是可绘制的,但它指的字符串是.. – morg

+0

好的,谢谢,现在我有一个问题,因为我认为这太慢了在主UI线程中执行。我有可运行的扩展AsyncTask吗? – morg

+0

太慢?这是最低限度的工作。你只是设置图像。如果你想使用asynctask,你可能会在后台加载位图,然后将其设置在onPostExecute中。但是因为你的图片在res /那么你不会获得那么多(它应该已经很快) –