我为图像制作了一个简单的动画,然后在图像上设置事件OnClick以进行祝酒。问题是我让图像开始在onCreate上做动画,我设置了要点击的图像并触发吐司,但问题是图像不可点击,但如果我按下原始位置图像,吐司开始(图像不随动画移动)
thx求助
这是动画文件夹(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();
}
});
}
}
答案 0 :(得分:2)
在整个动画期间,您的视图仍保留在旧位置(动画刚刚开始时的位置)。它只是在另一个地方绘制的。动画结束后,您必须移动动画视图:
为您的动画注册一个监听器。 http://developer.android.com/reference/android/view/animation/Animation.AnimationListener.html
在onAnimationEnd实现中,修改Activity的布局,使其类似于动画的最终状态/布局。
评论后更新:
我看到这样做的唯一方法是在Java代码中创建自己的自定义动画并实现自定义动画&#39;受保护的void applyTransformation(float interpolatedTime,Transformation t)&#39;方法。例如,在我们的应用程序中,我们有一个动画实际上移动一个视图而不是仅仅绘制它在不同的位置。例如。下面是动画的示例,它增加或减少视图的实际高度:
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;
}
}
您的动画会有所不同,但会使用&#39; getLayoutParams()&#39;和&#39; setLayoutParams()&#39;以及修改View的(ImageView&#39; s)位置并适当更改layoutParams.topMargin和layoutParams.leftMargin。
如果你不关心Android 2.x或更低版本,使用ObjectAnimator(3.0或更高版本)或ViewPropertyAnimator(3.1或更高版本)是一个更好的解决方案,正如前面其他答案中提到的那样。
如果这有助于您,请告诉我。
答案 1 :(得分:0)
尝试这样:
final Animation animTranslate1 = AnimationUtils.loadAnimation(this,R.anim.translate);
animTranslate1.setFillAfter(true);
image01.startAnimation(animTranslate1);
如果这不起作用,那么你将不得不使用更新的属性动画框架(在你之前的重复问题的答案中指出)
答案 2 :(得分:0)
为imageView设置动画的方式只是移动它的外观,所以实际上你的imageView仍处于旧位置。使用这种类型的动画,没有一种简单的方法可以做你想要的。您应该考虑使用ObjectAnimators ...