0

次のように、トーストと同じくらい簡単に白いフラッシュ画面 (200ms) を表示する「Flash」クラスを作成したいと思います。

Flash.create(context).show();
  • このレイヤーはすぐに表示され、徐々に消えます (アルファ トランジション)。
  • イベントをキャッチしてはなりません
  • 画面の回転に適応する必要があります
  • どのアクティビティからでも作成可能

WindowManager を介して解決策を探しましたが、いくつか問題があります。どのような解決策をお勧めしますか?

4

3 に答える 3

1

「Flash」画面にコンテキストだけでなくアクティビティを渡す必要があるため、これにはいくつかの問題があります。したがって、画面の回転の処理はトリッキーになります。

Crouton と呼ばれる小さなライブラリを作成してオープンソース化しました。現在、クルトンが表示されている間の向きの変更の問題にまだ苦労しています。

于 2012-09-10T13:06:53.213 に答える
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 に答える
0

それで、誰かを助けることができるなら、私は自分の解決策を提供します...(最初の投稿以来、フラッシュメソッドの呼び出しを変更しました)

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();
    }


}

助けてくれたキーボードサーファーに感謝します!


編集:制約が満たされていない:トーストはタッチイベントを送出しません:

flasher.flash(10);

MainActivity は、フラッシュ効果の間はタッチできません 誰かが問題を解決する解決策を持っている場合...

于 2012-09-10T18:22:39.670 に答える