2010-11-19 34 views
11

Tôi có một điều khiển xem web cần hỗ trợ cử chỉ trượt trong Android để hiển thị bản ghi mới (tải dữ liệu mới). Điều này xảy ra trong một lớp học mở rộng Hoạt động. Tất cả các ví dụ tôi đã thấy cho thấy cách triển khai hỗ trợ cử chỉ cho một lượt xem văn bản, nhưng không có gì cho webview.Cử chỉ trượt và xem web trong Android

Tôi cần phải thực hiện các hành động khác nhau cho cả hai bên trái và bên phải. Bất kỳ mã giúp đỡ sẽ được đánh giá cao như thế này hoàn toàn có tôi stumped.

Dưới đây là onCreate cơ bản của tôi và lớp học của tôi

import android.app.Activity; 
import android.content.Intent; 
import android.database.Cursor; 
import android.database.SQLException; 
import android.os.Bundle; 
import android.text.Html; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.Window; 

import android.webkit.WebView; 

public class ArticleActivity extends Activity { 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 



    Window w = getWindow(); 

    w.requestFeature(Window.FEATURE_LEFT_ICON); 

    WebView webview = new WebView(this); 
    setContentView(webview); 



    w.setFeatureDrawableResource(Window.FEATURE_LEFT_ICON, 
    R.drawable.gq); 




    setDefaultKeyMode(DEFAULT_KEYS_SEARCH_LOCAL); 
    populateFields(); 
    webview.loadData(question + answer, "text/html", "utf-8"); 



    // 
} 
private void populateFields() { 

.... 


} 

} 

Trả lời

11

Tạo một GestureListener và GestureDetector. Gọi GestureDetector.onTouchEvent bằng cách ghi đè onTouchEvent của webview.

Bạn cũng có thể chỉ ghi đè lên btw hoạt động onTouchEvent. Tôi có thể đăng một số mã nếu bạn cần.

Chỉnh sửa: Mã theo yêu cầu.

public class Main extends Activity { 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     MyWebView webview = new MyWebView(this); 
     setContentView(webview); 
    } 

    class MyWebView extends WebView { 
     Context context; 
     GestureDetector gd; 

     public MyWebView(Context context) { 
      super(context); 

      this.context = context; 
      gd = new GestureDetector(context, sogl); 
     } 

     @Override 
     public boolean onTouchEvent(MotionEvent event) { 
      return gd.onTouchEvent(event); 
     } 

     GestureDetector.SimpleOnGestureListener sogl = new GestureDetector.SimpleOnGestureListener() { 
      public boolean onDown(MotionEvent event) { 
       return true; 
      } 

      public boolean onFling(MotionEvent event1, MotionEvent event2, float velocityX, float velocityY) { 
       if (event1.getRawX() > event2.getRawX()) { 
        show_toast("swipe left"); 
       } else { 
        show_toast("swipe right"); 
       } 
       return true; 
      } 
     }; 

     void show_toast(final String text) { 
      Toast t = Toast.makeText(context, text, Toast.LENGTH_SHORT); 
      t.show(); 
     } 
    } 
} 

@littleFluffyKitty. Tôi đoán trước các sự kiện cảm ứng WebView mặc định mà bạn muốn nói khi đưa ra các điều khiển thu phóng, v.v ...? Tôi đã không kiểm tra điều đó. Tôi đã thấy rằng việc triển khai thực hiện các thao tác dò tìm cử chỉ riêng sẽ hoạt động tốt nhất (không chắc chắn nếu nó hoạt động tốt nhất trên WebView). Bạn cần phải nhìn vào một sự kiện cảm ứng như ba thành phần riêng biệt. Báo chí xuống, chuyển động (nếu có), và thông cáo báo chí, khi ấn xuống, di chuyển, phát hành luôn luôn xảy ra.

Nếu bạn trả về false trên onDown, hành động sẽ được chuyển xuống trình xử lý sự kiện chạm trên WebView nhưng iirc nó dừng các sự kiện tiếp theo được chuyển tới GestureDetector. Đó là một nửa lý do tại sao tôi thực hiện của riêng tôi mà là dựa trên nguồn Android. iirc Tôi có ý tưởng từ Hướng dẫn Sony Ericsson có thể tải xuống được trên thị trường. Đó là danh sách 3D cho thấy mã và nó khá dễ dàng để thích nghi.

+0

tôi đã thử phương pháp này và dường như chặn các sự kiện chạm trên WebView mặc định. Tôi cũng đã thử thực hiện điều này trên Activity thay vì WebView và nó cũng không hoạt động. Dường như việc ghi đè lên onDown là vấn đề, nhưng vì nó dường như không hoạt động mà không có điều đó, tôi không chắc làm thế nào để làm việc này mà không làm rối tung các hoạt động bình thường của WebView. Có đề xuất gì khác để thử không? – cottonBallPaws

+1

@littleFluffyKitty. xin vui lòng xem chỉnh sửa của tôi trên câu trả lời của tôi. cho tôi biết nếu tôi có thể giúp đỡ nhiều hơn. – techiServices

+0

Tôi đồng ý @littleFluffyKitty vẫn còn - ngay cả sau khi chỉnh sửa nó trông mã này cho biết thêm khả năng fling nhưng vô hiệu hóa tất cả các sự kiện cảm ứng WebView mặc định, mà loại thất bại mục đích. Những người tôi quan tâm là cuộn và nhấp, mà tôi không cần phải viết lại bản thân mình. – Han

2

@Có, hãy tha thứ cho @techiServices câu trả lời không được trả lời của anh ấy.

Sự cố với mã ở trên là trong mọi trường hợp, nó trả về true cho onFling và onDown. Thay vào đó, điều bạn muốn là trả về false cho các sự kiện mà bạn không xử lý hoặc cho các điều kiện trong những sự kiện mà bạn không xử lý. Hoặc thực sự, trong onTouchEvent bạn có thể vượt qua các cuộc gọi đến lớp cơ sở bằng cách quay

super.onTouchEvent(event); 
4

tôi cập nhật mã, bây giờ điều này sẽ cho phép gọi các sự kiện có nguồn gốc xử lý nếu người dùng không flinged

import android.content.Context; 
import android.util.AttributeSet; 
import android.util.Log; 
import android.view.GestureDetector; 
import android.view.MotionEvent; 
import android.webkit.WebView; 

public class MyWebView extends WebView { 
    private boolean flinged; 

    private static final int SWIPE_MIN_DISTANCE = 320; 
    private static final int SWIPE_MAX_OFF_PATH = 250; 
    private static final int SWIPE_THRESHOLD_VELOCITY = 200; 

    public MyWebView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     gd = new GestureDetector(context, sogl); 
    } 

    GestureDetector gd; 


    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     gd.onTouchEvent(event); 
     if (flinged) { 
      flinged = false; 
      return true; 
     } else { 
      return super.onTouchEvent(event); 
     } 
    } 

    GestureDetector.SimpleOnGestureListener sogl = new GestureDetector.SimpleOnGestureListener() { 
    // your fling code here 
     public boolean onFling(MotionEvent event1, MotionEvent event2, float velocityX, float velocityY) { 
      if (event1.getX() < 1200 && event1.getX() > 80) { 
       return false; 
      } 
      if (Math.abs(event1.getY() - event1.getY()) > SWIPE_MAX_OFF_PATH) 
       return false; 
      if(event1.getX() - event2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
       loadUrl("javascript:changePage('LEFT')"); 
       Log.i("Swiped","swipe left"); 
       flinged = true; 
      } else if (event2.getX() - event1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
       loadUrl("javascript:changePage('RIGHT')"); 
       Log.i("Swiped","swipe right"); 
       flinged = true; 
      } 
      return true; 
     } 
    }; 
} 
Các vấn đề liên quan