2014-02-04 2 views
5

Решение SOLVED находится под ним.Android-джойстик влево/вправо в режиме WebView (с щелчком по ссылкам и вертикальной прокрутке)

Я хочу заменить кнопки для навигации в веб-обозревателе на два жесты салфетки - левый и правый салфетки. Эта ссылка Android: How to handle right to left swipe gestures действительно помогла мне, но я столкнулся с проблемой - после реализации этого кода мне не удалось щелкнуть ссылки/или прокрутить загруженную веб-страницу в активности веб-просмотра (я использовал первый ответ из возможных ответов).

Тогда я узнал, что в другом ответе в этом вопросе что-то похожее - как прокручивать в listview - https://stackoverflow.com/a/20005481/3272449, но я не смог его запустить. В LogCat я получаю эту отладочную информацию: http://s27.postimg.org/5qfipgi1v/message.png

Это мой OnSwipeTouchListener:

import android.view.GestureDetector; 
import android.view.GestureDetector.SimpleOnGestureListener; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.View.OnTouchListener; 

public class OnSwipeTouchListener implements OnTouchListener { 

private final GestureDetector gestureDetector = new GestureDetector(new GestureListener()); 

public boolean onTouch(final View view, final MotionEvent motionEvent) { 
    return gestureDetector.onTouchEvent(motionEvent); 
} 

private final class GestureListener extends SimpleOnGestureListener { 

    private static final int SWIPE_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) { 
     boolean result = false; 
     try { 
      float diffY = e2.getY() - e1.getY(); 
      float diffX = e2.getX() - e1.getX(); 
      if (Math.abs(diffX) > Math.abs(diffY)) { 
       if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) { 
        if (diffX > 0) { 
         onSwipeRight(); 
        } else { 
         onSwipeLeft(); 
        } 
       } 
      } 
     } catch (Exception exception) { 
      exception.printStackTrace(); 
     } 
     return result; 
    } 
} 

public void onSwipeRight() { 
} 

public void onSwipeLeft() { 
} 

public GestureDetector getGestureDetector(){ 
    return gestureDetector; 
} 
} 

И моя WebView активность (раздели):

public class WebViewActivity extends Activity { 
private WebView browser; 
    private OnSwipeTouchListener onSwipeTouchListener; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.webview); 
      onSwipeTouchListener = new OnSwipeTouchListener() { 
public void onSwipeRight() { 
    Toast.makeText(WebViewActivity.this, "right", Toast.LENGTH_SHORT).show(); 
} 
public void onSwipeLeft() { 
    Toast.makeText(WebViewActivity.this, "left", Toast.LENGTH_SHORT).show(); 
} 
}; 

browser.setOnTouchListener(onSwipeTouchListener); 
} // end of onCreate 
@Override 
public boolean dispatchTouchEvent(MotionEvent ev){ 
    onSwipeTouchListener.getGestureDetector().onTouchEvent(ev); 
     return super.dispatchTouchEvent(ev); 
} 
} // end of WebViewActivity 

Как сделать левый/правый Swiping, вертикальный прокрутка и одновременное нажатие на ссылки?

РЕШЕНИЕ: То же решается вопрос: Fling Gesture and Webview in Android

ответ

0

Я не достаточно с GestureDetector знакомым, чтобы надежно диагностировать вашу проблему. Одна вещь, которую вы могли бы попробовать клонируется событие:

@Override 
public boolean dispatchTouchEvent(MotionEvent ev){ 
    onSwipeTouchListener.getGestureDetector().onTouchEvent(MotionEvent.obtain(ev)); 
    return super.dispatchTouchEvent(ev); 
} 

Failing, что другой способ решения этой проблемы является использование onOverScrolled вместо GestureDetector:

@Override 
protected void onOverScrolled (int scrollX, int scrollY, boolean clampedX, boolean clampedY) { 
    if (scrollX > (getWidth() + THRESHOLD) && clampedX) { 
     onSwipeLeft(); 
    } 
    if (scrollX < - THRESHOLD && clampedX) { 
     onSwipeRight(); 
    } 
    super.onOverScrolled(scrollX, scrollY, clampedX, clampedY); 
} 

Это предположить, что ваш контент обычно не прокручивать боком.

+0

Добавление MotionEvent.obtain (ev) ничего не меняет, до сих пор нет вертикальной прокрутки и отладки, аналогичной предыдущей. Overriding onOverScrolled не работает, потому что это ожидает прокрутки вбок. Если я не перейду в сторону, тогда scrollX все равно равен нулю, а onSwipeLeft/Right не будет. – James07