You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 19:24:49