2016-01-27 11 views
13

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

import android.os.Bundle; 
import android.support.design.widget.FloatingActionButton; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 
import android.view.View; 
import android.view.animation.TranslateAnimation; 

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     final FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
     fab.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       TranslateAnimation anim = new TranslateAnimation(0, -500, 0, -500); 
       anim.setDuration(1000); 
       anim.setFillEnabled(true); 
       anim.setFillAfter(true); 
       fab.startAnimation(anim); 
      } 
     }); 
     fab.setOnLongClickListener(new View.OnLongClickListener() { 
      @Override 
      public boolean onLongClick(View view) { 
       TranslateAnimation anim = new TranslateAnimation(0, -500, 0, -500); 
       anim.setDuration(1000); 
       anim.setFillEnabled(true); 
       anim.setFillAfter(true); 
       fab.startAnimation(anim); 
       return true; 
      } 
     }); 
    } 
} 

तो बुनियादी तौर पर, मैं एक onClickListener और एक onLongClickListener कि 500idks द्वारा फैब का अनुवाद, लेकिन समस्या यह जोड़ा यह है कि यह काम नहीं करता है जैसा कि यह माना जाता है।

जब मैं उस पर क्लिक करता हूं तो आमतौर पर कुछ नहीं होता है, जो शुरू करने के लिए अजीब है। यह होने के video यहां है।

जब मैं उस पर लम्बा दबाता हूं, तो यह एनिमेट करता है जैसे मुझे चाहिए, लेकिन केवल अगर मैं दबाता रहता हूं, और जब भी मैं अपनी उंगली उठाता हूं तो यह मूल स्थिति पर वापस जाता है चाहे एनीमेशन पूर्ण हो या नहीं, भले ही मैं setFillEnabled(true) सेट करता हूं और setFillAfter(true)

जब मैं lift मेरी उंगली और जब मैं leave अंत में स्क्रीन पर अपनी उंगली और everything पर होता हूं तो यहां क्या होता है इसका वीडियो यहां होता है।

Animation

हो रहा क्यों है?

+0

मुझे लगता है कि आप यह घोषणा करनी चाहिए 'FloatingActionButton fab' एक वैश्विक चर –

+0

@MrNeo यह है एक अंतर – Olumide

+1

मैं नहीं किया है संस्करण 5.1.1 पर नेक्सस 4 पर यह कोशिश की। यह आपके काम के अनुसार काम करता है और आपके सेटअप पर आप जो समस्याएं देख रहे हैं उसे नहीं मिला है। –

उत्तर

6

मुझे नहीं पता कि आपको यह एनीमेशन समस्या क्यों मिलती है, लेकिन यह एक बग की तरह दिखता है। मैंने आपके कोड की जांच की और यह मेरे एंड्रॉइड 6.0 पर काम करता है, लेकिन यह एंड्रॉइड एमुलेटर पर एंड्रॉइड 4.4 पर बोर्ड पर काम नहीं करता है (लेकिन मेरा मुद्दा थोड़ा अलग है)।

तो मेरी धारणा यह एक बग है, क्योंकि TranslateAnimation में one, two जैसे कुछ बग थे (और शायद अभी भी है)।

और मेरा सुझाव है कि आप इससे कैसे बच सकते हैं अगला है। अपने विचारों को एनिमेट करने के लिए ViewPropertyAnimator का उपयोग करें।

fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      fab.animate() 
        .translationX(-500) 
        .translationY(-500) 
        .setDuration(1000) 
        .start(); 
     } 
    }); 
    fab.setOnLongClickListener(new View.OnLongClickListener() { 
     @Override 
     public boolean onLongClick(View view) { 
      fab.animate() 
        .translationX(-500) 
        .translationY(-500) 
        .setDuration(1000) 
        .start(); 
      return true; 
     } 
    }); 

मैं एंड्रॉयड एम्युलेटर पर यह जाँच Android 4.3, 4.4, 5.0, 6.0 के साथ और यह ठीक काम करता है: और इस मामले में अपने कोड की तरह दिखना चाहिए।

अद्यतन आप के लिए

मिले समाधान। तो अगर आप समर्थन पुस्तकालय से ViewPropertyAnimatorCompat उपयोग कर सकते हैं और अपने कोड होगा समान करने के लिए:

fab.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
      ViewCompat.animate(fab) 
        .translationX(-500) 
        .translationY(-500) 
        .setDuration(1000) 
        .start(); 
    } 
}); 
fab.setOnLongClickListener(new View.OnLongClickListener() { 
    @Override 
    public boolean onLongClick(View view) { 
      ViewCompat.animate(fab) 
        .translationX(-500) 
        .translationY(-500) 
        .setDuration(1000) 
        .start(); 
     return true; 
    } 
}); 
+0

हाँ व्यूप्रॉपर्टीएनिमीटर मेरे डिवाइस पर भी काम करता है, लेकिन मुझे एपीआई 11 और व्यूप्रॉपर्टीएनिमीटर के साथ काम करने वाला कुछ चाहिए 12 में पेश किया गया था। मुझे लगता है कि आप भी बग के बारे में सही हो सकते हैं – Olumide

+0

@ ओलुमाइड, उस मामले में आप इस लाइब्रेरी का उपयोग करने का प्रयास कर सकते हैं https://github.com/JakeWharton/NineOldAndroids –

+0

@ ओलुमाइड, आपके लिए समाधान मिला, मेरा अपडेट किया गया जवाब –

1

हो सकता है कि यह आपकी समस्या का चिंताओं: SO-Thread

मैं एक AnimatorListener का उपयोग कर रहा है जो पूर्ण एनीमेशन के बाद एक दृश्य की स्थिति सेट करने के लिए।

.addListener(new Animator.AnimatorListener() { 
     @Override 
     public void onAnimationStart(Animator animation) { 

     } 

     @Override 
     public void onAnimationEnd(Animator animation) { 
      // set Position 
     } 

     @Override 
     public void onAnimationCancel(Animator animation) { 

     } 

     @Override 
     public void onAnimationRepeat(Animator animation) { 

     } 
    }); 

मुझे केवल आपके कोड का एक अंश दिखाई देता है। ऑनक्लिक लिस्टनर के साथ आपकी समस्या के लिए मैं जांचता हूं कि आपने एंड्रॉइड सेट किया है या नहीं: क्लिक करने योग्य = "झूठी" आपके एक्सएमएल के अंदर या यदि आपने एक और ऑनक्लिक लिस्टर लागू किया है।

+0

आपके द्वारा प्रदान किया गया लिंक अंतर्दृष्टिपूर्ण था, लेकिन हालांकि यह मेरी व्याख्या नहीं करता है कि जैसे ही मैं अपनी उंगली उठाता हूं। मैंने सबकुछ शामिल करने के लिए कोड भी अपडेट किया – Olumide

2

मुझे लगता है कि आपको एनिम ऑब्जेक्ट को क्लास लेवल वैरिएबल के रूप में रखना होगा, ऑनक्लिक() और ऑनक्लिक() कई मामलों में ओवरलैप्ड फैशन में कॉल किया जाता है। चूंकि, आपके पास अलग-अलग एनिम ऑब्जेक्ट्स हैं, आप दो एनिम ऑब्जेक्ट्स से एक ही फैब तक पहुंचते हैं।

एनिम को बाहर रखें और अपना अवलोकन कृपया पोस्ट करें।

और या तो LongClick() या onClick() विधियों को हटाने का प्रयास करें। यदि संभव हो तो कॉल अनुक्रम को समझने के लिए उन दो विधियों में लॉग जोड़ें।

मैं आपके अवलोकनों की प्रतीक्षा कर रहा हूं।

1

आप ViewPropertyAnimator उपयोग करने के लिए यह काम करने की जरूरत है। here वर्णित अनुसार, एनीमेशन वास्तव में दृश्य को केवल एक बिटमैप प्रतिनिधित्व नहीं करता है।

3

अद्यतन: यह अब समर्थन में लगाई जानी 24.2.0 lib बग मैं खोल दिया है निम्नलिखित लगता है: https://code.google.com/p/android/issues/detail?id=215043

==============

हम में से उन लोगों के लिए है कि भाग्यशाली नहीं सिर्फ एक ViewPropertyAnimation मेरे जैसे के साथ अपने एनीमेशन बदलने के लिए:

इस बग FloatingActionButton के समर्थन कार्यान्वयन में एक बग, FloatingActionButtonEclairMr1 वर्ग है, जहां सभी के लिए एनीमेशन की स्थापना में विशेष की वजह से होता राज्यों को देखें, इसलिए दृश्य पर क्लिक करते समय FloatingActionButtonEclairMr1.ElevateToTranslationZAnimation एनीमेशन निकाल दिया जाता है, इसलिए आपकी एनीमेशन दृश्य से साफ़ हो जाती है।

सरल समाधान है कि मुझे लगता है बस कुछ देरी के साथ अपने एनीमेशन, नहीं startOffset साथ शुरू कर रहा है (क्योंकि यह अभी भी दबाने एनीमेशन द्वारा ओवरराइड होने जा रहा है), लेकिन देरी के साथ एनीमेशन बुला के साथ है (मैं कर रहा हूँ । 100 का उपयोग करते हुए, लेकिन यह भी 60 के साथ की जाँच करें और यह काम किया 20 पर्याप्त नहीं है):

final FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
    fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      //Probably want to do it just for pre Lolipop 
      new Handler(Looper.getMainLooper()).postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        TranslateAnimation anim = new TranslateAnimation(0, -500, 0, -500); 
        anim.setDuration(1000); 
        anim.setFillEnabled(true); 
        anim.setFillAfter(true); 
        fab.startAnimation(anim); 
       } 
      }, 100); 
     } 
    }); 
    fab.setOnLongClickListener(new View.OnLongClickListener() { 
     @Override 
     public boolean onLongClick(View view) { 
      new Handler(Looper.getMainLooper()).postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        TranslateAnimation anim = new TranslateAnimation(0, -500, 0, -500); 
        anim.setDuration(1000); 
        anim.setFillEnabled(true); 
        anim.setFillAfter(true); 
        fab.startAnimation(anim); 
       } 
      }, 100); 
     } 
    }); 
संबंधित मुद्दे