我四处寻找,仍然找不到好的答案。我创建了自己的扩展 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/