2012-04-26 1 views
6

이 코드를 사용하고 있으며 원하는대로 정확하게 작동합니다. 하지만 더블 탭에서 다른 기능을 구현해야하며 더블 탭 줌 기능을 비활성화하려고합니다 (그러나 핀치 줌 기능은 유지해야합니다).Android WebView는 setWideViewPort를 사용하여 더블 탭 줌을 사용 중지하지만 핀치 확대를 유지 하시겠습니까?

webView.getSettings().setLoadWithOverviewMode(true); 
webView.getSettings().setUseWideViewPort(true); 
webView.getSettings().setLayoutAlgorithm(LayoutAlgorithm.NORMAL); 
webView.getSettings().setBuiltInZoomControls(true); 
webView.getSettings().setSupportZoom(true); 
webView.setInitialScale(1); 

수동으로 규모를 계산하려고 시도했지만 운이 없었습니다 (이 경우 복잡함). Disable Double Tap Zoom/Unzoom on a webview

Android Webview - Webpage should fit the device screen

더블 탭 줌을 setUseWideViewPort 및 Zoomcontrolls를 사용하지만 비활성화하거나 재정의 할 수있는 방법이 있나요?

GestureDetector.SimpleOnGestureListener sogl = new GestureDetector.SimpleOnGestureListener() { 
    public boolean onDoubleTap(MotionEvent e) { 
     showToast("Double tap"); 
     return true; //instead of false 
    } 
} 
+0

당신이 doubletap 이벤트를 무시하는 코드를 추가 할 수 있습니다 같은 추가 WebViewClient 뷰가 확대 된 줌 배율을 복원 할 수 있습니다? – Ferdau

+0

MyWebView로 WebView를 확장하려고합니다. public MyWebView (FriarBook 컨텍스트) { \t super (컨텍스트); \t gd = new GestureDetector (context, sogl); \t \t } GestureDetector.SimpleOnGestureListener sogl = 새로운 GestureDetector.SimpleOnGestureListener() {공중 부울 onDoubleTap (MotionEvent 전자) { \t \t \t \t \t \t \t \t showToast를 ("번 탭"); \t \t \t \t \t \t \t \t \t \t \t \t \t \t 반환 거짓; \t \t \t \t \t \t \t은} ... 종류의 I는 안드로이드와 자바 ... onDoubleTap의 화재에 안돼서하지만 최우선 더블 탭 줌 없습니다. – jannej

+0

왜 투표가 실패 했습니까? – jannej

답변

12

최적의 솔루션을, 단지

public class HelpWebView extends WebView { 

    private GestureDetector gestureDetector; 
    private AtomicBoolean mPreventAction = new AtomicBoolean(false); 
    private AtomicLong mPreventActionTime = new AtomicLong(0); 

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

    public HelpWebView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     gestureDetector = new GestureDetector(context, new GestureListener()); 
    } 

    public HelpWebView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     gestureDetector = new GestureDetector(context, new GestureListener()); 
    } 

    public HelpWebView(Context context, AttributeSet attrs, int defStyle, boolean privateBrowsing) { 
     super(context, attrs, defStyle, privateBrowsing); 
     gestureDetector = new GestureDetector(context, new GestureListener()); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     int index = (event.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT; 
     int pointId = event.getPointerId(index); 

     // just use one(first) finger, prevent double tap with two and more fingers 
     if (pointId == 0){ 
      gestureDetector.onTouchEvent(event); 

      if (mPreventAction.get()){ 
       if (System.currentTimeMillis() - mPreventActionTime.get() > ViewConfiguration.getDoubleTapTimeout()){ 
        mPreventAction.set(false); 
       } else { 
        return true; 
       } 
      } 

      return super.onTouchEvent(event); 
     } else { 
      return true; 
     } 
    } 

    private class GestureListener extends GestureDetector.SimpleOnGestureListener { 
     @Override 
     public boolean onDoubleTap(MotionEvent e) { 
      mPreventAction.set(true); 
      mPreventActionTime.set(System.currentTimeMillis()); 
      return true; 
     } 
     @Override 
     public boolean onDoubleTapEvent(MotionEvent e) { 
      mPreventAction.set(true); 
      mPreventActionTime.set(System.currentTimeMillis()); 
      return true; 
     } 
    } 
} 
MyWebView

에서 웹보기를 확장
1

미안 해요, 난 이것을 테스트하지만 시도 할 시간이없는

class MyWebView extends WebView { 

    public boolean onTouchEvent(MotionEvent event) { 

      gd.onTouchEvent(event); 

      // disable double tap zooming 

     if(doubleTap) 
      { 
       doubleTap = false; 
       return false; 
      } 

      return super.onTouchEvent(event); 
     } 


    GestureDetector.SimpleOnGestureListener sogl = new GestureDetector.SimpleOnGestureListener() { 




      public boolean onDoubleTap(MotionEvent e) { 

        showToast("Double tap"); 
        doubleTap = true; 

        return false; 
      }   
} 
+0

입력 해 주셔서 감사 합니다만 반환 값이 만료되었지만 아무런 차이가없는 것으로 보입니다. 이상한. – jannej

3

가 발견 솔루션 :

1

"one (first) finger"솔루션이있는 GestureDetector가 안정적으로 작동하지 않습니다. Galaxy S3 Android 4.0.4에서 웹보기가 가끔 확대됩니다.

public class NoZoomedWebViewClient extends WebViewClient { 
    private static final String LOG_TAG = "NoZoomedWebViewClient"; 
    private static final long STABLE_SCALE_CALCULATION_DURATION = 2 * 1000; 

    private long stableScaleCalculationStart; 
    private String stableScale; // Avoid comparing floats 
    private long restoringScaleStart; 

    NoZoomedWebViewClient() { 
     stableScaleCalculationStart = System.currentTimeMillis(); 
    } 

    @Override 
    public void onScaleChanged(final WebView view, float oldScale, float newScale) { 
     Log.d(LOG_TAG, "onScaleChanged: " + oldScale + " -> " + newScale); 

     long now = System.currentTimeMillis(); 
     boolean calculating = (now - stableScaleCalculationStart) < STABLE_SCALE_CALCULATION_DURATION; 
     if (calculating) { 
      stableScale = "" + newScale; 
     } else if (!stableScale.equals("" + newScale)) { 
      boolean zooming = (now - restoringScaleStart) < STABLE_SCALE_CALCULATION_DURATION; 
      if (!zooming) { 
       Log.d(LOG_TAG, "Zoom out to stableScale: " + stableScale); 
       restoringScaleStart = now; 
       view.zoomOut(); 

       // Just to make sure, do it one more time 
       view.postDelayed(new Runnable() { 
        @Override 
        public void run() { 
         view.zoomOut(); 
        } 
       }, STABLE_SCALE_CALCULATION_DURATION); 
      } 
     } 
    } 
} 
관련 문제