安卓:如何让屏幕“闪烁”白色

4

我想让我的安卓屏幕暂时“闪”成白色(只有一次)。需要足够长,以便用户能够确定屏幕确实变成了白色。

用户将会落在一个屏幕上,在5秒后这个屏幕会闪白,然后再次显示原始屏幕(可能从白色淡出)。

怎么做最好呢?目前我正在创建一个占据整个屏幕的矩形,并通过编程来显示和隐藏它。

1个回答

4
  • 创建一个覆盖整个屏幕的前景ImageView,并将android:src设置为白色可绘制项,以实现添加前景。
  • 将此视图的可见性设置为android:visibility="gone"
  • 当需要显示白色闪光时,建议使用淡入动画来展示白色闪光。

这是一种基本的动画,可以淡入ImageView的可绘制项。淡出将是其相反操作。

public static void FadeIn(final ImageView v,
        final int begin_alpha, final int end_alpha, int time,
        final boolean toggleVisibility) {

    if (Integer.valueOf(android.os.Build.VERSION.SDK_INT) >= android.os.Build.VERSION_CODES.JELLY_BEAN)
        v.setImageAlpha(begin_alpha);
    else
        v.setAlpha(begin_alpha);

    if (toggleVisibility) {
        if (v.getVisibility() == View.GONE)
            v.setVisibility(View.VISIBLE);
        else
            v.setVisibility(View.GONE);
    }

    Animation a = new Animation() {
        @Override
        protected void applyTransformation(float interpolatedTime,
                Transformation t) {
            if (interpolatedTime == 1) {
                if (Integer.valueOf(android.os.Build.VERSION.SDK_INT) >= android.os.Build.VERSION_CODES.JELLY_BEAN)
                    v.setImageAlpha(end_alpha);
                else
                    v.setAlpha(end_alpha);

                if (toggleVisibility) {
                    if (v.getVisibility() == View.GONE)
                        v.setVisibility(View.VISIBLE);
                    else
                        v.setVisibility(View.GONE);
                }
            } else {
                int new_alpha = (int) (begin_alpha + (interpolatedTime * (end_alpha - begin_alpha)));
                if (Integer.valueOf(android.os.Build.VERSION.SDK_INT) >= android.os.Build.VERSION_CODES.JELLY_BEAN)
                    v.setImageAlpha(new_alpha);
                else
                    v.setAlpha(new_alpha);
                v.requestLayout();
            }
        }

        @Override
        public boolean willChangeBounds() {
            return true;
        }
    };

    a.setDuration(time);
    v.startAnimation(a);
}

如果您正在使用FrameLayout并且需要切换透明度从0(透明)到1(不透明),您可以使用android:foreground属性,而无需创建新的视图。(请注意,对于第一种方法,当闪光视图可见时,您将无法与其下方的任何元素交互,因此这比具有前景属性的FrameLayout更好)。 不过,这种方法实现起来较为困难。


谢谢你的回答!我能让闪烁效果工作,但是时间控制方面有些困难。代码运行动画的部分似乎需要更长的时间才能完成(比其他所有操作晚大约一秒)。看起来像等待其他所有操作执行完后再运行。是否有设置动画定时的方法?我正在使用与你类似的代码在可运行操作中运行,但无济于事。 - Soatl
时序问题是由于Android相机引起的。再次感谢! - Soatl

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