2010-07-14 3 views
4

Y a-t-il un moyen pour qu'un contrôle WebView détecte un balayage tout en étant capable de faire un zoom multitouch et d'avoir des commandes de zoom intégrées?Comment faire un balayage de balayage de WebView avec le zoom multitouch activé avec un flipper

+0

Rien de mal à répondre à votre propre question, mais ce serait mieux si vous pouviez poser une question et entrer une réponse plutôt que de simplement tout mettre dans la question. Cela permet aux utilisateurs de répondre plus facilement à votre solution et d'offrir des solutions alternatives à votre problème. –

+0

typique ce n'est pas une question .. mais je le ferai.Il pourrait être plus évident de cette façon. – weakwire

Répondre

5

OUI! Il y a une façon de le faire en mettant en œuvre WebView et la création d'un Webview personnalisé De cette façon WebView personnalisée a construit en détection de swipe ayant en même temps multi-touch et de construire dans les contrôles pour le zoom.

//Declaring the custom Webview and put into a viewflipper 


MyWebView[] webview =new MyWebView[2]; 
    flipper = (ViewFlipper) findViewById(R.id.ViewFlipper); 

webview[i] = new MyWebView(this); 
webview[i].setWebViewClient(new HelloWebViewClient()); 
webview[i].getSettings().setJavaScriptEnabled(false); 
webview[i].setInitialScale(60); 
webview[i].getSettings().setBuiltInZoomControls(true); 

    flipper.addView(webview[0]); 
    flipper.addView(webview[1]); 

et voici le WebView personnalisé

public class MyWebView extends WebView { 
    public MyWebView(Context context) { 
    super(context); 
    } 



@Override 
    public boolean onTouchEvent(MotionEvent evt) { 

     boolean consumed = super.onTouchEvent(evt); 
    if (isClickable()) { 
     switch (evt.getAction()) { 
    case MotionEvent.ACTION_DOWN: 
     lastTouchX = evt.getX(); 
     lastTouchY = evt.getY(); 
     downXValue = evt.getX(); 
     downTime = evt.getEventTime(); 
     hasMoved = false; 
     break; 
    case MotionEvent.ACTION_MOVE: 
     hasMoved = moved(evt); 
     break; 
    case MotionEvent.ACTION_UP: 
     float currentX = evt.getX(); 
      long currentTime = evt.getEventTime(); 
      float difference = Math.abs(downXValue - currentX); 
      long time = currentTime - downTime; 

      Log.i("Touch Event:", "Distance: " + difference + "px Time: " + time + "ms"); 

      if ((downXValue < currentX) && (time < 220) && (difference > 100)) { 
       go_back(); 
      } 



      if ((downXValue > currentX) && (time < 220) && (difference > 100)) { 
        go_forward(); 


        } 

       //if (!moved(evt)) performClick(); 
       break; 
      } 
     } 
     return consumed || isClickable(); 
    } 
    float downXValue; 
    long downTime; 
    private float lastTouchX, lastTouchY; 
    private boolean hasMoved = false; 
    private boolean moved(MotionEvent evt) { 
     return hasMoved || 
      Math.abs(evt.getX() - lastTouchX) > 10.0 || 
      Math.abs(evt.getY() - lastTouchY) > 10.0; 
    } 

} 

Et c'est It.You ont construit en swipe detection.Code est un peu « pseudo-code » et ne l'ont pas nettoyé mais Outrepasser la onTouchEvent dans MotionEvent.ACTION_MOVE et le cas MotionEvent.ACTION_UP devrait faire l'affaire. Vous pouvez également jouer avec les limites de temps et de différence.

+0

J'ai essayé cela mais cela me pose un problème avec le zoom avant/arrière. Il réinitialise la taille du WebView lorsque vous rapprochez le zoom à sa taille d'origine. – MegaNairda

Questions connexes