如何在程序中编写代码实现自定义视图(ImageView)的动画效果?

3
我希望能够通过编程来使自定义视图动画化。我希望它只在xml文件中声明的位置上进行动画,而且不会影响布局。此外,这种动画受到其他因素的影响,因此Android Animation类不适用。
我已经测试了这个tutorial样例并观看了这个videos。我的问题是,大多数教程都是针对将精灵动画化到画布中,您需要跟踪精灵的位置。
如何在不影响布局且不使用Android Animation类的情况下使自定义视图动画化?
编辑: 自定义视图将作为动画gif,并在事件激活时切换另一组框架。

你想做什么?你想如何进行动画处理? - Blundell
动画类似于加载条,它随着时间的推移而运行,但当事件发生时,另一组动画将在该视图上播放。动画必须仅影响自定义视图。 - Marl
1
通过使用AnimationDrawable,您可以轻松地切换到另一组帧,只需调用:当需要时,rocketImage.setBackgroundResource(R.drawable.<<一些其他的动画列表>>)。 - Amir Uval
2个回答

5

您可以创建动画XML并从程序中将该动画应用于您的ImageView。请参考以下示例:

对于自定义视图,您可以调用viewobject.startAnimation(animationobject);来启动动画。

animation.xml

<set xmlns:android="http://schemas.android.com/apk/res/android"
 android:shareInterpolator="false">
<scale
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"
    android:fromXScale="1.0" 
    android:toXScale="1.4" 
    android:fromYScale="1.0" 
    android:toYScale="0.6" 
    android:pivotX="50%"
    android:pivotY="50%"
    android:fillAfter="false"
    android:duration="700" />
<set
    android:interpolator="@android:anim/accelerate_interpolator"
    android:startOffset="700">
    <scale
        android:fromXScale="1.4" 
        android:toXScale="0.0"
        android:fromYScale="0.6"
        android:toYScale="0.0" 
        android:pivotX="50%" 
        android:pivotY="50%" 
        android:duration="400" />
    <rotate
        android:fromDegrees="0" 
        android:toDegrees="-45"
        android:toYScale="0.0" 
        android:pivotX="50%" 
        android:pivotY="50%"
        android:duration="400" />
</set>

你的main.xml文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView  
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:text="@string/hello"
/>
<ImageView android:id="@+id/ImageView01" android:layout_width="wrap_content" android:layout_height="wrap_content"></ImageView>

</LinearLayout>

然后您的活动类是myActivity.java

public class myActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    ImageView image = (ImageView) findViewById(R.id.ImageView01);

    //create animation class object
    Animation hyperspaceJump = 
        AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump);
    //start animation for image
    image.startAnimation(hyperspaceJump);
}
}

3
如果你想要像动态gif一样的“逐帧”动画,可以参考官方教程drawable-animation
引用教程中的话:
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="true">
    <item android:drawable="@drawable/rocket_thrust1" android:duration="200" />
    <item android:drawable="@drawable/rocket_thrust2" android:duration="200" />
    <item android:drawable="@drawable/rocket_thrust3" android:duration="200" />
</animation-list>

在你的代码中,
AnimationDrawable rocketAnimation;

public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

  ImageView rocketImage = (ImageView) findViewById(R.id.rocket_image);
  rocketImage.setBackgroundResource(R.drawable.rocket_thrust);
  rocketAnimation = (AnimationDrawable) rocketImage.getBackground();
}

public boolean onTouchEvent(MotionEvent event) {
  if (event.getAction() == MotionEvent.ACTION_DOWN) {
    rocketAnimation.start();
    return true;
  }
  return super.onTouchEvent(event);
}

AnimationDrawable类是我所需要的。谢谢。 - Marl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接