2012-02-11 57 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