将触摸事件传递到当前视图下方的屏幕 - Android
Pass Touch Events to Screen below current view - Android
我有一个 class 从 View
扩展
public class SideLightView extends View {
...
...
...
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
width = getWidth();
height = getHeight();
if (GlobalValues.DEBUG_MODE) Log.e(TAG, "Screen Width : " + width + "
Height : " + height);
paint.setAntiAlias(true);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(strokeWidth);
// paint.setColor(color);
path.moveTo(0, 0);
path.lineTo(0, height);
path.lineTo(width, height);
path.lineTo(width, 0);
path.lineTo(0, 0);
paint.setShader(new LinearGradient(0, 0, 0, height, top_color,
bottom_color, Shader.TileMode.CLAMP));
canvas.drawPath(path, paint);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// super.onTouchEvent(event);
return false;
}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
// super.dispatchTouchEvent(event);
return false;
}
}
我正在使用 Window 管理器在服务 class 中添加此视图,如下所示:
mWindowManager = (WindowManager) mContext.getSystemService(WINDOW_SERVICE);
int LAYOUT_FLAG;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
LAYOUT_FLAG = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
// for solving error window type 2006
} else {
LAYOUT_FLAG = WindowManager.LayoutParams.TYPE_PHONE; // for solving
error window type 2038
}
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT,
LAYOUT_FLAG,
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
// | WindowManager.LayoutParams.FLAG_FULLSCREEN
| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
| WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
| WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
PixelFormat.TRANSPARENT);
params.gravity = Gravity.LEFT;
sideLightView = new SideLightView(mContext);
sideLightView.setClickable(false);
sideLightView.setFocusable(false);
mWindowManager.addView(sideLightView, params);
Animation fade_in_out_animation = AnimationUtils.loadAnimation(mContext,
R.anim.fade_in_and_out);
fade_in_out_animation.setDuration(800);
sideLightView.setStrokeWidth(40);
sideLightView.startAnimation(fade_in_out_animation);
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
removeView();
}
}, utility.getSideLigthDuration() * 1000); //adding 3 sec delay
我的目标是在锁定屏幕上显示此视图,以便用户在其他应用程序上需要几秒钟的时间,但因为它在屏幕周围只有一个笔画大小的矩形框,而在中心部分完全没有其他内容,它仍然是空的或透明的它显示正确,但也消耗了我的触摸事件。
每当此视图显示在屏幕上时,它都会消耗触摸事件,并且用户感觉 phone 被绞死了几秒钟。
我想禁用此视图的触摸监听,最重要的是将所有触摸事件传递给下面的任何屏幕,就像用户在出现此视图时正常使用一样
我尝试了什么:
- 我覆盖了视图的 onTouchEvent 和 dispatchTouchEvent 方法并返回了 false - 没有变化。
- 两种覆盖方法都返回真 - 无变化
- 我将 Clickable 和 Focusable 设置为 false - 无变化
- 我尝试删除和添加标志:FLAG_NOT_TOUCH_MODAL、FLAG_NOT_FOCUSABLE、FLAG_WATCH_OUTSIDE_TOUCH - 无变化
如果有人能弄清楚这个案子。
提前致谢。
您可以尝试先设置focusable= "false"
和enabled="false
作为父布局。
现在,在您的子视图上实现 OnTouchListener,并且在从子视图接收到触摸事件时 return 为真。
child_view.setOnTouchListener(new OnTouchListener(){
@Override
public boolean onTouch(View arg0, MotionEvent arg1) {
// your code here.
return true;
}
});
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
PixelFormat.TRANSPARENT);
添加 WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE 标志应该可以解决您的问题。
我有一个 class 从 View
扩展public class SideLightView extends View {
...
...
...
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
width = getWidth();
height = getHeight();
if (GlobalValues.DEBUG_MODE) Log.e(TAG, "Screen Width : " + width + "
Height : " + height);
paint.setAntiAlias(true);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(strokeWidth);
// paint.setColor(color);
path.moveTo(0, 0);
path.lineTo(0, height);
path.lineTo(width, height);
path.lineTo(width, 0);
path.lineTo(0, 0);
paint.setShader(new LinearGradient(0, 0, 0, height, top_color,
bottom_color, Shader.TileMode.CLAMP));
canvas.drawPath(path, paint);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// super.onTouchEvent(event);
return false;
}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
// super.dispatchTouchEvent(event);
return false;
}
}
我正在使用 Window 管理器在服务 class 中添加此视图,如下所示:
mWindowManager = (WindowManager) mContext.getSystemService(WINDOW_SERVICE);
int LAYOUT_FLAG;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
LAYOUT_FLAG = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
// for solving error window type 2006
} else {
LAYOUT_FLAG = WindowManager.LayoutParams.TYPE_PHONE; // for solving
error window type 2038
}
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT,
LAYOUT_FLAG,
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
// | WindowManager.LayoutParams.FLAG_FULLSCREEN
| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
| WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
| WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
PixelFormat.TRANSPARENT);
params.gravity = Gravity.LEFT;
sideLightView = new SideLightView(mContext);
sideLightView.setClickable(false);
sideLightView.setFocusable(false);
mWindowManager.addView(sideLightView, params);
Animation fade_in_out_animation = AnimationUtils.loadAnimation(mContext,
R.anim.fade_in_and_out);
fade_in_out_animation.setDuration(800);
sideLightView.setStrokeWidth(40);
sideLightView.startAnimation(fade_in_out_animation);
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
removeView();
}
}, utility.getSideLigthDuration() * 1000); //adding 3 sec delay
我的目标是在锁定屏幕上显示此视图,以便用户在其他应用程序上需要几秒钟的时间,但因为它在屏幕周围只有一个笔画大小的矩形框,而在中心部分完全没有其他内容,它仍然是空的或透明的它显示正确,但也消耗了我的触摸事件。
每当此视图显示在屏幕上时,它都会消耗触摸事件,并且用户感觉 phone 被绞死了几秒钟。
我想禁用此视图的触摸监听,最重要的是将所有触摸事件传递给下面的任何屏幕,就像用户在出现此视图时正常使用一样
我尝试了什么:
- 我覆盖了视图的 onTouchEvent 和 dispatchTouchEvent 方法并返回了 false - 没有变化。
- 两种覆盖方法都返回真 - 无变化
- 我将 Clickable 和 Focusable 设置为 false - 无变化
- 我尝试删除和添加标志:FLAG_NOT_TOUCH_MODAL、FLAG_NOT_FOCUSABLE、FLAG_WATCH_OUTSIDE_TOUCH - 无变化
如果有人能弄清楚这个案子。 提前致谢。
您可以尝试先设置focusable= "false"
和enabled="false
作为父布局。
现在,在您的子视图上实现 OnTouchListener,并且在从子视图接收到触摸事件时 return 为真。
child_view.setOnTouchListener(new OnTouchListener(){
@Override
public boolean onTouch(View arg0, MotionEvent arg1) {
// your code here.
return true;
}
});
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
PixelFormat.TRANSPARENT);
添加 WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE 标志应该可以解决您的问题。