Canvas与FrameLayout中setOnClickListener点击事件失效问题
二维码扫描界面点击事件失效问题
我正在开发一个二维码扫描界面,背景为相机视图,上方有扫描动画。通过代码在底部添加两个ImageView并绘制在FrameLayout上,但ImageView及布局的点击事件均无效,替换为Button、ImageButton后设置setOnClickListener仍不生效。
已尝试的解决方法
- 为ImageView设置id(values/ids.xml),无效;
- 调用ImageView的
bringToFront()方法,无效; - 设置布局为可点击、可聚焦,仍无效。
相关代码
Draw方法
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); Paint paint = new Paint(); if (!isUserPremium) { prepareAlertText(canvas); } drawKeyboardBtn(canvas); drawFlashButton(canvas); drawRectangleAndLine(canvas, paint); }
drawKeyboardBtn函数
private void drawKeyboardBtn(Canvas canvas) { int leftPadding = (int) (getWidth() * 0.23); int topPadding = (int) (getHeight() * 0.85); int layoutWidth = (int) (getHeight() * 0.1); int layoutHeight = (int) (getHeight() * 0.1); ImageView keyboardImageView = new ImageView(getContext()); FrameLayout frameLayout = new FrameLayout(getContext()); FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(layoutWidth, layoutHeight); layoutParams.setMargins(leftPadding, topPadding, 0, 0); keyboardImageView.setLayoutParams(layoutParams); keyboardImageView.setImageResource(R.drawable.ic_keyboard); keyboardImageView.setBackgroundResource(R.drawable.rounded_corner); keyboardImageView.setPadding(15, 15, 15, 15); frameLayout.setLayoutParams(layoutParams); frameLayout.addView(keyboardImageView); keyboardImageView.setClickable(true); keyboardImageView.setFocusable(true); keyboardImageView.setFocusableInTouchMode(true); //Also not worked //frameLayout.setClickable(true); //frameLayout.setFocusable(true); //frameLayout.setFocusableInTouchMode(true); //Also not worked // frameLayout.setOnClickListener(v -> { // Log.e("GraphicOverlay", "onClick: " + v.getId()); // Toast.makeText(v.getContext(), "Keyboard clicked", Toast.LENGTH_LONG).show(); // }); keyboardImageView.setOnClickListener(v -> { Log.e("GraphicOverlay", "onClick: " + v.getId()); Toast.makeText(v.getContext(), "Keyboard clicked", Toast.LENGTH_LONG).show(); }); frameLayout.measure(getWidth(), getHeight()); frameLayout.layout(leftPadding, topPadding, leftPadding, topPadding); frameLayout.draw(canvas); }
补充说明
- UI视图:底部叠加有键盘和闪光灯功能按钮,显示在相机预览层上方
- 完整代码可参考对应项目的android/src/main目录
内容的提问来源于stack exchange,提问作者Emin YAZAN
相关产品推荐
相关产品推荐

