1

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

我现在想做的是在不同位置的图像上绘制一个按钮并为其设置一个 onClick 事件,因此当用户按下该按钮时,它将打开一个新活动。

这是我到目前为止所拥有的......它在正确的位置绘制按钮,除了我的 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()
4

1 回答 1

1

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

onClick 侦听器不起作用的原因是因为您的布局从未注入到活动内容中,您只是在绘制它(我没想到它甚至会为创造力点数)此外,由于未附加布局和按钮对于任何我很确定它们会被垃圾收集的东西,这在这里当然是无关紧要的,只是说。

每次绘制画布时都会发生这种情况,这对性能或内存不利。

是否有某种原因,您不只是使用图像视图和按钮创建布局,然后在需要时移动按钮。

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

如果你告诉我们你为什么要这样做,我们可能会提供比这个实现更好的解决方案,这看起来确实没有必要或正确,但你可能有一个我想不出的正当理由。

更新

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

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

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

然后设置这些按钮的布局 x/y/visibilty

于 2011-07-27T14:06:09.150 回答