2010-11-19 16 views
11

मेरे पास एक वेबव्यू नियंत्रण है जिसे एक नया रिकॉर्ड (नया डेटा लोड करने) के लिए एंड्रॉइड में फ़्लिंग जेस्चर का समर्थन करने की आवश्यकता है। यह एक वर्ग में होता है जो गतिविधि को बढ़ाता है। मैंने देखा है कि सभी उदाहरण दिखाते हैं कि टेक्स्टव्यू के लिए इशारा समर्थन कैसे कार्यान्वित किया जाए, लेकिन वेबव्यू के लिए कुछ भी नहीं।एंड्रॉइड में फ़्लिंग जेस्चर और वेबव्यू

मुझे बाएं और दाएं दोनों हिस्सों के लिए अलग-अलग कार्रवाइयों को निष्पादित करने की आवश्यकता है। किसी भी कोड की मदद की सराहना की जाएगी क्योंकि यह पूरी तरह से मुझे फंस गया है।

यहाँ मेरी बुनियादी onCreate और मेरी कक्षा

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() { 

.... 


} 

} 

उत्तर

11

एक GestureListener और एक GestureDetector बनाएं है। वेबव्यू के ऑन टचवेन्ट को ओवरराइड करके जेस्चरडेटेक्टर.ऑन टचवेन्ट को कॉल करें।

आप गतिविधि पर टचवेन्ट बीटीडब्ल्यू को ओवरराइड भी कर सकते हैं। यदि आपको आवश्यकता हो तो मैं कुछ कोड पोस्ट कर सकता हूं।

संपादित करें: अनुरोध के रूप में कोड।

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। मैं डिफॉल्ट वेबव्यू टच इवेंट्स का अनुमान लगाता हूं जिसका मतलब है कि यह ज़ूम नियंत्रण इत्यादि लाता है? मैंने इसका परीक्षण नहीं किया। मैंने पाया है कि लागू करने वाले लोगों का इशारा सबसे अच्छा काम करता है (सुनिश्चित नहीं है कि यह वेबव्यू पर सबसे अच्छा काम करेगा)। आपको टच इवेंट को तीन अलग-अलग घटकों के रूप में देखना होगा। दबाएं, आंदोलन (यदि कोई हो), और प्रेस विज्ञप्ति, प्रेस के रूप में, आगे बढ़ें, हमेशा जारी रहें।

यदि आप ऑनडाउन पर झूठी वापसी करते हैं तो कार्रवाई वेबव्यू टच इवेंट हैंडलर को पास कर दी जानी चाहिए, लेकिन आईआईआरसी यह बाद की घटनाओं को जेस्चरडिटेक्टर को पास कर देती है। एंड्रॉइड स्रोत पर आधारित है जो मेरा खुद का कार्यान्वयन करने का आधा कारण है। आईआईआरसी मुझे सोनी एरिक्सन ट्यूटोरियल से विचार मिला जो बाजार से डाउनलोड करने योग्य है। यह 3 डी सूची है जो कोड दिखाती है और इसे अनुकूलित करने में काफी आसान है।

+0

मैं देशी घटनाओं संचालकों फोन करने की अनुमति देगा इस विधि को आजमाया है और ऐसा लगता है कि यह डिफ़ॉल्ट वेब व्यू टच इवेंट्स को अवरोधित करता है। मैंने वेबव्यू की बजाय गतिविधि पर इसे लागू करने का भी प्रयास किया और यह भी काम नहीं किया। ऐसा लगता है कि ऑनडाउन पर ओवरराइड समस्या है, लेकिन चूंकि यह इसके बिना काम नहीं कर रहा है, इसलिए मुझे यकीन नहीं है कि वेबव्यू के सामान्य संचालन को गड़बड़ किए बिना इसे कैसे काम किया जाए। कोशिश करने के लिए कुछ और सुझाव? – cottonBallPaws

+1

@littleFluffyKitty। कृपया मेरे उत्तर पर मेरा संपादन देखें। अगर मुझे और मदद मिलती है तो मुझे बताएं। – techiServices

+0

मैं अभी भी @littleFluffyKitty से सहमत हूं - संपादन के बाद भी यह लगता है कि यह कोड फ़्लिंग क्षमताओं को जोड़ता है लेकिन सभी डिफ़ॉल्ट वेबव्यू स्पर्श घटनाओं को अक्षम करता है, जो इस उद्देश्य को हरा देता है। जिन लोगों में मुझे रूचि है उनमें स्क्रॉल और क्लिक हैं, जिन्हें मुझे खुद को फिर से लिखना नहीं चाहिए। – Han

2

@ हन, क्षमा करें @techi सेवा उनके अनिश्चित उत्तर के लिए।

उपरोक्त कोड के साथ समस्या यह है कि सभी मामलों में यह ऑनलाइन और ऑनडाउन के लिए सच हो जाता है। इसके बजाय आप जो घटनाएं चाहते हैं, उनके लिए झूठी वापसी करना है, या उन घटनाओं में स्थितियों के लिए जिन्हें आप संभाल नहीं सकते हैं। या वास्तव में, onTouchEvent में आप आधार वर्ग के लिए कॉल

super.onTouchEvent(event); 
4

मैं कोड अद्यतन वापस लौट कर, गुजर सकता है यह अब अगर उपयोगकर्ता 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; 
     } 
    }; 
} 
संबंधित मुद्दे