Android:移动ImageView以更新线程中的值

时间:2016-09-22 04:11:33

标签: java android multithreading

我正在尝试使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,请询问。提前谢谢!

2 个答案:

答案 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次。