2016-09-22 30 views
0

我想让ImageView导弹1在屏幕右边缘的随机y坐标处产生,然后将它左移到屏幕上直到它离开屏幕,最后将其移回屏幕右边缘的随机y坐标,以无限循环重复该过程。代码我生成的图像在一个完全随机的x和y坐标位置,每当活动重新启动,但它不会移动。任何人都可以明白为什么它不动并为我的问题提供解决方案?一些示例代码将不胜感激。Android:移动ImageView以更新线程中的值

产生的X线程和y坐标值:

public class Missiles extends Thread { 

    private int height, width, currentscore; 
    private ImageView missile1, missile2, missile3, missile4, missile5; 
    Handler updatemissile = new Handler(); 
    int min = 100; 
    RelativeLayout layout; 
    int setx1, sety1, setx2, sety2, setx3, sety3, setx4, sety4, setx5, sety5; 
    private Random rand = new Random(); 


    TextView x, y; 


    Missiles(int screenheight, int screenwidth, ImageView missile01, ImageView missile02, ImageView missile03, 
      ImageView missile04, ImageView missile05, RelativeLayout rl, TextView xtext, TextView ytext) { 

     missile1 = missile01; 
     missile2 = missile02; 
     missile3 = missile03; 
     missile4 = missile04; 
     missile5 = missile05; 

     height = screenheight; 
     width = screenwidth; 
     layout = rl; 

     x = xtext; 
     y = ytext; 

    } 

    public void updatevalue(int value) { 

     currentscore = value; 
    } 


    public void run() { 

     SetMissilePosition position = new SetMissilePosition(missile1, layout, x, y); 
     updatemissile.post(position); 

     //width is the width of the screen as height is the height of the screen 
     while (true) { 
      setx1 = width; 
      position.updateX(setx1); 

      int randomNum = rand.nextInt((height - min) + 1) + min; 

      sety1 = randomNum; 
      position.updateY(sety1); 

      while (setx1 > -50) { 
       setx1 = setx1 - 1; 
       position.updateX(setx1); 
      } 

      setx1 = width; 
      position.updateX(setx1); 

     } 
    } 

} 

了Runnable类:

public class SetMissilePosition implements Runnable{ 

    int x1,y1, updateindicator; 
    ImageView missile1; 
    RelativeLayout layout; 

    TextView x,y; 

    SetMissilePosition(ImageView missile01, RelativeLayout relativeLayout, TextView xtext, TextView ytext) { 
     missile1 = missile01; 
     layout = relativeLayout; 
     x = xtext; 
     y = ytext; 

    } 

    public void updateX(int setx1) { 
     x1 = setx1; 
     updateindicator = 1; 

    } 

    public void updateY(int sety1) { 
     y1 = sety1; 
     updateindicator = 1; 
    } 

    public void run() { 

     missile1.setImageResource(R.drawable.missileanim); 
     layout.addView(missile1); 

     if(updateindicator == 1) { 
      missile1.setX(x1); 
      missile1.setY(y1); 
      x.setText(Integer.toString(x1)); 
      y.setText(Integer.toString(y1)); 
      updateindicator = 0; 
     } 
    } 
} 

如果我以任何方式不清晰,或者您需要更多的代码,比如我的MainActivity,请问。提前致谢!

回答

0

我通过大量的试验结束错误发现了答案。我所做的是创建了一个扩展表面视图的活动,为它添加了一个位图,更新了线程中的图像坐标,并最终将坐标传递到另一个线程,每秒更新一次屏幕30次。

0

这听起来像你试图从UI线程更新UI线程。

如果这是你想要去的路线,我鼓励你看看'在UI线程上运行'的操作。基本上,当你想更新布局位置时,你可以拨打getContext().runOnUiThread([runnable]),这将更新你的位置。请参阅此处了解更多信息:https://developer.android.com/training/multiple-threads/communicate-ui.html需要注意的一些事项:

Android以60fps运行,因此您需要确保每16ms更新一次以便与帧速率保持同步。否则你的速度将会关闭。

而是这样做的,为什么不使用翻译动画:https://developer.android.com/reference/android/view/animation/TranslateAnimation.html

您可以设置开始和结束X和Y坐标,你甚至可以把它们作为屏幕宽度和长度的比例,并设置动画重复无限地。如果无限重复将无法工作,因为您想每次都选择新的X(或Y)值,则可以在动画的末尾勾选某些内容以选取新值并重新启动。

+0

关于翻译动画,是否有可能在转换过程中检测Imageview碰撞?我相信这是不可能的,所以我不能使用它。我会研究runOnUiThread。谢谢。 – DavidPrabhu

+0

我不认为在转换过程中严格检测imageview碰撞是可能的,但这不应该是个问题。当你初始化变形动画时,你知道起点和终点(以及移动物体的速度)是什么。那时,路径完全是确定性的 - 所以你可以确定它是否会提前发生。 – Eric

+0

我的应用程序需要实时玩家输入,无法估计。 – DavidPrabhu