我想创建一个“Flash”类来显示一个白色的 Flash 屏幕(200 毫秒),就像烤面包一样容易,像这样:
Flash.create(context).show();
- 该层应立即出现然后逐渐消失(alpha 过渡)
- 它不能捕获事件
- 它必须适应屏幕旋转
- 它可以从任何活动创建
我通过 WindowManager 寻找解决方案,但遇到了一些困难。您推荐什么解决方案?
我想创建一个“Flash”类来显示一个白色的 Flash 屏幕(200 毫秒),就像烤面包一样容易,像这样:
Flash.create(context).show();
我通过 WindowManager 寻找解决方案,但遇到了一些困难。您推荐什么解决方案?
这样做有一些问题,因为您必须将 Activity 而不仅仅是 Context 传递到“Flash”屏幕中。因此屏幕旋转的处理会很棘手。
我创建并开源了一个名为 Crouton 的小型库,它可以为您提供帮助。目前,在显示面包块时,它仍在努力解决方向变化的问题。
因此,如果它可以帮助任何人,我会给出自己的解决方案......(自从我的第一篇文章以来,我将调用更改为 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 在闪烁效果期间不可触摸如果有人有解决问题的方法......
经过几个小时的搜索,似乎不可能将事件从一个窗口委托给另一个窗口。所以我找到的最终功能解决方案是扩展一个活动,使其实现这种闪光效果。对于那些对此感兴趣的人,这是我的子类:
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);
通过这个实现,事件通过层