Android - 移动视图

时间:2012-05-27 04:31:49

标签: android android-animation

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

        }

    };
}

1 个答案:

答案 0 :(得分:0)

这很简单。 您正在传递一些翻译向量的初始位置和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);
}

android中存在不连贯性。 Animation.ABSOLUTE没有考虑状态栏高度,但getLocationInWindow和getLocationOnScreen确实如此。试着自己解决它。

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

相关问题