2012-05-27 47 views
0

我想從當前位置移動一個視圖,作爲使用TranslateAnimation的指定位置(被點擊的按鈕的位置),但是,它開始從某處移動框隨機。看到我的代碼如下。Android - 移動視圖

佈局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> 

Java代碼:

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

這很簡單。 你正在傳遞一些翻譯矢量insted初始位置和fianall位置。請注意,參數名稱是xValue而不是xDelta,與TranslateAnimation的其他構造函數類似,並且您使用的絕對座標不是局部的。

修復:

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

Marek R,感謝您指出xValue vs xDelta(http://developer.android.com/reference/android/view/animation/TranslateAnimation.html#TranslateAnimation%28int,%20float,%20int,%20float ,%20int,%20float,%20int,%20float%29)。您建議的代碼不起作用。運行它,併爲你自己看。 – idopaging

+0

檢查我的答案中的修改。 –