10

Swappsに似たアプリを開発するのが好きです。任意の画面の上にボタンを表示しようとしていますが、これはスワイプ操作でのみ発生するはずです。以下のコードで試しました

    WindowManager.LayoutParams params = new WindowManager.LayoutParams();
    params.type =WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY;
    params.flags = WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
    params.format =PixelFormat.TRANSLUCENT; 
    params.height = WindowManager.LayoutParams.WRAP_CONTENT;
    params.width = WindowManager.LayoutParams.WRAP_CONTENT;
    parentlay = new LinearLayout(this);
    mybt = new Button(getApplicationContext());
    bt.setText("Click to Go");

    parentlay.setBackgroundColor(Color.TRANSPARENT);
    parentlay.setHapticFeedbackEnabled(true);
    parentlay.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
                // event.getAction() prints 4 and not able to get up or down event
           }
       });
   windowmanager.addView(parentlay, params);

そのイベントをキャプチャして実行することにより、ユーザーが左から右にスワイプしたときにボタンを表示しようとしています

    parentlay.addView(bt);

ユーザーが右から左にスワイプすると、ビューが削除されます

    parentlay.removeView(bt);

前述のように、タイプを TYPE_SYSTEM_ALERT に変更しない限り、モーションイベントを取得できませんが、その結果、すべての画面がフリーズし、戻るボタンまたはホームボタンをクリックできなくなります。これを行う別の方法はありますか?

以下の変更を試しました

    params.type =WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
    params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
    |WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
   |WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;

    params.height = WindowManager.LayoutParams.MATCH_PARENT;
    params.width = WindowManager.LayoutParams.MATCH_PARENT;

しかし、下のボタンをクリックできませんでした。MATCH_PARTENT が原因である可能性がありますが、wrap_content に設定すると、クリック イベントを取得できません。

4

4 に答える 4

8

ビューを非表示にするには、mWindowManager.removeView(mOverlay); を呼び出す必要があります。

private RelativeLayout mOverlay;
        private WindowManager mWindowManager;   
     WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                        WindowManager.LayoutParams.WRAP_CONTENT,
                        WindowManager.LayoutParams.WRAP_CONTENT,
                        WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
                        WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                                | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
                        PixelFormat.TRANSLUCENT);
                params.gravity = Gravity.TOP;
                LayoutInflater inflater = (LayoutInflater) context
                        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                mOverlay = (RelativeLayout) inflater
                        .inflate(R.layout.phasechange, null);

                mWindowManager = (WindowManager) context
                        .getSystemService(Context.WINDOW_SERVICE);
                mWindowManager.addView(mOverlay, params);
                Button b = (Button) mOverlay.findViewById(R.id.button1);
                b.setOnClickListener(new OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        // TODO Auto-generated method stub
                        mWindowManager.removeView(mOverlay);
                    }
                });

            }
于 2013-02-26T19:50:32.917 に答える
1

このタスクに対するあなたのアプローチは非常に珍しいものです。新しいビューを追加するだけで、タスクはうまく処理されます。

次のコードを追加します。

RelativeLayout layout = new RelativeLayout(this);
Button b = new Button(this);
b.setBackgroundColor(Color.LTGRAY);
b.setText("Click to Go");
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
params.addRule(RelativeLayout.CENTER_IN_PARENT);
b.setLayoutParams(params);
layout.addView(b);

//get a reference to your main layout:
ViewGroup myLayout = findViewById(R.id.whateverMayLayoutIdIs);
layout.addView(layout);

ビューを非表示にするには、レイアウトから削除するか、表示を変更します。

あなたが取り組んでいたアプローチは非常にトリッキーで、他の人はタッチの処理に問題を抱えていました。例には、Android : Multi touch と TYPE_SYSTEM_OVERLAYおよびTYPE_SYSTEM_OVERLAY内の GestureDetector が含まれます。このグーグル検索をもっと試してみてください。

于 2013-02-26T15:26:24.773 に答える