Android中ImageView的淡入/淡出动画

jm81lzqq  于 2023-02-27  发布在  Android
关注(0)|答案(1)|浏览(290)

我想尝试逐渐淡出图像(这样它就看不见了),然后立即反转,这样它就又逐渐变得可见了。
我有一个简单的Xamarin Android应用程序,背景为纯黑色,ImageView显示图像,Button

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    android:background="@android:color/black">
    <ImageView
        android:id="@+id/imageView"
        android:layout_width="400px"
        android:layout_height="400px"
        android:scaleType="centerInside"
        android:src="@drawable/clownfish"/>
    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</LinearLayout>

OnCreate()中,我将图像设置为完全不透明,并为按钮设置了一个单击处理程序:

protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        SetContentView(Resource.Layout.activity_main);
        this.FindViewById<ImageView>(Resource.Id.imageView).Alpha = 1.0f;
        FindViewById<Button>(Resource.Id.btn).Click += Btn_Click;
    }

在单击处理程序中,我创建了一对动画,每个动画的持续时间为5秒,将第二个动画设置为5秒后开始,将它们添加到AnimationSet中,并在ImageView上设置动画:

private void Btn_Click(object sender, EventArgs e)
    {
        const long duration = 5000L;
        var imgView = this.FindViewById<ImageView>(Resource.Id.imageView);

        var fadeOut = new AlphaAnimation(1f, 0f)  // fully opaque -> fully transparent
        {
            Interpolator = new AccelerateInterpolator(),
            Duration = duration
        };
        var fadeIn =  new AlphaAnimation(0f, 1f)  // fully transparent -> fully opaque
        {
            Interpolator = new AccelerateInterpolator(),
            Duration = duration 
        };

        fadeIn.StartOffset = duration;
        var animSet = new AnimationSet(false);
        animSet.AddAnimation(fadeOut);
        animSet.AddAnimation(fadeIn);
        imgView.StartAnimation(animSet);
    }

当我点击按钮时,ImageView立即变为透明,10秒后又立即变为完全不透明。没有从不透明到透明再回到不透明的渐变。我不明白为什么这不能达到我想要的效果。
如果我将click处理程序中的AnimationSet代码替换为:

fadeOut.AnimationEnd += (s, e) => { imgView.StartAnimation(fadeIn); };
        imgView.StartAnimation(fadeOut);

那么动画就可以正常工作了。我对代码的工作很满意,尤其是它更简短,而且我理解它的作用-但我不明白为什么使用AnimationSet的方法不能执行平滑的动画。由于这是一个学习练习,有人能给我解释一下为什么第一种方法不起作用吗?谢谢。

sz81bmfz

sz81bmfz1#

基于您的代码,我创建了一个演示,并实现了这个功能.
您可以参考以下代码:
1.设置此图像的属性android:visibility="invisible"

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    android:background="@android:color/black">
    <ImageView
        android:visibility="invisible"
        android:id="@+id/imageView"
        android:layout_width="400px"
        android:layout_height="400px"
        android:scaleType="centerInside"
        android:src="@drawable/fish"/>
    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</LinearLayout>

2.函数Btn_Click

ImageView imgView; 
    AlphaAnimation fadeIn;
    AlphaAnimation fadeOut;

    private void Btn_Click(object sender, System.EventArgs e) 
    {
        const long duration = 5000L;
        imgView = this.FindViewById<ImageView>(Resource.Id.imageView);

         fadeIn = new AlphaAnimation(0, 1)  // fully transparent -> fully opaque
        {
            Interpolator = new AccelerateInterpolator(),  //AccelerateInterpolator
            Duration = duration,
        };

         fadeOut = new AlphaAnimation(1, 0)  // fully opaque -> fully transparent
        {
            Interpolator = new AccelerateInterpolator(),
            Duration = duration,

            StartOffset = 3000
        };
        
        AnimationSet animSet = new AnimationSet(false);

        imgView.Visibility = Android.Views.ViewStates.Visible;
        animSet.AddAnimation(fadeIn);
        animSet.AddAnimation(fadeOut);
        
        imgView.Animation=animSet;
        animSet.StartNow();

  }

相关问题