2012-06-25 9 views
20

बटन के पहले क्लिक पर, मैं एक्स-अक्ष के साथ View स्लाइड करना चाहता हूं (200 पिक्सेल से दाएं मान लें)। और बटन के दूसरे प्रेस पर, मैं View को x-axis के साथ अपनी मूल स्थिति में वापस स्लाइड करना चाहता हूं।किसी व्यू के अनुवाद को एनिमेट करने के लिए कैसे करें

View.setTranslationX(float) विधि कूदता क्रमशः कॉल myView.setTranslationX(200); और myView.setTranslationX(0); के साथ लक्ष्य क्षैतिज स्थानों के लिए देखें। किसी को भी पता है कि मैं स्लाइडView के बजाय लक्ष्य क्षैतिज स्थानों पर कैसे कर सकता हूं?

नोट 1: एक TranslateAnimation के बाद से यह वास्तव में View स्थानांतरित नहीं होता है, लेकिन केवल इसके बारे में भ्रम चलती प्रस्तुत करता है अच्छा नहीं है।

नोट 2: मैं सवाल है कि setTranslationX(float) और setTranslationY(float) तरीकों यदि आप Honeycomb (एपीआई स्तर 11) लक्षित कर रहे हैं एपीआई स्तर 11 के रूप में शुरू किए गए थे प्रस्तुत करने के समय का एहसास नहीं था ऊपर की तरफ है, तो गौतम के जवाब पर्याप्त होगा। अन्यथा, सुझाए गए समाधान के लिए मेरा उत्तर देखें।

उत्तर

5

यह मुझे कुछ दिनों के लिए फंस गया था (इसे प्री-आइस क्रीम सैंडविच काम करने के लिए) लेकिन मुझे लगता है मैं अंत में वहाँ गया है!(गौतम के और माइक इज़राइल के लिए लीड के लिए धन्यवाद) अंत में मैंने अपने View (FrameLayout) का विस्तार करना आवश्यक था ताकि अनुवाद सही/बाएं एनिमेशन शुरू हो सके और स्थानांतरित करने के लिए एनिमेशन के अंत को सुन सकें इस प्रकार मेरी FrameLayout सही /, उचित रूप में छोड़ दिया:

public class SlidingFrameLayout extends FrameLayout 
{ 
    private final int durationMilliseconds = 1000; 
    private final int displacementPixels = 200; 

    private boolean isInOriginalPosition = true; 
    private boolean isSliding = false; 

    public SlidingFrameLayout(Context context) 
    { 
    super(context); 
    } 

    public SlidingFrameLayout(Context context, AttributeSet attrs) 
    { 
    super(context, attrs); 
    } 

    public SlidingFrameLayout(Context context, AttributeSet attrs, int defStyle) 
    { 
    super(context, attrs, defStyle); 
    } 

    @Override 
    protected void onAnimationEnd() 
    { 
    super.onAnimationEnd(); 

    if (isInOriginalPosition) 
     offsetLeftAndRight(displacementPixels); 
    else 
     offsetLeftAndRight(-displacementPixels); 

    isSliding = false; 
    isInOriginalPosition = !isInOriginalPosition; 
    } 

    @Override 
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) 
    { 
    super.onLayout(changed, left, top, right, bottom); 

    // need this since otherwise this View jumps back to its original position 
    // ignoring its displacement 
    // when (re-)doing layout, e.g. when a fragment transaction is committed 
    if (changed && !isInOriginalPosition) 
     offsetLeftAndRight(displacementPixels); 
    } 

    public void toggleSlide() 
    { 
    // check whether frame layout is already sliding 
    if (isSliding) 
     return; // ignore request to slide 

    if (isInOriginalPosition) 
     startAnimation(new SlideRightAnimation()); 
    else 
     startAnimation(new SlideLeftAnimation()); 

    isSliding = true; 
    } 

    private class SlideRightAnimation extends TranslateAnimation 
    { 
    public SlideRightAnimation() 
    { 
     super(
      Animation.ABSOLUTE, 0, 
      Animation.ABSOLUTE, displacementPixels, 
      Animation.ABSOLUTE, 0, 
      Animation.ABSOLUTE, 0); 

     setDuration(durationMilliseconds); 
     setFillAfter(false); 
    } 
    } 

    private class SlideLeftAnimation extends TranslateAnimation 
    { 
    public SlideLeftAnimation() 
    { 
     super(
      Animation.ABSOLUTE, 0, 
      Animation.ABSOLUTE, -displacementPixels, 
      Animation.ABSOLUTE, 0, 
      Animation.ABSOLUTE, 0); 

     setDuration(durationMilliseconds); 
     setFillAfter(false); 
    } 
    } 
} 

और, अंत में, स्लाइड करने के लिए SlidingFrameLayout दाएँ/बाएँ, तुम सब मिल गया है फोन SlidingFrameLayout.toggleSlide() तरीका है। बेशक आप लंबे समय तक स्लाइड करने के लिए अधिक संख्या में पिक्सेल स्लाइड करने के लिए अपने SlidingFrameLayout को ट्विक कर सकते हैं, लेकिन यह आपको शुरू करने के लिए पर्याप्त होना चाहिए :)

25

ObjectAnimator और उसके सुपर वर्ग मूल्य एनिमेटर में देखने का प्रयास करें

आप की तरह कुछ कर सकते हैं इस ObjectAnimator anim = ObjectAnimator.ofFloat(this, "translationX", 0,200); और फिर anim.start();

एक boolean मान का उपयोग करें और वस्तु एनिमेटर में 200,0 साथ यह टॉगल

पीएस: आपका उपयोग कर सकते हैं 210 पद्धति सेट करने में कितना समय एनीमेशन पूरा करने के लिए

संपादित करें लेना चाहिए:

प्रयास करें support library जो पश्चगामी संगतता प्रदान करता है पर देख रहे हैं।

संपादित

@AdilHussain के रूप में बताया एक पुस्तकालय nineoldandroids कहा जाता है जो पुराने एंड्रोइड्स पर ही उद्देश्य के लिए इस्तेमाल किया जा सकता है।

+0

@AdilHussain: तो आपको थ्रेड के साथ कार्यक्षमता को कार्यान्वित करना होगा अपने आप फोन पर जो इसका समर्थन नहीं करते हैं। बस जांचें कि फोन इसका समर्थन करता है या नहीं तो कुछ सरल फॉलबैक लिखें। यह सबसे अच्छा विकल्प है। – Gautam

+1

इस शानदार लाइब्रेरी को मिला जो नौकरी करता है: [http://nineoldandroids.com] (http://nineoldandroids.com)। यहां से 'जार' के रूप में डाउनलोड करने के लिए लाइब्रेरी उपलब्ध है: [https://github.com/JakeWharton/NineOldAndroids/downloads ](https://github.com/JakeWharton/NineOldAndroids/downloads) –

+1

ऐसा लगता है जैसे मैंने बहुत जल्द बात की थी। पुराने फोन (प्री-हनीकॉम) पर [नौल्डैंड्रॉइड] (https://github.com/JakeWharton/NineOldAndroids) लाइब्रेरी का उपयोग करके अनुवाद करते समय, अनुवादित दृश्य के भीतर बटन स्थानांतरित हो गए हैं लेकिन अभी भी उनके पुराने स्थानों में क्लिक करने योग्य हैं (और उनके नए स्थान नहीं)। मैंने पुस्तकालय के लेखक को ईमेल किया है लेकिन अभी तक कोई प्रतिक्रिया प्राप्त नहीं हुई है। –

2

मुझे एक समान समस्या थी, अनुवाद एनीमेशन वास्तव में दृश्य को स्थानांतरित करता है यदि आप अभी सेटफिलएफ़टर कहते हैं (android bug)। मुझे कुछ ऐसा ही करना पड़ा, इसलिए मैंने कहा, हे एक एनीमेशन श्रोता का उपयोग करने देता है और फिर बस सब कुछ सही स्थान पर ले जाता है। दुर्भाग्यवश एनीमेशन श्रोताओं पर भी एक बग है (stackoverflow solution)। इसलिए मैंने stackoverflow solution में समाधान के अनुसार अपना खुद का लेआउट क्लास बनाया और मुझे जाने के लिए अच्छा लगा :)

+0

प्रतिक्रिया और लिंक के लिए धन्यवाद। यह दिखाने के लिए जाता है कि इसके लिए 'अनुवाद एनीमेशन' का उपयोग करना थोड़ा गन्दा है। जब मैंने कहा कि 'अनुवाद एनीमेशन' वास्तव में दृश्य को स्थानांतरित नहीं करता है ('setFillAfter (true)' का उपयोग करने के बावजूद, मेरा मतलब था कि क्लिक करने योग्य आइटम अभी भी उनके मूल पदों में हैं। मेरा वीडियो का अर्थ उदाहरण के लिए इस वीडियो को देखें: [http://www.youtube.com/watch?v=VY3kMFrA3wU ](http://www.youtube.com/watch?v=VY3kMFrA3wU) –

+1

हाँ जो बिल्कुल दिखता है fillAfter के साथ बग की तरह। अजीब हालांकि पहला बटन काम करता है, दो बटनों के बीच क्या अंतर है? – MikeIsrael

+1

मैंने जिस समाधान की सिफारिश की है वह अभी भी सभी संस्करणों के लिए काम करना चाहिए। मैंने एक कस्टम लेआउट क्लास बनाया जो एनीमेशन एन्ड() पर ओवरराइड करता है और वहां मैं ऑब्जेक्ट के मार्जिनबाउंड को सही स्थान पर ले जाने के लिए आवश्यकतानुसार बदलता हूं। – MikeIsrael