2011-12-26 23 views
2

私はfolowingコードを持っています、それは基本的にウィンドウの上に透明な四角形を描画します。 イベントを下のウィンドウに送信する代わりに、この長方形のタッチイベントをインターセプトしたいと考えています。 私はonInterceptTouchEvent、onTouchEventを試しましたが、四角形の内側をクリックすると、タッチは四角形の後ろのウィンドウで受け取ります。オーバーレイウィンドウでタッチイベントを取得するにはどうすればよいですか?

public class TestService extends Service { 
    HUDView mView; 
    int ScreenHeight; 
    int ScreenWidth; 

    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    @Override 
    public void onCreate() { 
     try { 
     super.onCreate(); 
     WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); 
     ScreenHeight=wm.getDefaultDisplay().getHeight(); 
     ScreenWidth=wm.getDefaultDisplay().getWidth(); 

     mView = new HUDView(this,ScreenHeight,ScreenWidth); 
     WindowManager.LayoutParams params = new WindowManager.LayoutParams(
       WindowManager.LayoutParams.WRAP_CONTENT, 
       WindowManager.LayoutParams.WRAP_CONTENT, 
       WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, 

       WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE 
      // | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE 
       | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL 
         | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN 
         | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR 
         , 
       PixelFormat.TRANSLUCENT); 
     //params.gravity = Gravity.RIGHT | Gravity.TOP; 
     wm.addView(mView, params); 

     } 
     catch (Exception e) { 
     e.printStackTrace(); 
     } 
    } 



    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     Toast.makeText(getBaseContext(),"onDestroy", Toast.LENGTH_LONG).show(); 
     if(mView != null) 
     { 
      ((WindowManager) getSystemService(WINDOW_SERVICE)).removeView(mView); 
      mView = null; 
     } 
    } 
} 

class HUDView extends ViewGroup { 
    private Paint mLoadPaint; 
    private int ScreenHeight; 
    private int ScreenWidth; 


    public HUDView(Context context, int WH, int WW) { 
     super(context); 
     ScreenHeight=WH; 
     ScreenWidth=WW; 
     // Toast.makeText(getContext(),"HUDView", Toast.LENGTH_LONG).show(); 

     mLoadPaint = new Paint(); 
     mLoadPaint.setARGB(100, 0, 0, 0); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 

     canvas.drawRect(0,0, 100, 100, mLoadPaint); 
     //canvas.drawText("Hello World", 5, 15, mLoadPaint); 
    } 


    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
//if (event.getAction() == MotionEvent.ACTION_DOWN) { 
    // Toast.makeText(getContext(), "onInterceptTouchEvent : " + event.getAction(),Toast.LENGTH_LONG); 
//} 
     Log.d("bThere", "X: " + (int)event.getX() + " Y: " + (int)event.getY()); 
     return true; 

    } 


    @Override 
    public boolean onInterceptTouchEvent(MotionEvent event) { 
     //super.onInterceptTouchEvent(event); 
     Toast.makeText(getContext(), "onInterceptTouchEvent : " + event.getAction(),Toast.LENGTH_LONG); 
     return true; 
    } 


    @Override 
    protected void onLayout(boolean arg0, int arg1, int arg2, int arg3, int arg4) { 
    } 

} 
+0

最後に何をしましたか? – Anand

答えて

0

あなたがタッチを処理したいviewfocusを設定してみてください。お使いのWindowsの種類がTYPE_SYSTEM_OVERLAYであればここで

+0

それはそれを助けなかった、それ以上の提案? –

0

コードがAOSPのPhoneWindowManager.java

@Override 
public void adjustWindowParamsLw(WindowManager.LayoutParams attrs) { 
    switch (attrs.type) { 
     case TYPE_SYSTEM_OVERLAY: 
     case TYPE_SECURE_SYSTEM_OVERLAY: 
      // These types of windows can't receive input events. 
      attrs.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE 
        | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE; 
      attrs.flags &= ~WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH; 
      break; 
.... 
} 

であるので、基本的には、システムが自動的にフラグWindowManager.LayoutParams.FLAG_NOT_TOUCHABLEを追加します。したがって、ウィンドウにはタッチイベントは発生しません。

関連する問題