Android 如何让浮动图标拦截触摸事件?

Android 如何让浮动图标拦截触摸事件?,android,canvas,Android,Canvas,我希望每个应用程序或活动上都有一个浮动图标。这个代码工作正常,但是整个屏幕都检测到了触摸,我只想让浮动图标拦截点击,而不是整个屏幕,那么我该怎么做呢 public class FloatingButtonService extends Service { HUDView mView; @Override public void onCreate() { super.onCreate(); Toast.makeText(getBaseContext(), "floating b

我希望每个应用程序或活动上都有一个浮动图标。这个代码工作正常,但是整个屏幕都检测到了触摸,我只想让浮动图标拦截点击,而不是整个屏幕,那么我该怎么做呢

public class FloatingButtonService extends Service {
HUDView mView;

@Override
public void onCreate() {
    super.onCreate();

    Toast.makeText(getBaseContext(), "floating button created",
            Toast.LENGTH_SHORT).show();

    final Bitmap kangoo = BitmapFactory.decodeResource(getResources(),
            R.drawable.ic_launcher);

    WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            kangoo.getWidth(), kangoo.getHeight(),
            WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                    | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
                    | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
            PixelFormat.TRANSLUCENT);

    params.gravity = Gravity.LEFT | Gravity.BOTTOM;
    params.setTitle("Load Average");
    WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);

    mView = new HUDView(this, kangoo);

    mView.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View arg0, MotionEvent arg1) {
            // TODO Auto-generated method stub
            // Log.e("kordinatlar",
            // arg1.getX()+":"+arg1.getY()+":"+display.getHeight()+":"+kangoo.getHeight());
            if (arg1.getX() < kangoo.getWidth() & arg1.getY() > 0) {
                Log.d("tıklandı", "touch me");
            }
            return false;
        }
    });

    wm.addView(mView, params);

}

@Override
public IBinder onBind(Intent arg0) {
    // TODO Auto-generated method stub
    return null;
}

}

@SuppressLint("DrawAllocation")
class HUDView extends ViewGroup {

Bitmap kangoo;

public HUDView(Context context, Bitmap kangoo) {
    super(context);

    this.kangoo = kangoo;

}

protected void onDraw(Canvas canvas) {
    // super.onDraw(canvas);

    // delete below line if you want transparent back color, but to
    // understand the sizes use back color
    canvas.drawColor(Color.BLACK);

    canvas.drawBitmap(kangoo, 0, 0, null);

    // canvas.drawText("Hello World", 5, 15, mLoadPaint);

}

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

public boolean onTouchEvent(MotionEvent event) {
    Toast.makeText(getContext(), "touch detected!", Toast.LENGTH_SHORT).show();

    // return super.onTouchEvent(event);
    // Toast.makeText(getContext(),"onTouchEvent",
    // Toast.LENGTH_LONG).show();

    return true;
}
公共类浮动按钮服务扩展服务{
HUDView;
@凌驾
public void onCreate(){
super.onCreate();
Toast.makeText(getBaseContext(),“创建浮动按钮”,
吐司。长度(短)。show();
最终位图kangoo=BitmapFactory.decodeResource(getResources(),
R.可牵引ic_发射器);
WindowManager.LayoutParams params=新建WindowManager.LayoutParams(
kangoo.getWidth(),kangoo.getHeight(),
WindowManager.LayoutParams.TYPE\系统\警报,
WindowManager.LayoutParams.FLAG\u不可聚焦
|WindowManager.LayoutParams.FLAG_NOT_TOUCH_model
|WindowManager.LayoutParams.FLAG\u WATCH\u Out\u TOUCH,
像素格式(半透明);
params.gravity=gravity.LEFT | gravity.BOTTOM;
参数setTitle(“负荷平均值”);
WindowManager wm=(WindowManager)getSystemService(窗口服务);
mView=新的HUDView(这个,kangoo);
mView.setOnTouchListener(新的OnTouchListener(){
@凌驾
公共布尔onTouch(视图arg0、运动事件arg1){
//TODO自动生成的方法存根
//Log.e(“kordinatlar”,
//arg1.getX()+”:“+arg1.getY()+”:“+display.getHeight()+”:“+kangoo.getHeight());
if(arg1.getX()0){
Log.d(“tıklandı”,“触摸我”);
}
返回false;
}
});
wm.addView(mView,params);
}
@凌驾
公共IBinder onBind(意图arg0){
//TODO自动生成的方法存根
返回null;
}
}
@SuppressLint(“DrawAllocation”)
类HUDView扩展了视图组{
卡古;
公共HUD视图(上下文,位图){
超级(上下文);
this.kangoo=kangoo;
}
受保护的void onDraw(画布){
//super.onDraw(帆布);
//如果您想要透明的背景色,请删除下面的行,但要
//了解使用背色的尺寸
画布。drawColor(颜色。黑色);
drawBitmap(kangoo,0,0,null);
//画布.drawText(“Hello World”,5,15,mLoadPaint);
}
仅限受保护的void布局(布尔值arg0、int arg1、int arg2、int arg3、int arg4){
}
公共布尔onTouchEvent(运动事件){
Toast.makeText(getContext(),“touch detected!”,Toast.LENGTH_SHORT.show();
//返回super.onTouchEvent(事件);
//Toast.makeText(getContext(),“onTouchEvent”,
//Toast.LENGTH_LONG).show();
返回true;
}

}

尝试在onTouch事件中返回“true”。这会告诉底层视图事件已经被捕获(不要传播)。有没有代码片段?thanksat是您提供的唯一onTouch函数,将“return false”更改为“return true”。感谢它现在只适用于图标,但是它会被多次调用。我可以只指定一次触摸事件吗?哪一个是点击?您应该检查MotionEvent类型,并相应地采取行动!尝试在onTouch事件中返回“true”。这会告诉底层视图事件已经被捕获(不要传播)。有没有代码片段?thanksat是您提供的唯一onTouch函数,将“return false”更改为“return true”。感谢它现在只适用于图标,但是它会被多次调用。我可以只指定一次触摸事件吗?哪一个是点击?您应该检查MotionEvent类型,并相应地采取行动!