我正在尝试使ImageView导弹1在屏幕右边缘的随机y坐标上生成,然后将其向左移动到屏幕上,直到它离开屏幕,最后将其移回到随机y -coordinate在屏幕的右边缘,以无限循环重复该过程。每当重新启动活动时,我已经在完全随机的x和y坐标位置生成图像,但它不会移动。任何人都可以理解为什么它不会移动并解决我的问题?一些示例代码将不胜感激。
生成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 :(得分: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)值而无限重复工作,你可以在动画结束时勾选一些内容来选择新值并重新启动。
答案 1 :(得分:0)
我通过大量的试验结束错误找到了答案。我做的是创建一个活动,扩展表面视图,向其添加位图,更新线程中的图像坐标,最后将坐标传递到另一个线程,每秒更新屏幕30次。