2012-02-11 59 views
1

我已经扩展了android视图类,现在我想在视图中定义一个方法,当视图是longClicked时启动。扩展视图和使用onLongclick

我已经有使用public boolean onTouchEvent(MotionEvent event)的motionevents的操作。此方法不允许长时间点击进行操作。

我想在扩展视图类本身。我知道我可以将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和卡列斯超级

回答

0

您可以发布您的onTouchEvent()方法?

我想你必须在你的触摸事件回调中实现longpress的参数作为逻辑。

为了做到这一点你必须测试的一个长按的“模式”

像如果(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; 

} 

} 
+0

我已经关于测量时间,但由于android有一个内置的onLongClickListener我很容易用它来实现它。我已经添加了我的onTouchEvent()方法,删除了不相关的代码,但我认为它不会有所帮助。 – 2012-02-11 14:44:55

+0

经过深思后,我认为你是对的,看我的编辑。 – FoamyGuy 2012-02-11 17:28:50

+0

我试过你的方法,但是当我长时间点击视图时没有任何反应。只有一件事我可以想到,可以防止它触发,这是onTouchEvent,这是在启动帖子中重写。 – 2012-02-11 17:58:27

2

在你看来,你可以利用GestureDetectorOnGestureListener来实现这一点。形式上,你应该为你的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. 
} 
+0

重写的onTouchEvent()方法中发生了什么?为什么你返回一个布尔值如果为真,而返回类型是无效的? – 2012-02-11 14:52:16

+0

对不起,这是错字。在onTouchEvent()中,** GestureDetector **正在获取MotionEvent,并触发对** OnGestureListener **中定义的回调的相应响应。 OnTouchEvent中的布尔返回值指示事件是否被处理。 – 2012-02-11 14:56:42