2

我为图像制作了一个简单的动画,并在图像上设置了事件 OnClick 来祝酒。问题是我让图像开始在 onCreate 上制作动画,并设置要单击的图像并触发 toast 但问题是图像不可点击,但如果我按下原始位置图像,吐司开始(图像不随动画移动)

谢谢你的帮助

这是 anim 文件夹中的动画代码 (translate.xml)

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/linear_interpolator">
    <translate
        android:fromXDelta="-80%p"
        android:toXDelta="80%p"
        android:duration="20000"
        android:repeatCount="100"
        android:repeatMode="restart"



        />


</set>

这是活动类

package com.example.animatest;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.Toast;

public class MainActivity extends Activity {

private ImageView image01;

private long aefe;
private ImageView image1;
private ImageView image2;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    image01 = (ImageView) findViewById(R.id.imageView1);

    final Animation animTranslate1 = AnimationUtils.loadAnimation(this,
            R.anim.translate);

    image01.startAnimation(animTranslate1);

    image01.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View view) {

            Toast.makeText(MainActivity.this, "hello", Toast.LENGTH_SHORT)
                    .show();

        }
    });

}

}
4

3 回答 3

2

在整个动画过程中,您的视图保持在旧位置(动画刚开始时的位置)。它只是画在另一个地方。动画结束后,您必须移动动画视图:

为您的动画注册一个监听器。 http://developer.android.com/reference/android/view/animation/Animation.AnimationListener.html

在 onAnimationEnd 实现中,修改 Activity 的布局,使其类似于动画的最终状态/布局。

评论后更新:

我看到这样做的唯一方法是在 Java 代码中创建自己的自定义动画并实现自定义动画的“受保护的 void applyTransformation(float interpolatedTime, Transformation t)”方法。例如,在我们的应用程序中,我们有一个动画,它实际上移动了一个视图,而不是仅仅在不同的位置绘制它。例如,下面是一个增加或减少视图实际高度的动画示例:

public class ViewHeightAnimation extends Animation {
    private final View  view;
    private final float diffHeight;
    private final int   startHeight;

    public ViewHeightAnimation(View view, float diffHeight, int startHeight) {
        this.view = view;
        this.diffHeight = diffHeight;
        this.startHeight = startHeight;

        setDuration(200);
        setInterpolator(new AccelerateDecelerateInterpolator());
    }

    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        android.view.ViewGroup.MarginLayoutParams layoutParams = (android.view.ViewGroup.MarginLayoutParams)view.getLayoutParams();
        layoutParams.height = Math.round(startHeight + (diffHeight * interpolatedTime));
        view.setLayoutParams(layoutParams);
    }

    @Override
    public boolean willChangeBounds() {
        return true;
    }
}

您的动画会有所不同,但也会使用“getLayoutParams()”和“setLayoutParams()”来修改视图(ImageView)的位置并适当地更改 layoutParams.topMargin 和 layoutParams.leftMargin。

如果您不关心 Android 2.x 或更低版本,使用 ObjectAnimator(3.0 或更高版本)或 ViewPropertyAnimator(3.1 或更高版本)是更好的解决方案,如前面其他答案中所述。

让我知道这是否对您有帮助。

于 2013-02-14T19:29:26.063 回答
0

试试这样:

final Animation animTranslate1 = AnimationUtils.loadAnimation(this,R.anim.translate);
animTranslate1.setFillAfter(true);
image01.startAnimation(animTranslate1);

如果这不起作用,那么您将不得不使用较新的 Property Animation 框架(在您之前重复问题的答案中已指出)

看这里了解它

于 2013-02-14T19:23:45.140 回答
0

您为 imageView 设置动画的方式只是移动其外观,因此实际上您的 imageView 仍处于旧位置。使用这种类型的动画,没有一种简单的方法可以做你想做的事。您应该考虑使用ObjectAnimators ...

于 2013-02-14T21:30:51.267 回答