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);
}
};
}
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
檢查我的答案中的修改。 –