我正在创建一个可重用的类,它实现了onclick和一个设置onclick的方法。该类将表示在画布上绘制的“按钮”。我知道使用x和y位置来评估按钮是否被按下。
如果查看代码,您可以看到实现的isPressed只返回此值(这仅适用于澄清)。
我需要的是能够为画布上绘制的每个项目提供一个独特的行为,这就是我尝试实现onclick监听器的原因
struct Person {
var first : String?
var last : String?
var full : String? {
if first == nil && last == nil { return nil }
let fi = p.first ?? ""
let la = p.last ?? ""
let both = !fi.isEmpty && !la.isEmpty
return fi + (both ? " " : "") + la
}
}
无法想象如何继续
更新:我认为我从提供的代码中给出了错误的印象。我正在尝试View.OnClickListener但这只是我认为的选项。任何行为与上述onclick监听器相似的方法都可以。
答案 0 :(得分:3)
OnClick需要格式为:
@Override
public void onClick(View v) {
if (ClickListener != null){
ClickListener.onClick(v);
}
//The code to reuse
}
答案 1 :(得分:1)
您只能将onClickListeners和onClick方法添加到视图中。画布及其中的任何内容都不是视图,也不可单击。内置可点击按钮的画布的唯一方法是将整个画布放在视图或扩展View的类中,覆盖onTouch方法,然后在该方法中获取触摸的位置并查看它们是否在边界内您可以运行一些代码。以下是其他一些StackOverflow问题的链接。
和
add touch event listener to android canvas
public class MyCanvasView extends View implements OnTouchListener {
Bitmap button1;
Bitmap button2;
Bitmap button3;
Bitmap button4;
public MyCanvasView(Context context) {
super(context);
setFocusable(true);
setFocusableInTouchMode(true);
this.setOnTouchListener(this);
}
public void onDraw(Canvas canvas) {
paint = new Paint();
canvas.drawBitmap(button1, 10, 10, paint);
canvas.drawBitmap(button2, 60, 10, paint);
canvas.drawBitmap(button3, 110, 10, paint);
canvas.drawBitmap(button4, 160, 10, paint);
}
@Override
public boolean onTouch(View v, MotionEvent event) {
int x = event.getX();
int y = event.getY();
if (x >= 60 && x <= (60 + canvasButtonWidth)){
if (y >= 10 && x <= (10 + canvasButtonHeight)) {
//Insert code you want to use when button2 is clicked
}
}
/*Copy and paste the pair of if statements above for each button you have
/drawn on the canvas*/
return true;
}
}
答案 2 :(得分:1)
感谢@mdtuyen's answer我能够装备一些对我有用的东西。 我实现了一个基础CanvasItem类,我现在可以继承它来完成这个技巧(我遗漏了不相关的类方法)
import android.view.View;
public class CanvasItem { //notice does not need to implement onClickListener
//this is used to get the click
private View.OnClickListener onClickListener;
protected CanvasItem(){
/* contructor logic goes here */
/* at minimum x and y and width and height is needed */
}
protected boolean isHit(float x, float y){
/* left() right() top() and bottom() use widths and height from my constructor */
/* x and y is passed from canvas ontouch */
if(x >= left() && x <= right() && y >= top() && y <= bottom()){
//fire any onclick listeners
if(onClickListener != null){
onClickListener.onClick(null);
}
//return true
return true;
}
//not touched
return false;
}
protected void setOnTouchListener(View.OnClickListener clickListener){
onClickListener = clickListener;
}
}
一旦实现了这个,我使用CanvasItem的ArrayList或者继承运行CanvasItem的类来确定isHit()
public boolean onTouchEvent(MotionEvent event) {
final int action = event.getAction();
float x = event.getX();
float y = event.getY();
switch (action & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
for(CanvasItem itm : mItems){
//if item istouched
if(itm.isHit(x, y)){
/* Logic can go here to alter any properties */
}
}
}
}
触发item.isHit()后,if语句中不需要任何内容,然后触发onClick。
是的,这实现了类似于通常所做的事情,但使用onClick我可以专门触摸操作而无需管理和跟踪画布上的项目,这对于可拖动项目来说是一个更大的任务在画布上