2015-01-05 5 views
0

다른 이미지의 위치를 ​​기반으로 ImageView의 위치를 ​​변경하는 방법을 만들었습니다.안드로이드 - 메서드가 반복적으로 실행되지 않습니다.

public void move(double zx, double zy) { 

    RelativeLayout.LayoutParams params = 
      new RelativeLayout.LayoutParams(80,80); 

    // the imageView s was initialized in the onCreate() 


    System.out.println("working"); 


    if (zx < s.getLeft()) { 
     if (s.getLeft() - zx > 0) { 
      params.leftMargin = s.getLeft() -1; 
     } else 
      params.leftMargin = s.getLeft() +1; 
    } 
    if (zx > s.getLeft()) { 
     if (s.getLeft() - zx > 0) { 
      params.leftMargin = s.getLeft() -1; 
     } else 
      params.leftMargin = s.getLeft() +1; 
    } 
    if (zy > s.getTop()) { 
     if (s.getTop() - zy > 0) { 
      params.topMargin = s.getTop() -1; 
     } else 
      params.topMargin = s.getTop() + 1; 
    } 
    if (zy < (int)s.getY()) { 
     if ((int)s.getY() - zy > 0) { 
      params.topMargin = s.getTop() -1; 
     } else 
      params.topMargin = s.getTop() + 1; 
    } 

    s.setLayoutParams(params); 
} 

그럼 난 오직 한번의에서 onCreate()

protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_fase); 

    s = (ImageView)findViewById(R.id.s); 
    box = (ImageView)findViewById(R.id.box); 

    move(box.getLeft(),box.getTop()); 

    } 

메시지 "작업"인쇄 된 호출. 이미지 뷰의 위치도 바뀌지 않았습니다. 나의 결론은이 방법이 반복적으로 실행되지 않았다는 것이다. 그렇지 않으면, imageView의 위치가 매번 바뀌고 "작동 중"이라는 메시지가 매 순간 나타납니다. 어떻게 해결할 수 있습니까? 다른 클래스의 메서드를 호출해야합니까? 나는 timertask에서 호출하려고 시도하고 매 시간마다 timertask를 실행하려고 시도했지만, 그 응용 프로그램은 막 중단되었습니다. (한 OnCreate 내부) 다른 이미지 뷰에 대한

드래그 명령 :

 box.setOnTouchListener(new View.OnTouchListener() { 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      LayoutParams layoutParams = (LayoutParams) box.getLayoutParams(); 

      switch(event.getAction()) 
      { 
       case MotionEvent.ACTION_DOWN: 
        break; 
       case MotionEvent.ACTION_MOVE: 
        System.out.println(box.getLeft()); 
        int x_cord = (int)event.getRawX(); 
        int y_cord = (int)event.getRawY(); 

        if(x_cord>windowwidth){x_cord=windowwidth;} 
        if(y_cord>windowheight){y_cord=windowheight;} 

        layoutParams.leftMargin = x_cord - 250; 
        layoutParams.topMargin = y_cord - 300; 

        box.setLayoutParams(layoutParams); 
        break; 
       default: 
        break; 
      } 
      return true; 
     } 
    }); 
+1

왜이 방법을 반복적으로 호출 할 것으로 생각합니까? – njzk2

답변

0

첫째, 당신은 onCreate가 호출 될 때 한 번 이상 당신의 방법은 move 더 실행하는 프로그램을 말한 적이 없어요. 두 번째 timertask each milisecond ..이 방법을 많이 실행하는 것입니다 move 초마다 1000 번 ... 그리고 세 번째 timertask을 사용하여 많은 문제로 이어질 수 있습니다, 예를 들어 handler 대신 사용할 수 있습니다.

이것을 살펴보면 handler for repeating Tasks을 구현하는 방법을 보여줍니다!

+0

나는 핸들러와 함께 작업했지만 결과는 예상치 못했습니다. imageView가 움직 였지만 다른 이미지 뷰를 드래그하는 동안에 만 움직였습니다! 테스트를 위해 runniable에 "params.topMargin ++"을 썼습니다. 처음에는 imageView가 움직이지 않았지만 다른 ImageView를 끌기 시작했을 때 작동하기 시작했습니다! 드래그를 멈 추면 다른 이미지 뷰도 움직이지 않았습니다. 질문에 끌기 명령을 추가 할 것입니다. – Danilo

관련 문제