我正在尝试使用 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>
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);
}
};
}