2012-02-11 8 views
1

アンドロイドのViewクラスを拡張しました。ビューをlongClickedにしたときに起動するビューでメソッドを定義します。ビューを拡張してonLongclickを使用する

私はすでに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はあなたのonTouchEvent()メソッドを投稿することができますビューから延長してもonTouchEventとcallesスーパー

答えて

0

を上書きしますか?

あなたはそのタッチイベントコールバックの中にロジックとしてlongpressのパラメータを実装する必要があると思います。あなたはlongpress

何かあれば同様(ACTION_UP_TIME <(ACTION_DOWN_TIME + someMillis))の "パターン" をテストする必要があると思いますそうするためには

EDIT:もっとそれについて考えたらビューオブジェクトに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

私は時間を測定するのは難しいですが、アンドロイドにはonLongClickListenerが組み込まれているので、簡単にそれを実現することができました。私は、onTouchEvent()メソッドを追加しました。無関係なコードは削除されましたが、何か助けになるとは思いません。 –

+0

もっと熟考した後、私はあなたが正しいと思う、私の編集を参照してください。 – FoamyGuy

+0

私はあなたの方法を試しましたが、私は長い間、ビューをクリックしても何も起こりません。トリガリングを防ぐことができると思うことが1つだけあり、それは最初の投稿にあるオーバーライドされたonTouchEventです。 –

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()メソッドで何が起こっていますか?戻り値の型がvoidのときにtrueの場合、なぜブール値を返すのですか? –

+0

申し訳ありませんが、誤植です。 onTouchEvent()では、** GestureDetector **がMotionEventを取得しており、対応する応答を** OnGestureListener **で定義されたコールバックに送信します。 OnTouchEventのブーリアンリターンは、イベントが処理されるかどうかを示します。 –

関連する問題