【问题标题】:Android: Moving an ImageView from updating Values in a ThreadAndroid:从更新线程中的值移动 ImageView
【发布时间】:2016-09-22 04:11:32
【问题描述】:

我试图让 ImageView 导弹 1 在屏幕右边缘的随机 y 坐标处生成,然后在屏幕上向左移动直到它离开屏幕,最后将它移回随机 y - 在屏幕的右边缘坐标以无限循环重复该过程。每当重新启动活动时,我的代码都会在完全随机的 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);

        }
    }

}

可运行类:

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,请询问。提前致谢!

【问题讨论】:

    标签: java android multithreading


    【解决方案1】:

    听起来您正试图从 UI 线程更新 UI 线程。

    如果这是您想要的路线,我建议您查看“在 ui 线程上运行”操作。本质上,当您想更新布局位置时,您只需调用getContext().runOnUiThread([runnable]) 即可更新您的位置。请参阅此处了解更多信息:https://developer.android.com/training/multiple-threads/communicate-ui.html 一些需要牢记的事项:

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

    与其这样做,不如使用翻译动画:https://developer.android.com/reference/android/view/animation/TranslateAnimation.html

    您可以设置开始和结束的 x 和 y 坐标,甚至可以将它们用作屏幕宽度和长度的百分比,并将动画设置为无限重复。如果由于您想每次都选择新的 X(或 Y)值而导致无限重复不起作用,您可以在动画的末尾挂上一些东西来选择新的值并重新开始。

    【讨论】:

    • 关于翻译动画,是否可以在转换过程中检测到Imageview碰撞?我相信这是不可能的,所以我不能使用它。我将研究 runOnUiThread。谢谢。
    • 我认为在转换过程中检测图像视图冲突是绝对不可能的,但这应该不是问题。初始化转换动画时,您知道起点和终点(以及对象移动的速度)是什么。那时,路径是完全确定的——所以你可以提前确定它是否会发生。
    • 我的应用程序需要无法估计的实时玩家输入。
    • 不能翻译动画。
    • 是的,那么在这种情况下,当您真正有游戏状态更新时,我会尝试runOnUIThread。这样您就可以在 UI 线程之外执行所有逻辑,并根据需要更新线程上视图的位置。
    【解决方案2】:

    我自己通过大量试验结束错误找到了答案。我所做的是创建一个扩展表面视图的活动,向其中添加位图,在线程中更新图像坐标,最后将坐标传递给另一个线程,该线程每秒更新屏幕 30 次。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-18
      • 2023-04-06
      • 2019-12-19
      相关资源
      最近更新 更多