2012-02-22 76 views
3

我想以编程方式为自定义视图设置动画效果。我希望它只在xml文件中声明的位置有动画效果,并且我不希望它弄乱布局。另外这个动画受其他因素影响,所以android动画类是不可能的。如何以编程方式为自定义视图(ImageView)设置动画效果?

我测试了这个样本tutorial并观看这个videos。我的问题是,大多数教程是为了将一个精灵动画到一个画布中,在这个画布中你将跟踪精灵的位置。

如何在不影响布局且不使用Android动画类的情况下为自定义视图设置动画效果?

编辑: 自定义视图将作为动画gif,并在事件激活时触发另一组帧。

+0

你想做什么?你想如何动画? – Blundell 2012-02-22 08:48:14

+0

动画就像一个加载栏,它运行时间,但是当事件发生时,另一组动画将在该视图上播放。动画只能影响自定义视图。 – Marl 2012-02-22 08:58:30

+1

使用AnimationDrawable,您可以轻松地切换到另一组框架,如果您调用:rocketImage.setBackgroundResource(R.drawable。<< Some other animation-list >>);当你需要的时候。 – auval 2012-02-22 10:04:04

回答

3

如果您想要像动画GIF一样“运行”的“逐帧”动画,您可以按照以下步骤操作: drawable-animation official tutorial

从教程引用:

<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); 
} 
+0

AnimationDrawable类是我需要的。谢谢。 – Marl 2012-02-22 09:31:19

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); 
} 
} 
相关问题