在x轴上设置对象随机位置

时间:2017-09-13 10:17:37

标签: android

我正在创建一个应用程序,它会在x轴上随机显示一个对象,但不知怎的,我的应用程序在启动时崩溃了。

当我使用 DisplayMetrics 时它会起作用,但它会获得整个屏幕的宽度。我想获得 LAYOUT 的宽度。但是当我尝试检索布局宽度并设置随机位置时,应用程序在启动时崩溃

我感觉 TIMER 在检索 LAYOUT WIDTH 之前就开始了。这就是崩溃的原因

这是代码:

  @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    frame = (RelativeLayout) findViewById(R.id.frame);

    screenWidth = frame.getWidth();

    r = new Random();

    timer.schedule(new TimerTask() {
        @Override
        public void run() {
            handler.post(new Runnable() {
                @Override
                public void run() {
                    goDown();
                }
            });
        }
    }, 0, 20);

//FUNCTIONS FOR IT TO GO DOWN
public void goDown() {
    //LAYOUT WIDTH
    frameWidth = screenWidth;   

    //DISPLAYING RANDOM X POSITION
    newXposition = r.nextInt(frameWidth);

    //SKULLS FUNCTIONS
    skullY += skullSpeed;
    if(skullY > frameHeight)
    {
        skullY = -100.0f;
        skullX = newXposition - skull.getWidth();
    }

    skull.setX(skullX);
    skull.setY(skullY);

  }

这是我的LOGCAT:

E/AndroidRuntime: FATAL EXCEPTION: main
              Process: com.example.gin.myapplication, PID: 8786
              java.lang.IllegalArgumentException: n <= 0: 0
                  at java.util.Random.nextInt(Random.java:182)
                  at com.example.gin.myapplication.MainActivity.goDown(MainActivity.java:91)
                  at com.example.gin.myapplication.MainActivity$1$1.run(MainActivity.java:74)

提前感谢您的帮助! :d

1 个答案:

答案 0 :(得分:1)

在Android中,视图会在稍后阶段绘制。在此之前,视图尺寸的任何getter方法都返回零。在读取其值之前,您需要等待在屏幕上绘制视图。 你可以用两种方式做到这一点

在viewtreeobserver中添加布局侦听器

frame.getViewTreeObserver().addOnGlobalLayoutListener(new 
ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            frame.getViewTreeObserver().removeOnGlobalLayoutListener(this);
            screenWidth = frame.getHeight(); //height is ready
        }
    });

附加Post Runnable

frame.post(new Runnable() {
        @Override
        public void run() {
            screenWidth = frame.getHeight(); //height is ready
        }
    });