2014-03-24 4 views
0

화면에서 이미지를 이동하고 싶지만 제대로 할 수는 있지만 제대로는 할 수 없습니다. 이미지는 아래로 잘 내려 가고 일단 스크린의 아래쪽으로 이동하면 다른 방향으로 위로 올라 가기를 원합니다.화면에서 이미지를 이동하는 방법?

다음은 내가 시도한 것입니다. 아래의 코드에서 margenMaXX 화면의 폭 및 margenmaxy 화면 높이

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     // setContentView(R.layout.activity_main); 
Thread myThread = new Thread(new UpdateThread()); 
     myThread.start(); 

public class UpdateThread implements Runnable { 

      @Override 
      public void run() { 
       //... code to manipulate position 
       while (i<margenMaxX){ 
        if(j<margenmaxy) { 
        try { 
         runOnUiThread(new Runnable() { 

          @Override 
          public void run() { 
           /*mDrawable.setBounds(i, j ,i+ width, i+ height); 
           mDrawable.draw(cc); 
           invalidate();*/ 
          } 
         }); 
         Thread.sleep(200); 
         i=i+10; 
         j=j+10; 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
       }else if(j>=margenmaxy-height){ 
        try { 
         runOnUiThread(new Runnable() { 

          @Override 
          public void run() { 
           /*mDrawable.setBounds(i, j ,i+ width, i+ height); 
           mDrawable.draw(cc); 
           invalidate();*/ 
          } 
         }); 
         Thread.sleep(200); 
         i=i-10; 
         j=j-10; 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
       } 
       }    
       } 
      } 

public class AnimatedView extends ImageView { 



     public AnimatedView(Context context) { 
      super(context); 
      // TODO Auto-generated constructor stub 


      mDrawable = new ShapeDrawable(new OvalShape()); 
      mDrawable.getPaint().setColor(0xffffAC23); 


     } 
     protected void onDraw(final Canvas cc) { 
      final Context context = null; 

      mDrawable.setBounds(i, j ,i+ width, i+ height); 
      mDrawable.draw(cc); 
      invalidate(); 
        } 
    } 

업데이트 1 :

이 코드를 사용하여, 공 위쪽과 타측 예정이 명중 후 바닥. 이제 나는 공이 올바른 경계선에 도달했을 때 공이 돌아 오기를 원합니다. 나는 그것을 코딩했으나 돌아 오지 않는다. 최종 목표는 볼을 왼쪽이나 오른쪽에서 가져와야하는 게임을 개발하는 것입니다. 그것은 땅에 부딪쳐 반대 방향으로 들어가 벽을 치고 돌아와야합니다. 게임이 진행되는 동안 볼은 반드시이 작업을 수행해야합니다.

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    // setContentView(R.layout.activity_main); 
    Thread myThread = new Thread(new UpdateThread()); 
     myThread.start(); 

    public class UpdateThread implements Runnable { 
    boolean mMoveDown=false; 
    boolean mMoveUp = false; 
     @Override 
     public void run() { 
      while(!mMoveUp) { 
       // Move the image down and right. 
       try { 
        runOnUiThread(new Runnable() { 

         @Override 
         public void run() { 

         } 
        }); 
        Thread.sleep(200); 
        i=i+10; 
        j=j+10; 

       // Try posting a runnable to the UI thread to update the view. 


       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       }if(j >= margenmaxy) 
       { 
        // Change to moving up phase. 
        mMoveUp = true; 
       } 

      } 

      while(mMoveUp){ 
       try { 

       runOnUiThread(new Runnable() { 

        @Override 
        public void run() { 

        } 
       }); 
       Thread.sleep(200); 
       i=i + 10; 
       j=j - 10; 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } if(i >= margenMaxX) 
       { 
        // Change to moving up phase. 
        mMoveDown = true; 
       } 
     }while(mMoveDown){ 
      try { 

       runOnUiThread(new Runnable() { 

        @Override 
        public void run() { 

        } 
       }); 
       Thread.sleep(200); 
       i=i - 10; 
       j=j + 10; 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 

     } 
} 

public class AnimatedView extends ImageView { 



     public AnimatedView(Context context) { 
      super(context); 
      // TODO Auto-generated constructor stub 


      mDrawable = new ShapeDrawable(new OvalShape()); 
      mDrawable.getPaint().setColor(0xffffAC23); 


     } 
     protected void onDraw(final Canvas cc) { 
      final Context context = null; 

      mDrawable.setBounds(i, j ,i+ width, j+ height); 
      mDrawable.draw(cc); 
      invalidate(); 
     } 
} 
+0

안녕하세요, y 방향 반전이 발생하기 전에 화면에서 x 방향으로 화면이 벗어날 수 있습니다. 또한, (j> = marginenmaxy - height)는 (j batbrat

+0

@batbrat 안녕하세요, 공이 화면에서 벗어나지 않고 위쪽에서 아래쪽으로 향하고 있지만 아래쪽 위치에 도달하면 다른 방향으로 올라 가야합니다. –

+0

화면에서 꺼질 때까지 계속 움직여야합니까? 이미지의 아래쪽이 화면 하단에 닿으면 움직이지 않습니다 ...? – batbrat

답변

0

이 코드에는 겹치는 두 개의 조건문이 있습니다. 그러나 두 번째 것은 첫 번째 오류가 발생하는 경우에만 검사됩니다. 두 번째 조건은 다음 margenmaxy 및 높이가 모두 양수이기 때문 자동 (j < margenmaxy) 을 의미

(j >= margenmaxy - height) 

. 다음과 같은 조건을 확인할 때 :

if(j<margenmaxy) { 
    // Do downward animation. 

} else if(j>=margenmaxy-height){ 
    // Do upward animation. 
} 

이미지가 아래로 이동하는 단계에서 예상되는 결과가 발생합니다. 그러나 이미지를 위로 이동 시키면 (j < margenmaxy) 조건이 다시 충족되고 코드가 이미지를 아래로 이동하려고 시도합니다. 당신이 그것을 내리는 순간, 첫 번째 조건은 더 이상 유효하지 않습니다. 루프 안에이 구조가 있으므로 "튀는"동작이 발생합니다.

이 문제를 해결하려면 논리를 변경해야합니다. 이렇게하는 간단한 방법은 부울이 애니메이션의 상태를 유지하도록하는 것입니다. 이 상태 변수는 이미지가 화면의 하단에 부딪쳤는 지의 여부에 따라 변경됩니다.

public class UpdateThread implements Runnable { 

    // Variable to store the animation state. 
    boolean mMoveUp = false; 
    @Override 
    public void run() { 

     //... code to manipulate position 
     while (i<margenMaxX) { 
      // IF the animation is in the moving down phase 
      if(!mMoveUp) { 
       // Move the image down and right. 
       i += 10; 
       j += 10; 

       // Try posting a runnable to the UI thread to update the view. 
       try { 
        runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
          /*mDrawable.setBounds(i, j ,i+ width, i+ height); 
          mDrawable.draw(cc); 
          invalidate();*/ 
        } 
        }); 
        Thread.sleep(200); 

       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
      // We're moving upwards. 
      else { 
       // Move up and left 
       i -= 10; 
       j -= 10; 

       try { 
        runOnUiThread(new Runnable() { 

         @Override 
         public void run() { 
          /*mDrawable.setBounds(i, j ,i+ width, i+ height); 
          mDrawable.draw(cc); 
          invalidate();*/ 
         } 
        }); 
        Thread.sleep(200); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } // Catch! 
      } // Else! 

      // Check to see if we've hit the bottom of the screen 
      if(j >= margenmaxy - height) 
      { 
        // Change to moving up phase. 
        mMoveUp = true; 
      } 
      // Note, you can use an altered form of this to switch back and forth 
      // between moving up and down. 
     } // while(i < margenmaxx)!    
    } // run()! 
} // UpdateThread! 

추가 메모로 볼을 좌우로 움직이면 결국 경계를 치게 될 수도 있습니다. 당신은 실제로 더 나은 검사를 구현해야합니다. 두 번째 메모로, 이것은 아마 안드로이드에서 움직이는 이미지를 달성하는 가장 좋은 방법은 아닙니다. 마지막으로 좀 더 일반적인 해결책은 안드로이드 Property Animation을 원하는 보간 자와 함께 사용하는 것입니다. 이 작업을 한 번만하고 싶으면 애니메이션보기로도 충분할 수 있습니다.

+0

이 코드를 시도해보고 알려 드리겠습니다 –

+0

정말 부동산 애니메이션을 봐야합니다 ... :) – batbrat

+0

이 코드를 주셔서 감사하지만 공이 움직이지 않습니다 –

관련 문제