Я надеюсь, что кто-то может мне помочь. Это заставляло меня сходить с ума на несколько дней.
Я разрабатываю приложение, использующее 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;
}
Если вы хотите использовать жесты, вы не должны использовать ScrollView
без создания собственной реализации клиента.
Если вы должны иметь жесты в ScrollView
, тогда вы должны создать собственный собственный класс, реализующий ScrollView
и переопределяющий onTouchEvent
из View
чтобы делать то, что вы хотите.
Надеюсь это поможет!
WebView
(или что-либо, что прокручивается) внутриScrollView
, независимо от жестов.