2017-09-13 3 views
0

X 축에 임의로 개체를 표시하는 응용 프로그램을 만들고 있지만 시작시 응용 프로그램이 어떻게 든 충돌합니다.X 축에서 임의의 위치에 개체 설정

DisplayMetrics을 사용할 때 작동하지만 전체 화면의 너비를 가져옵니다. 너비 레이아웃을 얻고 싶습니다. 그러나 시작에 응용 프로그램 충돌 나는 레이아웃 폭을 검색하고 임의의 위치

내가 전에 TIMER 시작이 레이아웃 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); 

    } 

을이 내 로그 캣입니다 : 사전에 어떤 도움

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

+0

를 연결합니다()? – Elinor

+0

@Elinor 미안 나는 그것을 잊어 버렸다. 정말 고맙습니다. haha –

답변

1

Android의 경우보기가 훨씬 늦은 시점에 그려집니다. 그 때까지 뷰 치수에 대한 모든 getter 메서드는 0을 반환합니다. 뷰를 값을 읽기 전에 화면에 그릴 때까지 기다려야합니다. 두 가지 방법

viewtreeobserver에 배치 청취자를 추가로 그것을 할 수

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

당신이 창고에 호출되는 포스트의 Runnable

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

레이아웃 리스너를 사용하고 레이아웃 리스너 내에서 타이머를 추가했습니다. 타이머가 실행되고 레이아웃 너비의 값이 검색되지 않았기 때문에 타이머가 문제를 일으켰습니다. 하하. 도와 주셔서 감사합니다! –

+0

참고 : frame.postDelayed() 메서드를 사용하여 타이머를 완전히 제거 할 수 있습니다 – Aalin

+0

다시 한 번 감사의 말 : D –

관련 문제