Scrollview (Webview) не будет работать с GestureDetector - PullRequest
1 голос
/ 25 августа 2011

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

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

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>

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

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

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;
            }

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

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

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;   
            }

1 Ответ

1 голос
/ 25 августа 2011

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

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

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

...