2017-11-27 11 views
-1

私はカスタムビューを画面の周りにドラッグすることができます。タップすると別のビューが表示されますが、エミュレータで使用するとすべて正常に動作します。しかし、実際のデバイスでは、カスタムビューはクリック時に新しいビューを表示しません。そして、私は理由を理解するのに苦労しています。カスタムビューのオントーチリスナー

私はこの問題はある場合、これがあると思う: 私は、画面の左端側の見解を置くときに、他のビューにのみタップに示しているが、私は今<に記号>を変更した場合ビューは左端ではなく右端から開くことができます。

case MotionEvent.ACTION_MOVE: 
        if(motionEvent.getRawX() > 120 && motionEvent.getRawY() > 120){ 
         params.x = initialX + (int) (motionEvent.getRawX() - initialTouchX); 
         params.y = initialY + (int) (motionEvent.getRawY() - initialTouchY); 
         mWindowManager.updateViewLayout(entireLayout, params); 

         moving = true; 
        } 

これは完全なコードです:任意の助けを事前に

collapsedLayout.setOnTouchListener(new View.OnTouchListener() { 
     private int initialX; 
     private int initialY; 
     private float initialTouchX; 
     private float initialTouchY; 
     @Override 
     public boolean onTouch(View view, MotionEvent motionEvent) { 
      switch (motionEvent.getAction()){ 
       case MotionEvent.ACTION_DOWN: 
        initialX = params.x; 
        initialY = params.y; 
        initialTouchX = motionEvent.getRawX(); 
        initialTouchY = motionEvent.getRawY(); 

        return true; 

       case MotionEvent.ACTION_MOVE: 
        if(motionEvent.getRawX() > 120 && motionEvent.getRawY() > 120){ 
         params.x = initialX + (int) (motionEvent.getRawX() - initialTouchX); 
         params.y = initialY + (int) (motionEvent.getRawY() - initialTouchY); 
         mWindowManager.updateViewLayout(entireLayout, params); 

         moving = true; 
        } 
        return true; 

       case MotionEvent.ACTION_UP: 

        if(moving){ 
         if (params.x > 0) { 
          params.x = (int) dpWidth; 
         } else if (params.x < 0) { 
          params.x = (int) dpWidth * -1; 
         } 
         mWindowManager.updateViewLayout(entireLayout, params); 
         moving = false; 
        }else { 
         collapsedLayout.setVisibility(View.GONE); 
         expandedLayout.setVisibility(View.VISIBLE); 
        } 
        return true; 
      } 
      return false; 
     } 
    }); 

ありがとう!

+1

をあなたの '本当に動いている。 タップにタッチリスナーの代わりにクリックリスナーを使用するか、アップイベントのタイムフレームを追加することを検討してください(たとえば、アップイベントがダウンから1秒以内にクリックされた場合) – RobVoisey

+1

一部のログは、どのイベントがコールされたかをいつでも確認できます。 – jorjSB

+0

@RobVoiseyはい、あなたが正しいです、私はドラッグするためのonTouchとビューを表示するためのonclickリスナーを実装するために行った。もう少し前に自分自身で試してみましたが、うまくいかなかったので、それを実現する方法をチェックしました。そしてそれは最終的にうまくいった!ハハ。ありがとうございました! –

答えて

0

私はRobVoiseyのおかげです方法についての方法を見つけました。私は、ビューのドラッグのためのオントゥーのリスナーと、タップされたときのビューの表示のためのクリックリスナーを実装しました。私は、このソリューションhow to use both Ontouch and Onclick for an ImageButton?

を使用して実装するためにそれが答え見たい人のために、このようなものです:あなたはそれがまだ設定されてACTION_MOVEイベントをやっているかもしれない「タップ」するとき

private GestureDetector gestureDetector; 

    public void displayOverlay() { 
    gestureDetector = new GestureDetector(this, new SingleTapConfirm()); 

    @Override 
     public boolean onTouch(View v, MotionEvent event) { 

      if (gestureDetector.onTouchEvent(event)) { 

       return true; 
      } else { 
       switch (event.getAction()) { 
        case MotionEvent.ACTION_DOWN: 
         initialX = params.x; 
         initialY = params.y; 
         initialTouchX = event.getRawX(); 
         initialTouchY = event.getRawY(); 
         return true; 

        case MotionEvent.ACTION_UP: 
         if (params.x > 0) { 
          params.x = (int) dpWidth; 
         } else if (params.x < 0) { 
          params.x = (int) dpWidth * -1; 
         } 
         mWindowManager.updateViewLayout(entireLayout, params); 
         return true; 

        case MotionEvent.ACTION_MOVE: 
         params.x = initialX + (int) (event.getRawX() - initialTouchX); 
         params.y = initialY + (int) (event.getRawY() - initialTouchY); 
         mWindowManager.updateViewLayout(entireLayout, params); 
         return true; 
       } 
      } 
      return false; 
     } 
    }); 
    } 


private class SingleTapConfirm extends GestureDetector.SimpleOnGestureListener { 
    @Override 
    public boolean onSingleTapUp(MotionEvent event) { 
     collapsedLayout.setVisibility(View.GONE); 
     expandedLayout.setVisibility(View.VISIBLE); 

     return true; 
    } 
} 
関連する問題