2013-07-29 5 views
9

मैं ObjectAnimator का प्रयोग कर एक RelativeLayout नीचे पैमाने पर करने के:ऑब्जेक्टएनिमीटर स्केल प्रॉपर्टी के साथ बीजी ब्लैक बनाता है?

  ObjectAnimator scaleDownX = ObjectAnimator.ofFloat(view, "scaleX", 0.5f); 
      ObjectAnimator scaleDownY = ObjectAnimator.ofFloat(view, "scaleY", 0.5f); 
      scaleDownY.setDuration(1000); 
      AnimatorSet scaleDown = new AnimatorSet(); 
      scaleDown.play(scaleDownX).with(scaleDownY); 
      scaleDown.start(); 

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

enter image description here

मेरे xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:gui="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/bg" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context=".MainActivity$DummySectionFragment"> 
     <RelativeLayout 
     android:id="@+id/res1" 
     android:layout_width="50dp" 
     android:layout_height="50dp" 
     android:tag="res1" 
     android:background="@android:color/holo_red_dark" 
     android:layout_alignTop="@+id/res2" 
     android:layout_alignRight="@+id/include3" 
     android:layout_marginRight="11dp"> 
      <TextView 
       android:layout_marginLeft="15dp" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="res1" 
       android:id="@+id/res1T" 
       android:layout_centerVertical="true" 
       android:layout_centerHorizontal="true"/> 
     </RelativeLayout> 
    </RelativeLayout> 

उत्तर

21

यह साफ समाधान नहीं हो सकता है, लेकिन एनीमेशन अद्यतन श्रोता जोड़ने और माता पिता अमान्य काम कर सकता है।

ObjectAnimator scaleDownX = ObjectAnimator.ofFloat(view, "scaleX", 0.5f); 
ObjectAnimator scaleDownY = ObjectAnimator.ofFloat(view, "scaleY", 0.5f); 
scaleDownX.setDuration(1000); 
scaleDownY.setDuration(1000); 

AnimatorSet scaleDown = new AnimatorSet(); 
scaleDown.play(scaleDownX).with(scaleDownY); 

scaleDownX.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
    @Override 
    public void onAnimationUpdate(ValueAnimator valueAnimator) { 
     View p= (View) v.getParent(); 
     p.invalidate(); 
    }); 
scaleDown.start(); 
+0

मुझे लगता है कि के बारे में सोचा द्वारा DevBytes: Property Animations वीडियो में पाया जा सकता उपलब्ध है, लेकिन माता-पिता के बारे में 20 बार, जो एक अनावश्यक काम का बोझ हो सकता है अवैध हो जाता है। खैर, जब तक मुझे कुछ बेहतर समाधान नहीं मिलते, मुझे लगता है कि मुझे इसके साथ रहना होगा। Thx – slezadav

+0

दूसरा उत्तर क्लीनर और बेहतर – afollestad

+0

"स्केलएक्स" और "स्केलवाई" को View.SCALE_X.getName() और व्यू के साथ प्रतिस्थापित किया जा सकता है। SCALE_Y.getName() – dor506

30

कारण पिछला उत्तर माता-पिता को अमान्य करने की आवश्यकता है क्योंकि आपका एनीमेटरसेट स्केलडाउन का कोई लक्ष्य नहीं है। आपको अपने ऑब्जेक्ट एनीमेटर का लक्ष्य शून्य पर सेट करना चाहिए और एनीमेटरसेट पर लक्ष्य सेट करना चाहिए।

ObjectAnimator scaleDown = ObjectAnimator.ofPropertyValuesHolder(view, 
    PropertyValuesHolder.ofFloat("scaleX", 0.5f), 
    PropertyValuesHolder.ofFloat("scaleY", 0.5f)); 
scaleDown.setDuration(1000); 
scaleDown.start(); 
+1

दोनों समाधान काम नहीं करते हैं जब एनिमेटेड व्यू पदानुक्रम में पहला दृश्य है, उदाहरण के लिए माता-पिता एंड्रॉइड द्वारा प्रदान की गई फ्रेमलेआउट है। वर्तमान ऐप में अभिभावक के साथ बच्चे के दृश्य को एनिमेट करते समय दोनों ठीक से काम करते हैं। –

0

के रूप में टिप्पणी में कहा गया है, बनाने में कोई ObjectAnimator देखें के स्थिर Property वस्तु का उपयोग करना है बजाय के बाद से स्ट्रिंग गुजर का उपयोग कर स्ट्रिंग मान शामिल है के लिए दृष्टिकोण: या एक बेहतर तरीका नीचे कोड का उपयोग किया जाएगा विशेषता के प्रारंभिक मूल्य को प्राप्त करने के लिए सेटटर के लिए प्रतिबिंब और वैकल्पिक रूप से गेटर के लिए प्रतिबिंब। इस से API 14

ObjectAnimator scaleDownX = ObjectAnimator.ofFloat(view, View.SCALE_X, 0.5f); 
ObjectAnimator scaleDownY = ObjectAnimator.ofFloat(view, View.SCALE_Y, 0.5f); 

एक पूर्ण विवरण के गूगल के इंजीनियर चेट हासे

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