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

これは簡単です。いくつかの平行移動ベクトルを挿入した初期位置とフィアナール位置を渡します。引数名は、TranslateAnimationの他のコンストラクターのようにxDeltaではなくxValueであり、ローカルではなく絶対座標を使用していることに注意してください。

修理:

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は常に同じ位置を返すことに注意してください。

于 2012-05-27T06:22:31.833 に答える