2012-05-27 1 views
0

TranslateAnimation을 사용하여 현재 위치에서 지정된 위치 (클릭 한 버튼의 위치)로 배경으로 동작하는보기를 이동하려고합니다. 그러나 어딘가에서 상자를 이동하기 시작합니다. 무작위. 아래 내 코드를 참조하십시오.안드로이드 - 이동보기

레이아웃 XML :

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" > 

<ScrollView 
    android:layout_width="match_parent" 
    android:layout_height="100dp" 
    > 

    <FrameLayout 
     android:id="@+id/frame1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" > 

     <LinearLayout 
      android:id="@+id/linearLayout_test" 
      android:layout_width="100dp" 
      android:layout_height="100dp" 
      android:background="#E02111" > 
     </LinearLayout> 

     <TableLayout 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" > 

      <TableRow 
       android:id="@+id/tableRow1" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" > 

       <Button 
        android:id="@+id/button1" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:text="Button 1" /> 

       <Button 
        android:id="@+id/button2" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:text="Button 2" /> 
      </TableRow> 

      <TableRow 
       android:id="@+id/tableRow2" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" > 

       <Button 
        android:id="@+id/button3" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:text="Button 3" /> 

       <Button 
        android:id="@+id/button4" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:text="Button 4" /> 
      </TableRow> 

      <TableRow 
       android:id="@+id/tableRow3" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" > 

       <Button 
        android:id="@+id/button5" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:text="Button 5" /> 

       <Button 
        android:id="@+id/button6" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:text="Button 6" /> 
      </TableRow> 
     </TableLayout> 
    </FrameLayout> 
</ScrollView> 

</LinearLayout> 

자바 코드 :

import android.app.Activity; 
import android.os.Bundle; 
import android.view.*; 
import android.view.View.OnClickListener; 
import android.view.animation.Animation; 
import android.view.animation.TranslateAnimation; 
import android.widget.*; 

public class TestAnimation extends Activity { 

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

    @Override 
    public void onWindowFocusChanged(boolean hasFocus) { 
     super.onWindowFocusChanged(hasFocus); 

     //the red box 
     View box = findViewById(R.id.linearLayout_test); 

     //Initially move the background box to button 1 
     Button button1 = (Button) findViewById(R.id.button1); 
     int[] button1Loc = new int[2]; 
     button1.getLocationOnScreen(button1Loc); 
     int[] boxLocation = new int[2]; 
     box.getLocationInWindow(boxLocation); 
     box.setLayoutParams(new FrameLayout.LayoutParams(button1.getWidth() + 1,button1.getHeight() + 1)); 
     TranslateAnimation animation = new TranslateAnimation(0, boxLocation[0] - button1Loc[0] , 0,boxLocation[1] - button1Loc[1]); 
     animation.setFillAfter(true); 
     animation.setDuration(400); 
     box.startAnimation(animation); 


     //add click handler on all buttons 
     Button button = (Button)findViewById(R.id.button1); 
     button.setOnClickListener(buttonClick); 
     button = (Button)findViewById(R.id.button1); 
     button.setOnClickListener(buttonClick);  
     button = (Button)findViewById(R.id.button2); 
     button.setOnClickListener(buttonClick); 
     button = (Button)findViewById(R.id.button3); 
     button.setOnClickListener(buttonClick); 
     button = (Button)findViewById(R.id.button4); 
     button.setOnClickListener(buttonClick); 
     button = (Button)findViewById(R.id.button5); 
     button.setOnClickListener(buttonClick); 
     button = (Button)findViewById(R.id.button6); 
     button.setOnClickListener(buttonClick); 

    } 
    // This is the problem - it should start moving the box from its current location to the clicked button's location 
    // right now it starts moving it from somewhere random :) 
    private OnClickListener buttonClick = new OnClickListener() { 
     public void onClick(View v) { 
      View box = findViewById(R.id.linearLayout_test); 
      int[] buttonLoc = new int[2]; 
      v.getLocationOnScreen(buttonLoc); 

      int[] boxLocation = new int[2]; 
      box.getLocationOnScreen(boxLocation); 

      TranslateAnimation animation = new TranslateAnimation(
         Animation.ABSOLUTE, 0,Animation.ABSOLUTE, buttonLoc[0] - boxLocation[0], 
         Animation.ABSOLUTE, 0,Animation.ABSOLUTE, buttonLoc[1] - boxLocation[1] 
         ); 
      animation.setFillAfter(true); 
      animation.setDuration(400); 
      box.startAnimation(animation); 

     } 

    }; 
} 

답변

0

이 간단합니다. 일부 번역 벡터는 초기 위치와 약식 위치를 전달합니다. 인수 이름은 TranslateAnimation의 다른 생성자에서와 같이 xValue가 아니라 xDelta이며 로컬이 아닌 절대 좌표를 사용합니다.

수정 :

TranslateAnimation animation = new TranslateAnimation( 
    Animation.ABSOLUTE, boxLocation[0], Animation.ABSOLUTE, buttonLoc[0] , 
    Animation.ABSOLUTE, boxLocation[1], Animation.ABSOLUTE, buttonLoc[1]); 

편집 :

private int[] oldPos = new int[2]; 
private OnClickListener buttonClick = new OnClickListener() { 
    public void onClick(View v) { 
    View box = findViewById(R.id.linearLayout_test); 

    int[] newPos = new int[2]; 
    v.getLocationInWindow(newPos); 
    newPos[1] -= box.getTop(); 
    TranslateAnimation animation = new TranslateAnimation(
      Animation.ABSOLUTE, oldPos[0], 
      Animation.ABSOLUTE, newPos[0], 
      Animation.ABSOLUTE, oldPos[1], 
      Animation.ABSOLUTE, newPos[1]); 

    oldPos = newPos; 

    animation.setFillAfter(true); 
    animation.setDuration(400); 
    box.startAnimation(animation); 
} 

인코 히런가 안드로이드에 있습니다. Animation.ABSOLUTE는 상태 막대 높이를 고려하지 않지만 getLocationInWindow 및 getLocationOnScreen은 상태 막대 높이를 고려하지 않습니다. 당신 스스로에 의해 그것을 고치려고 노력하십시오.

이 애니메이션은 뷰를 이동시키지 않지만 매트릭스를 업데이트하므로 linearLayout_test는 항상 동일한 위치를 반환합니다.

+0

마렉 R, xValue 대 xDelta를 지적 해 주셔서 감사합니다. (http://developer.android.com/reference/android/view/animation/TranslateAnimation.html#TranslateAnimation%28int,%20float,%20int,%20float , % 20int, % 20float, % 20int, % 20float % 29). 제안한 코드가 작동하지 않습니다. 그것을 실행하고 자신을 위해 그것을 참조하십시오. – idopaging

+0

내 대답을 편집하십시오. –