【问题标题】:Anyone know how to attach a touch listener to this class?任何人都知道如何将触摸监听器附加到这个类?
【发布时间】:2011-05-03 16:53:09
【问题描述】:
package com.ewebapps;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.view.View;

public class Dot extends View {
     private final float x;
     private final float y;
     private final int r;
     private final Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
     private final Paint mWhite = new Paint(Paint.ANTI_ALIAS_FLAG);

     public Dot(Context context, float x, float y, int r) {
         super(context);
         mPaint.setColor(0xFF000000); //Black
         mWhite.setColor(0xFFFFFFFF); //White
         this.x = x;
         this.y = y;
         this.r = r;
     }

     @Override
     protected void onDraw(Canvas canvas) {
         super.onDraw(canvas);
         canvas.drawCircle(x, y, r+2, mWhite); //White stroke.
         canvas.drawCircle(x, y, r, mPaint); //Black circle.
     }

}

【问题讨论】:

  • 你想知道屏幕被点击了还是点击了哪里?
  • 我有很多这些类被计时器点击,我需要能够判断其中哪一个被点击了。

标签: android class view extend ontouchlistener


【解决方案1】:

嗯...创建自己的视图时,最好的方法是覆盖dispatchTouchEvent 方法。相信我,使用setOnTouchListeneronTouchEvent 在某些情况下效果不佳。这就是您在View 中要做的所有事情:

@Override
public boolean dispatchTouchEvent(MotionEvent event) {
    // put your logic here  

    return super.dispatchTouchEvent(event);
}

【讨论】:

  • 那么使用这种方法是否可以测试我在逻辑中单击了该类的哪个实例? (我创建了许多这样的类,我需要能够分辨出哪个类被点击了。)感谢大家的帮助!各地的其他人都无法回答我的问题!
  • 当然,你可以知道点击了哪个类的实例,毕竟你在逻辑部分所做的一切都属于那个实例。我认为您可以使用观察者设计模式来完全实现您的目标,所以继续努力吧!
  • 非常感谢到目前为止我尝试了所有这些答案,而你的答案是有效的。但是有一件事,无论如何要使它成为“私有”布尔值,以便该对象的所有其他实例都不会收到我的 this.invalidate();称呼? (当它用新的精灵重绘时。)
【解决方案2】:

documentation with example

View aView = (View)findViewById(R.id.DotView);
aView.setOnTouchListener(this);

Full Example Here

【讨论】:

  • 如果我有多个点视图,我是否能够使用您的方法确定点击了哪个?感谢您的帮助!
【解决方案3】:

Aaron Saunders 的回答适用于视图(如按钮),因为 onTouchListener 只告诉您点击了哪个视图,而不是确切的位置。如果您需要在不创建按钮的情况下准确了解事件的位置,请在您的活动类中尝试以下操作:

@Override onTouchEvent(MotionEvent event) { int _x = event.getX();
int _y = event.getY(); // do stuff }

注意:onTouchEvent 仅在事件未被视图处理时调用。
Documentation

(谁能告诉我如何添加换行符?)

【讨论】:

  • 所以我正在考虑为这个类添加一个名为 dotnumber 的参数,如果我有很多这个点的实例并且每个点的点号不同,我可以触摸它并让它告诉我使用这种方法的点号是多少?感谢支持,非常感谢我的朋友!
  • 是的,您可以使用传递给 onTouchEvent 的事件的 x 和 y 坐标来查看点击屏幕的位置是否与您的某个点相同。
猜你喜欢
  • 1970-01-01
  • 2021-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多