我已经扩展了android View类,现在我想在视图中定义一个方法,该方法在视图被longClicked时启动。
我已经使用public boolean onTouchEvent(MotionEvent event)
对动作事件采取了行动。此方法不允许长时间点击以对其执行操作。
我想在扩展的View类本身中完成它。我知道我可以在活动中的视图中添加一个OnLongClickListener,但我想知道是否有办法在View中实现它。
public class ArchitectureView extends GraphView implements OnLongClickListener {
public ArchitectureView(Context context) {
super(context);
this.setOnLongClickListener(this);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_UP:
break;
case MotionEvent.ACTION_CANCEL:
break;
}
return true;
}
@Override
public boolean onLongClick(View v) {
Log.e("I've been", "longclicked");
return false;
}
}
GraphView从View扩展,并覆盖onTouchEvent和calles super
答案 0 :(得分:2)
在您看来,您可以使用GestureDetector
和OnGestureListener
来实现此目的。在形式上,您应该为View类实现OnGestureListener
并在您的类中定义GestureDetector
。
public class YourView extends View implements OnGestureListener {
private GestureDetector detector;
public YourView(Context context) {
super(context);
detector = new GestureDetector(context, this); // "this" refers to the OnGestureListener
}
// Override onTouchEvent to get the Touch event for the gesture detector.
@Override
public boolean onTouchEvent(MotionEvent e) {
boolean handled = detector.onTouchEvent(e);
if (handled) {
return true;
}
return super.onTouchEvent(e);
}
// Some override methods from the OnGestureListener interface
@Override
public void onLongPress(MotionEvent e) {
// Your implementation here
}
// Other override methods, for example, onScroll() etc.
}
答案 1 :(得分:0)
你可以发布你的onTouchEvent()方法吗?
我认为你必须在触摸事件回调中将longpress的参数实现为逻辑。
为了做到这一点,你必须测试longpress的“模式”
类似于if(ACTION_UP_TIME<(ACTION_DOWN_TIME + someMillis))
编辑:考虑到更多,你不能只在视图对象上实现OnLongClickListener,然后覆盖onLongClick()回调吗?像这样:
public class TestView extends View implements OnLongClickListener{
public TestView(Context context) {
super(context);
// TODO Auto-generated constructor stub
//I am not certain if you'd need the next line or not.
this.setOnLongClickListener(this);
}
@Override
public boolean onLongClick(View v){
//do things
return false;
}
}