2012-04-12 14 views
5

लक्ष्य मैं एक उलटी गिनती टाइमर को कार्यान्वित करना चाहता हूं जो सिर्फ बाएं से दाएं संख्याओं (ग्राफिक्स नहीं) को स्क्रॉल करता है।एक क्षैतिज स्क्रॉलिंग उलटी गिनती टाइमर कैसे कार्यान्वित करता है?

प्रभाव प्रभाव लगेगा जैसे संख्या बाएं से ज़ूम, मध्य की ओर धीमा, और फिर सही करने के लिए बंद ज़ूम करता है।

नोट्स के बाद से मैं पहले से ही कोड हर दूसरे निष्पादित करने के लिए एक TimerTask उपयोग कर रहा हूँ, मैं इस्तेमाल कर सकते हैं कि क्षैतिज स्क्रॉलिंग TextView भर में स्क्रॉल करने के लिए अगले संख्या को गति प्रदान करने।

क्या इसे सिर्फ स्क्रॉलव्यू के अंदर एक टेक्स्टव्यू के रूप में कार्यान्वित किया जा सकता है? शुरू करने के लिए कोड नमूना खोज रहे हैं ....

उत्तर

9

एनिमेशन का उपयोग करना सबसे आसान समाधान होगा। आप अपना खुद का बना सकते हैं या कई TranslateAnimations और ScaleAnimations को आजमा सकते हैं और गठबंधन कर सकते हैं।

इसका मतलब यह होगा कि प्रत्येक नंबर को स्क्रॉल व्यू का उपयोग करने के बजाय अपने स्वयं के टेक्स्ट व्यू में डालना होगा।

फिर आप Interpolator के साथ मध्य में त्वरण को नियंत्रित कर सकते हैं। इंटरपोलेटर यह हैं कि एंड्रॉइड कैसे आसान हो जाता है। आप तेजी से धीमा/धीमा प्रभाव के लिए AccelerateDecelerateInterpolator चाहते हैं।

आप एक ही दृश्य में एकाधिक एनिमेशन लागू करने के लिए AnimationSet का उपयोग कर सकते हैं। एक अच्छी एनीमेशनसेट को एक साथ कैसे रखा जाए, यह पता लगाने के लिए परियोजना का सबसे चुनौतीपूर्ण हिस्सा होगा। "भरें" संपत्ति पर ध्यान देना सुनिश्चित करें। वास्तव में थोड़ा सा खेलने के बाद, मुझे लगता है कि कस्टम एनीमेशन तैयार किए गए लोगों का उपयोग करने से आसान है।

आप फोर्क my GitHub project जो इसका एक बहुत ही सरल संस्करण लागू करता है। 17 अप्रैल और इससे पहले कि मैंने कई पूर्व निर्मित एनिमेशन का इस्तेमाल किया था। यदि आप सबसे हालिया संस्करण को देखते हैं, तो आपको कस्टम एनीमेशन दिखाई देगा।

प्रत्येक एनीमेशन के लिए समय एक एनीमेशन के लिए अवधि निर्धारित करने के बाद स्वयं का ख्याल रखता है। Handler पिछले एक के बाद अगले नंबर पर कॉल करता है। मुझे लगता है कि यह सब कुछ अपडेट करने के लिए हर एक्स सेकंड में एक समारोह को कॉल करने से थोड़ा सा साफ है। कार्यक्षमता के

रूपरेखा:

  • एक गतिविधि (CountDownActivity.java) से अधिक सब कुछ देखता है।
    • एक्टिविटी के लेआउट एक्सएमएल में एक बटन है जिसका उपयोग गिनती शुरू करने के लिए किया जाता है।
    • उलटी गिनती शुरू होने के बाद, बटन गायब हो जाता है। गिनती घटित होने पर यह फिर से दिखाई देता है।
  • गतिविधि एक Handler (MotionHandler.java) शामिल हैं। Handler संख्याओं के आंदोलन और समय को नियंत्रित करता है।
    • हैंडलर एक AnimationSet का उपयोग करता निर्भरता
      • यह लचीलापन के लिए है में संख्या
        • AnimationSet एक पारित हो जाता है ले जाने के लिए। बस एक अलग AnimationSet में पारित बदलने का तरीका संख्या को स्थानांतरित
        • AnimationSet चार एनिमेशन एक कस्टम एनीमेशन से बना है (नीचे देखें)
    • AnimationSet एक साझा AccelerateDecelerateInterpolator, का उपयोग करता है जो लगता है कि काम ठीक से लगता है। अपने स्वयं के लेखन सहित अन्य विकल्प भी हैं।
    • हैंडलर का उपयोग करता है एक delayed message अगले संख्या
    • हैंडलर गतिविधि इसकी सूचना देता उलटी गिनती एक कस्टम श्रोता (MotionHandler >> CountdownListener)
  • डिवाइस घूर्णन का उपयोग किया जाता शुरू करने के लिए गिनती को फिर से शुरू कर देगा।

नोट - पहले मैं एक एनीमेशनसेट में चार तैयार किए गए एनिमेशन का उपयोग कर रहा था, मैंने केवल एक कस्टम एनीमेशन शामिल करने के लिए संपादित किया है ... आप अपनी पसंद के अनुसार अपने एल्गोरिदम को ट्विक कर सकते हैं।

यह कस्टम एनीमेशन Cycloid का उपयोग करता है ताकि संख्याएं बड़ी और छोटी दिखाई दे सकें।

/** 
* A custom animation to move and scale the numbers. 
* 
*/ 
public class NumberAnimation extends Animation 
{ 
    final public static float MINIMUM = 3; 
    private int mHorizontal; 
    private int mScaling; 

    public NumberAnimation(int horizontalMovement, int scaling) 
    { 
     mHorizontal = horizontalMovement; 
     mScaling = scaling; 
    } 

    @Override 
    protected void applyTransformation(float interpolatedTime, Transformation t) 
    { 
     // Cycloid repeats every 2pi - scale interpolatedTime to that 
     double time = 2 * Math.PI * interpolatedTime; 
     // Cycloid function 
     float currentScale = (float) (mScaling * (1 - Math.cos(time))) + MINIMUM; 
     Matrix matrix = t.getMatrix(); 
     matrix.preScale(currentScale, currentScale); 
     matrix.postTranslate(mHorizontal * interpolatedTime, 0); 
    } 
} 
+0

पीटर, मेरे प्रश्न का उत्तर देने के लिए समय निकालने के लिए धन्यवाद! –

+0

@ किसी और जगह - यह मजेदार था। आशा करता हूँ की ये काम करेगा! –

0

Easing गति को नियंत्रित करने में आपकी सहायता करेगा।

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