Scrollview (Webview) не будет работать с GestureDetector

1

Я надеюсь, что кто-то может мне помочь. Это заставляло меня сходить с ума на несколько дней.

Я разрабатываю приложение, использующее webview, которое позволяет пользователям переходить на следующий экран и вернуться к предыдущему экрану, используя

public boolean onFling(MotionEvent event1, MotionEvent event2, float velocityX, float velocityY)

Я также хочу, чтобы пользователь мог прокручивать сверху вниз, если есть больше контента, чем может поместиться на экране. Итак, у меня есть файл main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="800px"
    android:background="#ffffff">
<ScrollView android:id="@+id/ScrollView01"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#ffffff">   
<WebView xmlns:android="http://schemas.android.com/apk/res/android"     
android:id="@+id/webview"     
android:scrollbars="vertical"
android:layout_width="fill_parent"     
android:layout_height="fill_parent"
android:background="#ffffff"/>
</ScrollView>
</LinearLayout>

Проблема - просмотр прокрутки теперь не работает. До того, как у меня был gesturedetector, я включил обнаружение swipe с помощью javascript, но пользователь должен был быть очень точным с левыми и правыми левыми акциями.

Я думаю, что проблема заключается в коде, который позволяет gestureDetector работать - спасибо за вкладчика, который опубликовал это:

public boolean onFling(MotionEvent event1, MotionEvent event2, float velocityX, float velocityY) {     
String url = findURL(); 
if (event1.getRawX() > event2.getRawX()) {   
if(isButtonScreen(url)==false){
//get next SCREEN to display
getNext(url);
}else{
}
} else { 
if(isButtonScreen(url)==false)
{
//get previous
getPrevious(url);
}else{
}
}   
return true;   
}

Я думаю, что это говорит, если пользователь перебирает справа налево, а затем показывает следующую страницу, иначе показывает предыдущую страницу.

То, что я хотел бы, - это еще одна ясность, если пользователь в какой-то степени отскакивает слева направо, затем показывает следующую страницу, или если пользователь в определенной степени проскакивает справа налево, затем показывает предыдущую страницу, иначе прокрутка вверх или прокрутка вниз,

Так я должен это делать? Или я упускаю что-то фундаментальное, и он должен работать каким-то другим очевидным способом?

благодаря

Извините, мой собственный ответ был не в том месте. Пока что у меня есть чек, чтобы проверить, есть ли это бросок или свиток:

//check if it is a swipe or a scroll
            public String isSwipe(MotionEvent event1, MotionEvent event2){
                String swipeDirection = "";
                double X = event1.getRawX()-event2.getRawX();
                double Y = event1.getRawY()-event2.getRawY();
                double Z = Math.round(Math.sqrt(Math.pow(X,2)+Math.pow(Y,2))); //the distance - rounded - in pixels
                double r = Math.atan2(Y,X); //angle in radians (Cartesian system)
                double swipeAngle = Math.round(r*180/Math.PI); //angle in degrees
                if ( swipeAngle < 0 ) { swipeAngle =  360 - Math.abs(swipeAngle); }

                if ( (swipeAngle <= 45) && (swipeAngle >= 0) ) {
                    swipeDirection = "left";
                } else if ( (swipeAngle <= 360) && (swipeAngle >= 315) ) {
                    swipeDirection = "left";
                } else if ( (swipeAngle >= 135) && (swipeAngle <= 225) ) {
                    swipeDirection = "right";
                } else if ( (swipeAngle > 45) && (swipeAngle < 135) ) {
                    swipeDirection = "up";
                } else {
                    swipeDirection = "down";
                }

                return swipeDirection;
            }

Теперь я хочу, чтобы scrollDown и scrollUp плавно. Если у кого-то есть надежный ответ, я был бы очень признателен за ваш комментарий.

и, наконец, прокрутить вниз, я использовал:

scrollBy(0, 50);

как только я был счастлив, я фактически размахивал.

Это не так гладко, как хотелось бы, если у кого-то есть улучшения в этом, я был бы очень счастлив.

public boolean onFling(MotionEvent event1, MotionEvent event2, float velocityX, float velocityY) {     
                String url = findURL(); 
                if (event1.getRawX() > event2.getRawX()) {   
                            if(isButtonScreen(url)==false){
                                //get next
                                //getNext(url);
                                show_toast("swipe left"+isSwipe(event1, event2));
                            }else{
                            }
                    } else { 
                        if(isButtonScreen(url)==false){
                            //get previous
                            //getPrevious(url);
                            String result = isSwipe(event1, event2);
                            show_toast("swipe right "+result);
                            if(result.equalsIgnoreCase("down")){
                                //screen height + 50;
                                scrollBy(0, 50);
                            }
                        }else{
                        }
                    }

                return true;   
            }
  • 2
    Вы не можете надежно поместить WebView (или что-либо, что прокручивается) внутри ScrollView , независимо от жестов.
Теги:
webview
swipe
scrollview
gesturedetector

1 ответ

1
Лучший ответ

Если вы хотите использовать жесты, вы не должны использовать ScrollView без создания собственной реализации клиента.

Если вы должны иметь жесты в ScrollView, тогда вы должны создать собственный собственный класс, реализующий ScrollView и переопределяющий onTouchEvent из View чтобы делать то, что вы хотите.

Надеюсь это поможет!

  • 0
    Спасибо за ваш комментарий. Итак, нет прокрутки, я могу использовать ScrollTo (x, y), но он переходит на эту позицию. Есть ли scrollDown или scrollUp, который работает гладко?
  • 0
    Итак, я создал метод, чтобы определить, является ли это броском или прокруткой, это следующим образом

Ещё вопросы

Сообщество Overcoder
Наверх
Меню