2013-09-03 2 views
0

안드로이드 프로젝트를 만들고 싶습니다. 거기에 내가 다른 레이아웃에서 원활하게 움직이기를 원하는 레이아웃이 있습니다. 이 작업을 수행하기 위해 스레드를 사용하려고했습니다. 그러나 코드 결과로 레이아웃은 최종 위치로 점프하고 오프셋에서 목적지까지 부드럽게 움직이지 않습니다.android layout with thread

abs1 = (AbsoluteLayout) findViewById(R.id.absoluteLayout2); 
    ImageButton ib1 = (ImageButton) findViewById(R.id.imageButton1); 
    ib1.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 

      Runnable r = new Runnable() { 

       @Override 
       public void run() { 
        // TODO Auto-generated method stub 
         try { 
          display(100); 
          display(100); 
          display(100); 
          display(100); 
          display(100); 
          display(100); 
          display(100); 
         } catch (InterruptedException e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } 

       } 

       private void display(int i) throws InterruptedException { 
        AbsoluteLayout.LayoutParams param = (AbsoluteLayout.LayoutParams) abs1 
          .getLayoutParams(); 
        param.x = param.x + 10; 
        // param.y=param.x+20; 
        abs1.setLayoutParams(param); 


        if (Thread.interrupted()) { 
         throw (new InterruptedException()); 
        } 
         Thread.sleep(i); 


       } 
      }; 
       r.run(); 

주요 파일 :

<AbsoluteLayout 
     android:id="@+id/absoluteLayout2" 
     android:layout_width="107dp" 
     android:layout_height="308dp" 
     android:layout_x="10dp" 
     android:layout_y="12dp" 
     android:background="@color/red" > 

     <ImageButton 
      android:id="@+id/imageButton1" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_x="0dp" 
      android:layout_y="0dp" 
      android:background="@null" 
      android:src="@drawable/calendar" /> 
+0

어떤 방향으로 움직여야합니까? – dumazy

+0

스레드를 사용할 필요가 없습니다. 그냥 내 대답을 봐 – dumazy

+1

AbsoluteLayout을 사용하지 마십시오 ... 그것은 더 이상 사용되지 않습니다 ... – Piyush

답변

1

는 편집 :

ObjectAnimator moveToSide = ObjectAnimator.ofFloat(myView, "translationX", 0f, 400f); 
moveToSide.setDuration(700); 
moveToSide.start(); 
:이 API에서부터 사용할 수 있습니다 11

그냥에 대한 ObjectAnimator를 사용

다른 부동 소수점 값으로 시도해보십시오. 이제는 X 축을 따라 원래 위치에서 400f로 시작합니다.

이후이 위치에 머물러있게됩니다. 시작 또는 끝에 몇 가지 작업을 수행하려는 경우 AnimatorListener을 추가 할 수도 있습니다.

moveToSide.addListener(new AnimatorListener() { 
@Override 
     public void onAnimationStart(Animator animation) { 
     } 

     @Override 
     public void onAnimationRepeat(Animator animation) { 
     } 

     @Override 
     public void onAnimationEnd(Animator animation) { 
     } 

     @Override 
     public void onAnimationCancel(Animator arg0) { 
     } 
    }); 
+0

좋은 답변! 너무 고마워, –

+0

그걸 듣고 기뻐 – dumazy

0

Runnable은 실제로 Android UI 스레드에서 실행됩니다.
그래서 sleep()은 UI의 드로잉 프로세스를 차단하고 최종 위치에 대한 뷰를 표시합니다.
Thread을 사용하여 포장하십시오.

(new Thread(new Runnable() { 
     @Override 
     public void run() { 
      // your code 
     } 
    } 
})).start();  

그런 다음 UI가 아닌 스레드에서보기를 업데이트하는 것은 금지됩니다.
보기를 업데이트하려면 runOnUiThread을 사용해야합니다.

runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
     display(100); 
    } 
} 

아마도 Android의 애니메이션 클래스를 사용하는 것이 더 좋은 방법 일 수 있습니다.