Java 安卓onClick启动';s两个动画,应该只启动一个

Java 安卓onClick启动';s两个动画,应该只启动一个,java,android,Java,Android,根据我首先单击的动画,第二个动画将始终设置第一个动画。我不知道我做错了什么 import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.view.animation.TranslateAnimation; import android.widget.Button; import an

根据我首先单击的动画,第二个动画将始终设置第一个动画。我不知道我做错了什么

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.TranslateAnimation;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

public class Test extends Activity {
    ImageView img_left;
    ImageView img_right;
    Button left;
    Button right;
    TranslateAnimation moveup;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.test);

        moveup = new TranslateAnimation(0, 0, 0, -900);
        moveup.setDuration(2000);
        moveup.setFillAfter(true);
        left = (Button) findViewById(R.id.left);
        right = (Button) findViewById(R.id.right);
        img_left = (ImageView) findViewById(R.id.image_left);
        img_right = (ImageView) findViewById(R.id.image_right);
        right.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                img_right.startAnimation(moveup);
                Toast.makeText(getApplicationContext(), "right", Toast.LENGTH_LONG).show();
            }

        });

        left.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                img_left.startAnimation(moveup);
                Toast.makeText(getApplicationContext(), "left", Toast.LENGTH_LONG).show();
            }

        });

    }

}
布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ffffff"
    tools:context=".First" >

    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_width="match_parent"
        android:layout_height="120dp"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true" >

        <Button
            android:id="@+id/left"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:background="#0000EE"
            android:text="" />

        <Button
            android:id="@+id/right"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:background="#0000EE"
            android:text="" />
    </LinearLayout>

    <ImageView
        android:id="@+id/image_left"
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:src="@drawable/cue1" />

    <ImageView
        android:id="@+id/image_right"
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:src="@drawable/cue2" />

</RelativeLayout>

创建两个具有相同属性的不同
动画
对象,一个用于左侧,一个用于右侧,或者在启动另一个视图之前调用
setAnimation(null)
。换言之:

    right.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {
            img_left.setAnimation(null);
            img_right.startAnimation(moveup);
            Toast.makeText(getApplicationContext(), "right", Toast.LENGTH_LONG).show();
        }

    });

    left.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {
            img_right.setAnimation(null);
            img_left.startAnimation(moveup);
            Toast.makeText(getApplicationContext(), "left", Toast.LENGTH_LONG).show();
        }

    });

Animation
对象在调用
setAnimation()
startAnimation()
时附加到其视图。通过启动附加到同一
动画
实例的两个视图,动画在运行时可能会影响两个视图的绘图。视图在无效时只关注动画的当前状态,因此这并不一定意味着它们将始终一起设置动画。但是,如果您的代码在
动画运行时遇到两个
ImageView
实例都无效的情况,它们都会响应转换。

尝试使用>>
new View.OnClickListener()
代替
new OnClickListener()
显示布局xml。您可以将ID设置为相同的值。经过三次检查,它们都设置正确,但我还是要添加它。也许我只是缺少了一些东西。
moveup.setAnimationListener(null)不起作用。不过,创建两个动画对象确实可以。我觉得两个物体是不必要的,或者我的思维过程是不正确的?如果我在做一个游戏,我想让子弹在同一个动画中飞行呢。我会为每个视图创建一个新的动画对象,还是会影响带有动画的视图,而不会影响已放入动画中的其他视图?感谢您没有清除侦听器…动画;我用一个例子更新了答案。您一次只希望将该动画附加到任何一个视图。为每个视图创建一个视图并不是最糟糕的事情,它们不是重量级对象,如果它们都同时运行,您肯定需要这样做,因为它们将位于动画中的不同点。
动画
对象保持动画距离完成多远以及这对转换意味着什么的状态。诚然,这有点尴尬,但这就是为什么安卓3.0+不再使用这个动画系统的原因。等等,安卓3.0不再使用这个了。。。如果我是专门为3.0及更高版本开发的呢?那么您最好转向更新的属性动画系统。较旧的系统仍然可以工作,但属性动画的整体API要好得多: