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>

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);

        }

    };
}
4

1 回答 1

0

这很简单。您正在传递一些平移向量 insted 初始位置和最终位置。请注意,参数名称是 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);
}

android中存在不连贯性。Animation.ABSOLUTE 不考虑状态栏高度,但 getLocationInWindow 和 getLocationOnScreen 考虑。尝试自己修复它。

请记住,此动画不会移动 View 而是更新 Matrix,因此 linearLayout_test 始终返回相同的位置。

于 2012-05-27T06:22:31.833 回答