【问题标题】:Fade a View in and out while maintaining a Shape background在保持形状背景的同时淡入和淡出视图
【发布时间】:2014-01-09 04:02:36
【问题描述】:

给你们一个简单的问题,我遇到了很多麻烦。

目标:拥有一个带有形状 (xml) 作为背景的RelativeLayout,当特定的事情发生时,让它从透明变为纯红色(保持形状),然后再次变回透明。看起来很容易,但我一直无法达到我的目标。

第一次尝试:

Relativelayout 最初具有形状 state_ok.xml 作为背景:

//state_error.xml
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
    <corners android:radius="11dp" />
    <solid android:color="#ffff0000" />
</shape>

//state_ok.xml
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
    <corners android:radius="11dp" />
    <solid android:color="#00ff0000" />
</shape>

//MyView with static runnable creator class for easiness's sake.
private static class FadeRunnable implements Runnable {
    final Context ctx; final RelativeLayout layout; final int from, to;
    //of course there's a constructor with these four params

    public void run() {
        Drawable[] color = {
                ctx.getResources().getDrawable(from), 
                ctx.getResources().getDrawable(to)
        };
        TransitionDrawable trans = new TransitionDrawable(color);
        layout.setBackgroundDrawable(trans);
        trans.startTransition(2500);
    }
}

final FadeRunnable in = new FadeRunnable(context, layout, R.drawable.state_error, R.drawable.state_ok);
final FadeRunnable out = new FadeRunnable(context, layout, R.drawable.state_ok, R.drawable.state_error);

Thread fading = new Thread() {
    public void run() {
        MyView.this.context.runOnUiThread(in);
        Thread.sleep(2500);
        MyView.this.context.runOnUiThread(out);
    }
};
fading.start();

结果:它立即变为红色,并在 2500 毫秒后立即变为透明并逐渐变为纯红色。我无法绕开它。

第二次尝试:使用Animations

final Runnable inRunnable = new Runnable() {
    @Override
    public void run() {
        Animation inAnim = AnimationUtils.loadAnimation(context, R.anim.fadein);
        layout.startAnimation(inAnim);
    }
};
final Runnable outRunnable = new Runnable() {
    @Override
    public void run() {
        Animation inAnim = AnimationUtils.loadAnimation(context, R.anim.fadeout);
        layout.startAnimation(inAnim);
    }
};
new Thread() {
    public void run() { 
        context.runOnUiThread(inRunnable);
        CommonToolkit.sleep(2500);
        context.runOnUiThread(outRunnable);
    }
}.start();

结果:布局的内容再次变得不透明和透明,而不是本身的背景。

其他尝试

在那之后我尝试了ValueAnimator,但也没有用。

然后我尝试更改背景颜色(使用 for 循环和 setBackgroundColor(int color)),但这样就无法保持形状(而且我认为用不同颜色制作 256 个可绘制对象有点过头了)。

问题:
如何在保持形状 xml 背景的同时将视图的颜色从 #00ff0000 更改为 #ffff0000 并再次变回透明红色?

来源:
How to Apply Corner Radius to LinearLayout
Fade animation blinks - Android
Animate change of view background color on Android
How to reference colour attribute in drawable?
android: Animate color change from color to color
animation fade in and out
In Android, how do I smoothly fade the background from one color to another? (How to use threads)

PS
当我使用下面的代码时,它会一直循环:它从透明变为红色,然后立即再次透明等等,但是,我没有真正的循环,所以我不知道这是怎么可能的。我从 xml 的布局中删除了背景条目。

Thread forThread = new Thread() {
    public void run() {
        for (int i = 0; i < 256; i++) {
            final int j = i;
            context.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    layout.setBackgroundColor(Color.argb(j, 0xff, 0, 0));
                }
            });
            CommonToolkit.sleep(10);
        }
        for (int k = 255; k > -1; k++) {
            final int l = k;
            context.runOnUiThread(new Runnable() { 
                @Override
                public void run() {
                    layout.setBackgroundColor(Color.argb(l, 0xff, 0, 0));
                }
            });
            CommonToolkit.sleep(10);
        }
    }
};
forThread.start();

【问题讨论】:

    标签: android animation


    【解决方案1】:

    用红色和透明的颜色制作 2 个可绘制的 xml。 (layout_bg_red,layout_bg_trans)。 创建另一个可绘制的“my_layout_transition”为:

    <?xml version="1.0" encoding="UTF-8"?>
    <transition xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:drawable="@drawable/state_ok" />
        <item android:drawable="@drawable/state_error" />
    </transition>
    

    将此过渡 xml 指定为所需视图的背景。

    将这两种方法添加到活动中:

    public void startTransition(int millis, View v) {
        if (v.getBackground() instanceof TransitionDrawable) {
            TransitionDrawable d = (TransitionDrawable)v.getBackground();
            d.startTransition(millis);
        }
    }
    
    public void reverseTransition(int millis, View v) {
        if (v.getBackground() instanceof TransitionDrawable) {
            TransitionDrawable d = (TransitionDrawable)v.getBackground();
            d.reverseTransition(millis);
        }
    }
    

    然后调用startTransition(500, myLayoutView) 和reverseTransition(500, myLayoutView);

    开始然后反向转换的示例:

    public void startAndReverseTransition(final int millis, final View v) {
        if (v.getBackground() instanceof TransitionDrawable) {
            final TransitionDrawable d = (TransitionDrawable)v.getBackground();
            d.startTransition(millis);
            v.postDelayed(new Runnable() {
                @Override
                public void run() {
                    d.reverseTransition(millis);
                }
            }, millis);
        }    
    }
    

    【讨论】:

    • 我也试过这个方法。问题:当我按照描述实现它时,它不会从透明变为红色,而是立即变成红色。
    • 在你的答案中包含 handler.postdelayed(Runnable, time) 的反面,它可能会起作用。但是,当我在已经开始转换的视图上调用 startTransition 时,它会以最终状态(红色)结束。
    【解决方案2】:

    试试这个: 透明的.xml:

    <shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >
    <corners android:radius="11dp" />
    <solid android:color="#00000000" />
    
    </shape>
    

    red.xml

    <shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >
    <corners android:radius="11dp" />
    <solid android:color="#FF0000" /></shape>
    

    bg_translate.xml

    <transition xmlns:android="http://schemas.android.com/apk/res/android" >
    
    <item android:drawable="@drawable/transparent"/>
    <item android:drawable="@drawable/red"/></transition>
    

    设置 bg_translate.xml 为背景android:background="@drawable/bg_translate" 现在在代码中更改背景颜色:

    TransitionDrawable transition = (TransitionDrawable) v.getBackground(); transition.startTransition(time);

    并使用

    反转它
    transition.reverseTransition(time);
    

    时间是以毫秒为单位的淡入淡出时间

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多