Scrollview(Webview)不能与GestureDetector合作

时间:2011-08-25 14:48:47

标签: android webview scrollview swipe gesturedetector

我希望有人可以帮助我。这让我疯狂了几天。

我正在使用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之前,我正在使用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;   
            }

1 个答案:

答案 0 :(得分:1)

如果您想使用手势,则不应在未创建自己的客户实施的情况下使用ScrollView

如果您必须在ScrollView中拥有手势,那么您应该创建自己的自定义类,实现ScrollView并覆盖onTouchEvent View以执行您想要的操作。< / p>

希望这有帮助!