4

假设我有一个ImageButton btn. 我有两个不同Bitmap的,bmp1bmp2。默认情况下,btn显示bmp1,如下所示:

btn.setImageBitmap(bmp1);

在调用以下命令时bmp1,我可以以某种方式制作一个交叉淡入淡出的动画吗?bmp2

btn.setImageBitmap(bmp2);

所以问题是,是否有可能 - 如果是,如何 - 动画化 ImageButtons 上位图的变化?

4

2 回答 2

8

在我看来,实现此功能有两种主要方法。请注意,可能还有其他方法可以完全按照您的描述发生这种情况,但这些将是我的方法。

第一种方法:利用onAnimationEnd()回调

在这里,您需要从本质上淡出第一个ImageButton,更改onAnimationEnd()回调中的资源,然后将其淡入。为此,您必须实现以下代码。

  1. 在 XML 中创建一个Animation用于淡入的资源View

    <!-- Filename: fadein.xml -->
    <set xmlns:android="http://schemas.android.com/apk/res/android"> 
    <!-- Note that you might want to change the duration here-->
    <alpha 
        android:fromAlpha="0.0" 
        android:toAlpha="1.0"  
        android:duration="250"/> 
    </set>   
    
  2. 在 XML 中创建一个Animation用于淡出的资源View

    <!-- Filename: fadeout.xml -->
    <set xmlns:android="http://schemas.android.com/apk/res/android"> 
    <!-- Note that you might want to change the duration here-->
    <alpha 
        android:fromAlpha="1.0" 
        android:toAlpha="0.0"  
        android:duration="250"/> 
    </set>
    
  3. 在代码中加载淡出和淡入Animation

    // Obtain a reference to the Activity Context
    Context context = getContext();
    
    // Create the Animation objects.
    Animation outAnimation = AnimationUtils.loadAnimation(context, R.anim.fadeout);
    Animation inAnimation = AnimationUtils.loadAnimation(context, R.anim.fadein);
    
  4. AnimationListener为 this分配一个 new Animation,并按如下方式构建它:

    outAnimation.setAnimationListener(new AnimationListener(){
    
        // Other callback methods omitted for clarity.
    
        public void onAnimationEnd(Animation animation){
    
            // Modify the resource of the ImageButton
            yourImageButton.setImageResource(R.drawable.[your_second_image]);
    
            // Create the new Animation to apply to the ImageButton.
            yourImageButton.startAnimation(inAnimation);                                           
        }
    }
    
  5. 将 分配AnimationImageButton,然后开始第一个Animation

    yourImageButton.startAnimation(outAnimation);
    
  6. 然后,如果您希望动画回到前一个图像,您只需执行相同的操作,但顺序相反。

第二种方法:覆盖第二个ImageButton

对于这种方法,您只需将两个ImageButtons 分配给屏幕上的相同坐标,并具有相同的宽度。然后,您将ImageButton在第一个结束后淡出第一个并淡入第二个Animation(很像上面的示例)。


我希望这个答案符合您的期望。如果有任何代码错误,我深表歉意,因为我目前在没有编辑器的情况下这样做。如果您需要任何额外的说明,请告诉我!

于 2013-10-09T13:38:39.280 回答
1

无法为图像按钮源更改设置动画。解决方法是堆叠两个 ImageButton 并分别为其 alfa 通道设置动画以获得预期的行为。

于 2013-10-09T12:24:54.003 回答