2012-04-12 15 views
5

मैं एक निश्चित स्थिति में जाने के लिए स्क्रॉलर का उपयोग करने की कोशिश कर रहा हूं। मेरी समस्या यह है: यह सही स्थिति में समाप्त होता है, लेकिन यह या तो बस एक बार चल रहा है और अंत स्थिति को तुरंत सेट कर रहा है या पहले धीरे-धीरे स्क्रॉल करता है और फिर अंत तक कूदता है।एंड्रॉइड स्क्रॉलर निश्चित स्थिति पर फ़्लिंग

संपादित करें: समस्या और मैं अवधि scroller.extendDuration() का उपयोग कर विस्तार करने के लिए है कि हो सकता है कि एक) मेरे वेग शून्य कभी कभी (है कि कहीं और एक समस्या है :)) है लगता है। हालांकि मुझे इस बात के बारे में अनिश्चितता है कि अवधि क्या होनी चाहिए। मुझे कोई निश्चित वेग वास्तव में क्या मतलब है इसके बारे में कोई जानकारी नहीं मिल सकती है। क्या यह प्रति सेकेंड पिक्सल है?

यहाँ मेरी कोड है:

private class Flinger implements Runnable { 

    private final Scroller scroller; 

    private int lastX = 0; 

    public Flinger() { 
     scroller = new Scroller(getContext()); 
    } 

    void startFling(int initialVelocity, int offsetX) { 
     Log.d("test", "finalX = " + offsetX); 
     if (offsetX > 0) { 
      scroller.fling(0, 0, initialVelocity, 0, 0, Integer.MAX_VALUE, 0, 0); 
      scroller.setFinalX(offsetX); 
      lastX = 0; 
     } else { 
      scroller.fling(getWidth(), 0, initialVelocity, 0, 0, Integer.MAX_VALUE, 0, 0); 
      scroller.setFinalX(getWidth() + offsetX); 
      lastX = getWidth(); 
     } 
     post(this); 
    } 

    @Override 
    public void run() { 
     if (scroller.isFinished()) { 
      Log.d("test", "scroller finished"); 
      return; 
     } 

     boolean more = scroller.computeScrollOffset(); 
     int x = scroller.getCurrX(); 
     int diff = lastX - x; 
     Log.d("test", "isFlinging, x=" + x + ", diff=" + diff + ", leftOffset=" + getLeftOffset() + ", isDone=" + !more); 
     if (diff != 0) { 
      setLeftOffset(getLeftOffset() - diff); 
      lastX = x; 
     } 

     if (more) { 
      post(this); 
     } 
    } 
} 
+0

कैसे आप वेग गणना कर रहे हैं, और यह भी आप उपयोगकर्ता बातचीत पर इस स्क्रॉल कार्यक्षमता कर रहे हैं, स्पर्श की तरह ले जाने के – Triode

+0

आप कैसे वेग गणना कर रहे हैं, और यह भी आप उपयोगकर्ता बातचीत पर इस स्क्रॉल कार्यक्षमता कर रहे हैं, स्पर्श चाल की तरह यदि ऐसा है तो आप इस अंतिम int डेल्टा = newX - getScrollX() जैसी कुछ चीज़ों का उपयोग क्यों नहीं कर सकते हैं; mScroller.startScroll (getScrollX(), 0, डेल्टा, 0, Math.abs (डेल्टा)); न्यूएक्स वर्तमान माउस अप स्थिति है। और आप टच मूव वेग की जांच के लिए वेग ट्रैकर का उपयोग भी कर सकते हैं। – Triode

+0

हां मैं VelocityTracker का उपयोग कर रहा हूं, लेकिन मुझे पता चला है कि समस्या क्या थी (नीचे जवाब देखें)। धन्यवाद! –

उत्तर

2

ठीक है मैं समझ गया। दरअसल मुझे अपनी अवधि का विस्तार करना पड़ा (हालांकि दस्तावेज थोड़ा भ्रामक है - यह वह मान नहीं है जो वर्तमान गणना अवधि में जोड़ा गया है, यह वास्तविक नई अवधि है)।

थोड़ा और प्रलेखन पढ़ने के बाद मुझे एहसास हुआ है कि आवश्यक वेग वास्तव में प्रति सेकेंड पिक्सल है और मैंने वास्तव में इस इकाई का उपयोग करने के लिए VelocityTracker को परिभाषित किया है।

तो यह लापता लाइन है:

scroller.extendDuration ((int) (Math.abs (offsetX)/(नाव) Math.max (1000, Math.abs (initialVelocity)) * 1000));

संबंधित मुद्दे