0

我想创建一个“Flash”类来显示一个白色的 Flash 屏幕(200 毫秒),就像烤面包一样容易,像这样:

Flash.create(context).show();
  • 该层应立即出现然后逐渐消失(alpha 过渡)
  • 它不能捕获事件
  • 它必须适应屏幕旋转
  • 它可以从任何活动创建

我通过 WindowManager 寻找解决方案,但遇到了一些困难。您推荐什么解决方案?

4

3 回答 3

1

这样做有一些问题,因为您必须将 Activity 而不仅仅是 Context 传递到“Flash”屏幕中。因此屏幕旋转的处理会很棘手。

我创建并开源了一个名为 Crouton 的小型库,它可以为您提供帮助。目前,在显示面包块时,它仍在努力解决方向变化的问题。

于 2012-09-10T13:06:53.213 回答
0

因此,如果它可以帮助任何人,我会给出自己的解决方案......(自从我的第一篇文章以来,我将调用更改为 flash 方法)

public class Flasher {


    private final static int DURATION_OFFSET = 300;
    private final static int DURATION_FADEIN = 50;
    private final static int DURATION_FADEOUT = 200;
    private Animation fadein;
    private Animation fadeout;
    private RelativeLayout flash;
    private RelativeLayout view;
    private Toast toast;
    private int count;


    public Flasher(Context context) {
        fadein = new AlphaAnimation(0, 1);
        fadein.setStartOffset(DURATION_OFFSET);
        fadein.setDuration(DURATION_FADEIN);
        fadein.setAnimationListener(new AnimationListener() {
            @Override public void onAnimationStart(Animation anim) {}
            @Override public void onAnimationRepeat(Animation anim) {}
            @Override public void onAnimationEnd(Animation anim) {
                flash.startAnimation(fadeout);
            }
        });
        fadeout = new AlphaAnimation(1, 0);
        fadeout.setDuration(DURATION_FADEOUT);
        fadeout.setAnimationListener(new AnimationListener() {
            @Override public void onAnimationStart(Animation anim) {}
            @Override public void onAnimationRepeat(Animation anim) {}
            @Override public void onAnimationEnd(Animation anim) {
                if(count > 1) {
                    flash(count - 1);
                } else {
                    cancel();
                }
            }
        });
        LayoutParams params = new LayoutParams(-1, -1);
        flash = new RelativeLayout(context);
        flash.setLayoutParams(params);
        flash.setBackgroundColor(0xffffffff);
        flash.setVisibility(View.INVISIBLE);
        view = new RelativeLayout(context);
        view.setLayoutParams(params);
        view.addView(flash);
        toast = new Toast(context);
        toast.setView(view);
        toast.setGravity(Gravity.FILL, 0, 0);
    }


    public final void flash(int count) {
        toast.show();
        this.count = count;
        flash.startAnimation(fadein);
    }


    public final void cancel() {
        toast.cancel();
    }


}

用于测试的 MainActivity:

public class MainActivity extends Activity {


    private static Flasher flasher;


    @Override
    public void onCreate(Bundle state) {
        super.onCreate(state);
        View layout = getLayoutInflater().inflate(R.layout.activity_main, null);
        setContentView(layout);
        if(flasher == null) {
            flasher = new Flasher(this);
        }
        layout.setOnClickListener(new OnClickListener() {
            @Override public void onClick(View v) {
                flasher.flash(1);
            }
        });
    }


    @Override protected void onDestroy() {
        if(isFinishing()) {
            flasher = null;
        }
        super.onDestroy();
    }


}

感谢键盘冲浪者的帮助!


编辑:不满足约束:Toast 不调度触摸事件:

flasher.flash(10);

MainActivity 在闪烁效果期间不可触摸如果有人有解决问题的方法......

于 2012-09-10T18:22:39.670 回答
0

经过几个小时的搜索,似乎不可能将事件从一个窗口委托给另一个窗口。所以我找到的最终功能解决方案是扩展一个活动,使其实现这种闪光效果。对于那些对此感兴趣的人,这是我的子类:

public class FlmActivity extends Activity {


    private final static int DURATION_FADEIN = 50;
    private final static int DURATION_FADEOUT = 200;
    private final static int DURATION_INTERVAL = 200;
    private View view;
    private AnimationSet anim;
    private int count;


    public FlmActivity() {
        super();
    }


    @Override protected void onPostCreate(Bundle state) {
        super.onPostCreate(state);
        view = new View(this) {{
            setBackgroundColor(0xffffffff);
            setVisibility(View.INVISIBLE);
        }};
        anim = new AnimationSet(false) {{
            addAnimation(new AlphaAnimation(0, 1) {{
                setDuration(DURATION_FADEIN);
            }});
            addAnimation(new AlphaAnimation(1, 0) {{
                setStartOffset(DURATION_FADEIN);
                setDuration(DURATION_FADEOUT);
            }});
            addAnimation(new Animation() {{
                setStartOffset(DURATION_FADEIN + DURATION_FADEOUT);
                setDuration(DURATION_INTERVAL);
                setAnimationListener(new AnimationListener() {
                    @Override public void onAnimationStart(Animation anim) {}
                    @Override public void onAnimationRepeat(Animation anim) {}
                    @Override public void onAnimationEnd(Animation anim) {
                        flash(count - 1);
                    }
                });
            }});
        }};
        addContentView(view, getWindow().getAttributes());
    }


    @Override protected void onDestroy() {
        ((ViewGroup) view.getParent()).removeView(view);
        super.onDestroy();
    }


    public final void flash(int count) {
        if((this.count = count) > 0) {
            view.startAnimation(anim);
        }
    }


}

在扩展活动中调用闪光效果的代码:

flash(10);

通过这个实现,事件通过层

于 2012-09-13T15:28:07.013 回答