Android 如何在 Canvas onDraw 方法中创建 onClick 事件

标签 android onclick listener ondraw android-canvas

我四处寻找,仍然找不到好的答案。我创建了自己的扩展 imageView 的类,并且在 onDraw() 方法中我使用 Canvas 在我的图像上绘制圆圈。

不过,我现在想做的是在不同位置的图像上绘制一个按钮,并为它设置一个 onClick 事件,这样当用户按下该按钮时,它将打开一个新 Activity ..

这是我目前所拥有的..它在正确的位置绘制按钮,除了我的 onClick 方法没有触发

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

        //1.arrayList Points. 2.arrayLists for points in X, 3.arrayList for points in Y
        for(int i=0; i<arrayListPoints.size(); i++){


             Button b = new Button(mContext);
             LinearLayout ll = new LinearLayout(mContext);
             LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
             layoutParams.setMargins(alPoints_x.get(i), alPoints_y.get(i), 0, 0);

             ll.addView(b, layoutParams);

            //Measure and layout the linear layout before drawing it
             ll.measure(MeasureSpec.getSize(ll.getMeasuredWidth()), MeasureSpec.getSize(ll.getMeasuredHeight()));
             ll.layout(0, 0, MeasureSpec.getSize(b.getMeasuredWidth()), MeasureSpec.getSize(b.getMeasuredHeight()));
             //Finally draw the linear layout on the canvas
             ll.draw(canvas);


            //create an onClick event for the button
            b.setOnClickListener(new OnClickListener() {
                 @Override
                 public void onClick(View v) {

                     Toast msg = Toast.makeText(mContext, "button clicked \n", Toast.LENGTH_LONG);
                     msg.show(); 

                 } //end of public void

            });

        }


    invalidate();   

}   //end of onDraw()

最佳答案

我不得不说这种方法可能有目的,但我没有看到。为什么每次重新绘制 ImageView 时都要重新创建和绘制布局?

onClick 监听器不起作用的原因是因为您的布局从未注入(inject)到 Activity 内容中,您只是在绘制它(我不认为这甚至可以工作,所以创意点)也因为布局和按钮不依附于任何东西我很确定它们会被垃圾收集,当然这在这里无关紧要,只是说说。

此外,每次您绘制 Canvas 时都会发生这种情况,这对性能或内存不利。

是否有某些原因导致您不只是使用 imageview 和按钮创建布局,然后在需要时移动按钮。

如果您坚持使用这种方法,我能想到的唯一“解决方案”是跟踪 ImageView 中按钮的矩形,然后检查是否在绘制按钮的区域内“单击”了运动事件.

如果您告诉我们您尝试这样做的原因,我们可能会提供比此实现更好的解决方案,这看起来确实没有必要或不正确,但您可能有我想不到的正当理由。

更新

所以我认为根据您的评论您想要做的是

将 AbsoluteLayout 容器放在您的 map 上(填充父级)或将 map 放在这样的容器中,无论哪种方式。

然后将按钮放入该布局容器中(通过 xml 或以编程方式,并不重要)

然后设置这些按钮的布局 x/y/可见性

关于Android 如何在 Canvas onDraw 方法中创建 onClick 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6845129/

相关文章:

android - "putExtra"是如何工作的?

Javascript img onclick 总是点击所有 img,无法捕捉到点击的正确 img

Java(Swing)监听按键事件

android - 如何获取 View 的监听器

java - 选中/取消选中 CheckboxCell,单击一行 - GWT

symfony - 登录前添加监听器

android - 如何制作类似 Flipboard 的应用程序?

android - 如何获取 ListAdapter<Model,ViewHolder::class> 的列表

java - Libgdx - 文本字段,显示键盘输入字段

android - 在 onClick 函数期间的 for 循环中多次更改 ImageView 图像?