14

システム オーバーレイを開始するサービスがあります。オーバーレイが表示されている場合は、タッチ可能/タッチを検出したいが、その背後にある画面とのやり取りを保持したい (背後にあるとは、たとえばオーバーレイの隣にある基本的なアクティビティを意味します)。

私のオーバーレイは 128x128px のビットマップ/PNG です。描画されてクリックするとTOUCH!ログ、これは良いことです。しかし、画面の他の部分 (オーバーレイ以外) をクリックすると、TOUCH! が表示されます。その下の画面との対話は不可能です。

これが私のコードの一部です:

サービスを開始するための主なアクティビティ

buttonStart.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // start Service and return to Homescreen
                Intent i = new Intent(MainActivity.this, MyService.class);
                startService(i);                

                Intent newActivity = new Intent(Intent.ACTION_MAIN); 
                newActivity.addCategory(Intent.CATEGORY_HOME);
                newActivity.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(newActivity);
            }
        });

サービス/ショーオーバーレイ

@Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        myOverlay = new Overlay(MyService.this);

        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.LEFT | Gravity.TOP;

        wm = (WindowManager) getSystemService(WINDOW_SERVICE);
        wm.addView(myOverlay, params);

        myOverlay.setAnimation(new Waiting(MyService.this, 0, 0));
        myOverlay.postInvalidate();

        return super.onStartCommand(intent, flags, startId);
    }

かぶせる

public MyOverlay(Context context) {
        super(context);     
        this.context = context;

        setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                Log.i("TOUCH!", event.getAction() + ", x:"+event.getX()+", y:"+event.getY());
                return false;
            }
        });
    }

私は何を間違っていますか?WindowManager.LayoutParams.TYPE_SYSTEM_ALERT の代わりに WindowManager.LayoutParams.TYPE_PHONE も試しましたが、同じ動作です。

フラグ FLAG_WATCH_OUTSIDE_TOUCH を使用していないのに、オーバーレイの横にタッチが登録されないのはなぜですか?

編集

問題が見つかったようですが、まだ解決方法がわかりません... オーバーレイに表示される画像は非常に小さく、問題ではありませんが、オーバーレイ自体はフルスクリーンです (!)

Overlay / onTouch() イベントに次のログを追加しました。

Log.i("TOUCH!", "View: "+v.toString() +", size="+ v.getWidth()+"/"+v.getHeight());

View: package.overlay.myOverlay, size=480/762

サービスに次の行を追加して、全画面表示にならないようにしました。

    @Override
        public int onStartCommand(Intent intent, int flags, int startId) {

            myOverlay = new Overlay(MyService.this);
//HERE
myOVerlay.setLayoutParams(new ViewGroup.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

            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.LEFT | Gravity.TOP;

            wm = (WindowManager) getSystemService(WINDOW_SERVICE);
            wm.addView(myOverlay, params);

            myOverlay.setAnimation(new Waiting(MyService.this, 0, 0));
            myOverlay.postInvalidate();

            return super.onStartCommand(intent, flags, startId);
        }

しかし、それは役に立ちません...それでもmyOverlayのサイズは480x762です...なぜそんなに大きいのですか?含まれている画像のサイズにするにはどうすればよいですか?

4

3 に答える 3

14

これは私のために働いた:

WindowManager.LayoutParams params = new WindowManager.LayoutParams();
params.height = WindowManager.LayoutParams.WRAP_CONTENT;
params.width = WindowManager.LayoutParams.WRAP_CONTENT;
params.type = WindowManager.LayoutParams.TYPE_TOAST;
params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
    | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
    | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;

Viewに を追加するときにこの LayoutParams を使用するWindowManagerと、クリックを受信できなくなります。これTYPE_TOASTで十分な可能性がありますが、念のためフラグを追加しました。

于 2014-10-27T06:51:17.380 に答える