2016-10-27 2 views
1

안녕하세요 여러분은 epubreader를 만들고 webview에서 책을로드하고 있습니다. webview 스크롤을 가로로 CSS 규칙을 추가했습니다. 이제 화면 너비에 따라 페이지를 넘기기 위해 좌우로 스 와이프를 추가했습니다. 난 제스처는 좌우가 미세하지만 기본 작업이 클래스를WebView TextSelection이 MotionEvent를 추가 한 후 사라졌습니다.

public class OnSwipeTouchListener implements OnTouchListener { 

private final GestureDetector gestureDetector; 

public OnSwipeTouchListener(Context context) { 
    gestureDetector = new GestureDetector(context, new GestureListener()); 
} 

public void onSwipeLeft() { 
} 

public void onSwipeRight() { 
} 

public boolean onTouch(View v, MotionEvent event) { 
    return gestureDetector.onTouchEvent(event); 
} 

private final class GestureListener extends SimpleOnGestureListener { 

    private static final int SWIPE_DISTANCE_THRESHOLD = 100; 
    private static final int SWIPE_VELOCITY_THRESHOLD = 100; 

    @Override 
    public boolean onDown(MotionEvent e) { 
     return true; 
    } 

    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
     float distanceX = e2.getX() - e1.getX(); 
     float distanceY = e2.getY() - e1.getY(); 
     if (Math.abs(distanceX) > Math.abs(distanceY) && Math.abs(distanceX) > SWIPE_DISTANCE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) { 
      if (distanceX > 0) 
       onSwipeRight(); 
      else 
       onSwipeLeft(); 
      return true; 
     } 
     return false; 
    } 

} 
} 

를 사용하여 이제이

webView.setOnTouchListener(new OnSwipeTouchListener(this) { 
         @Override 
         public void onSwipeLeft() { 
          // Whatever 
          if(TotalPages>PresentPage){ 
          PresentPage++; 
          forward.start(); 
          webView.scrollTo(PresentPage*ScreenWidth, 0); 

          } 
          else{ 
           Toast.makeText(getApplicationContext(), "The End", 100).show(); 
          } 
         } 
         @Override 
         public void onSwipeRight() { 

          if(PresentPage>0) 
          { 
          PresentPage--; 
          back.start(); 
          webView.scrollTo(PresentPage*ScreenWidth, 0); 
          } 
         } 
        }); 

과 같이 구현 내 주요 활동으로 왼쪽에서 오른쪽으로 스 와이프 기능을 감지 할 수있는 화면을 가지고 텍스트 선택 기능 (예 : 길게 누르면 텍스트 선택)가 사라졌습니다. 스 와이프 감지로 기본 텍스트 선택을 원합니다. 어떻게받을 수 있습니까?

답변

1

이 클래스를 사용하여 해결 사전에 감사 당신은 여전히 ​​기본 텍스트 선택 옵션

이있을 것이다,이 후
public class OnSwipeTouchListener implements OnTouchListener { 

private final GestureDetector gestureDetector; 
private static final int MAX_CLICK_DURATION = 1000; 
private static final int MAX_CLICK_DISTANCE = 15; 
static Context mcontext; 
private long pressStartTime; 
private float pressedX; 
private float pressedY; 
private boolean stayedWithinClickDistance; 

public OnSwipeTouchListener(Context context) { 
    gestureDetector = new GestureDetector(context, new GestureListener()); 
    this.mcontext=context; 
} 

public void onSwipeLeft() { 
} 

public void onSwipeRight() { 
} 
public void newTouch(){ 

} 
public boolean onTouch(View v, MotionEvent event) { 
     gestureDetector.onTouchEvent(event); 

    if(event.getAction()== MotionEvent.ACTION_MOVE) 
    { 
      if (stayedWithinClickDistance && distance(pressedX, pressedY, event.getX(), event.getY()) > MAX_CLICK_DISTANCE) { 
       stayedWithinClickDistance = false; 
      } 
     return true; 
    } 

    else if (event.getAction()== MotionEvent.ACTION_DOWN) { 
     pressStartTime = System.currentTimeMillis();     
     pressedX = event.getX(); 
     pressedY = event.getY(); 
     stayedWithinClickDistance = true; 

     return v.onTouchEvent(event); 
    } 
    else if(event.getAction()== MotionEvent.ACTION_UP) { 

     long pressDuration = System.currentTimeMillis() - pressStartTime; 
     if (pressDuration < MAX_CLICK_DURATION && stayedWithinClickDistance) { 
      newTouch(); 
     } 

     return v.onTouchEvent(event); 
    } 
    else{ 
     return v.onTouchEvent(event); 
    } 

} 
private static float distance(float x1, float y1, float x2, float y2) { 
    float dx = x1 - x2; 
    float dy = y1 - y2; 
    float distanceInPx = (float) Math.sqrt(dx * dx + dy * dy); 
    return pxToDp(distanceInPx); 
} 

private static float pxToDp(float px) { 
    return px/mcontext.getResources().getDisplayMetrics().density; 
} 


private final class GestureListener extends SimpleOnGestureListener { 

    private static final int SWIPE_DISTANCE_THRESHOLD = 100; 
    private static final int SWIPE_VELOCITY_THRESHOLD = 100; 

    @Override 
    public boolean onDown(MotionEvent e) { 
     return true; 
    } 

    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
     float distanceX = e2.getX() - e1.getX(); 
     float distanceY = e2.getY() - e1.getY(); 
     if (Math.abs(distanceX) > Math.abs(distanceY) && Math.abs(distanceX) > SWIPE_DISTANCE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) { 
      if (distanceX > 0) 
       onSwipeRight(); 
      else 
       onSwipeLeft(); 
      return true; 
     } 
     return false; 
    } 

} 


} 

및 주요 활동

webView.setOnTouchListener(new OnSwipeTouchListener(this) { 
         @Override 
         public void onSwipeLeft() { 
          // Whatever 
          // for swiping left action 
          } 

         @Override 
         public void onSwipeRight() { 
          // TODO Auto-generated method stub 

          //for swiping right action 

         } 
         @Override 
         public void newTouch() { 

          // for single tap action 

         } 

        }); 

에서

관련 문제