2011-12-01 11 views
7

परिचय:Animating weightSum संपत्ति ObjectAnimator का उपयोग कर

मैं एक LinearLayout, जो दो उप LinearLayouts, इसलिए की तरह शामिल है:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/dual_pane" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="horizontal" 
    android:weightSum="1.0"> 

    <!-- Screen 1 --> 
    <LinearLayout 
     android:layout_width="0dp" 
     android:layout_height="match_parent" 
     android:background="#ff0000" 
     android:layout_weight="1"> 
    </LinearLayout> 

    <!-- Screen 2 --> 
    <LinearLayout 
     android:layout_width="0dp" 
     android:layout_height="match_parent" 
     android:background="#ff6600" 
     android:layout_weight="1"> 
    </LinearLayout> 
</LinearLayout> 

प्रारंभ में, मैं चाहता हूँ "स्क्रीन 1" सभी स्क्रीन चौड़ाई लेने के लिए उपलब्ध। इसलिए, मेरे R.id.dual_pane में इसका वजन 1.0 है। यह ठीक काम करता है! अगर weightSum = 1.0, स्क्रीन 1 पूरी स्क्रीन पर है!

कुछ संसाधन लोड करने के बाद, मैं अपने R.id.dual_pane weighSum 2.0 को बदलता हूं, जिसके परिणामस्वरूप स्क्रीन 1 और स्क्रीन 2 दोनों स्क्रीन की चौड़ाई से 50% लेते हैं। यह भी सही काम करता है। जब weightSum = 2.0, दोनों स्क्रीन चौड़ाई का 50% लेते हैं।

समस्या:।

मैं weightSum संपत्ति चेतन करना चाहते हैं, तो मेरे screen2, में स्लाइड हो जाएगा मैं मधुकोश लक्षित कर रहा हूं तो minSDK संस्करण 11 है, और मैं सोचा, नए ObjectAnimator ढांचे का उपयोग कर, एक अच्छा चिकनी प्रभाव प्राप्त करने के लिए, मैं आसानी से इस संपत्ति को एनिमेट कर सकता हूं। मैंने सत्यापित किया कि LinearLayout वास्तव में WeightSum() और setWeightSum() विधियों (जो ऑब्जेक्टएनिमीटर का उपयोग करने के लिए आवश्यक है, मुझे लगता है) प्राप्त किया है।

खुद प्रयास:

यहाँ ObjectAnimator का उपयोग कर दिखा और छुपा screen2 करने के लिए अपने कोड है:

private void showScreen2() 
{ 
    //Not-animated will work... 
    //mDualPane.setWeightSum(2.0f); 

    // Now try to animate the weightSum 
    float ws = mDualPane.getWeightSum(); 
    ObjectAnimator anim = ObjectAnimator.ofFloat(mDualPane, "weightSum", ws, 2.0f); 
    anim.setDuration(5000); 
    anim.start(); 
} 

private void hideScreen2() 
{ 
    //Not-animated will work... 
    //mDualPane.setWeightSum(1.0f); 

    // Now try to animate the weightSum 
    float ws = mDualPane.getWeightSum(); 
    ObjectAnimator anim = ObjectAnimator.ofFloat(mDualPane, "weightSum", ws, 1.0f); 
    anim.setDuration(5000); 
    anim.start(); 
} 

यहाँ, मेरी mDualPane मेरी जड़ LinearLayout ...

प्रश्न है:

जब मैं इन कार्यों को कॉल करता हूं, कुछ भी नहीं appens। स्क्रीन बिल्कुल पहले की तरह रहता है। क्या मुझे कहीं मेरे mDualPane पर requestLayout() को कॉल करने की आवश्यकता है? क्या मुझे ऑब्जेक्टएनिमीटर का कुछ ज्ञान याद आ रहा है? या वजन घटाने की संपत्ति को एनिमेट करना असंभव है?

भी:

1) मैं हार्ड-कोडेड चौड़ाई के साथ गड़बड़ नहीं करना चाहते हैं, और उन चेतन। अभी के लिए मैं दोनों स्क्रीन के लिए 50-50 चाहता हूं, लेकिन मैं इसे बाद में बदल सकता हूं। वैसे भी, मुझे दो चौड़ाई के बीच एक विशिष्ट अनुपात निर्धारित करने में सक्षम होना चाहिए।

2) मैं दृश्यता टॉगल के साथ संयुक्त LayoutTransition पर ध्यान दिया है, लेकिन कोई लाभ नहीं हुआ

उत्तर

11

को मैं सही अर्थ है कि मैं अपने आप को लेआउट अद्यतन करने की जरूरत में था:

float ws = mDualPane.getWeightSum(); 
ObjectAnimator anim = ObjectAnimator.ofFloat(mDualPane, "weightSum", ws, 2.0f); 
anim.setDuration(5000); 
anim.addUpdateListener(this); 
anim.start(); 

अब, मैं जोड़ा ObjectAnimator, जो मेरे गतिविधि द्वारा कार्यान्वित किया जाता है और करने के लिए एक UpdateListener लेआउट अद्यतन करता है:

@Override 
public void onAnimationUpdate(ValueAnimator animation) { 
    mDualPane.requestLayout(); 
} 

यह मेरे लिए अजीब लगता है, कि ObjectAnimator फोन नहीं करता है यह स्वयं, लेकिन वैसे भी, यह काम करने के लिए यह है।

समाधान मेरी राय में विशेष रूप से अच्छा है, क्योंकि आप स्क्रीनसाइज़ से स्वतंत्र, स्लाइडिंग में बहुत अच्छी तरह से एनिमेट कर सकते हैं ...

+0

नमस्ते, एंटर्रेको यदि दो रैखिक लेआउट असमान भार रखते हैं, तो क्या हम बाएं तरफ दाएं तरफ लेआउट को स्थानांतरित करने और पूरी स्क्रीन भरने के लिए संभव बना सकते हैं? कृपया – user1108995

+1

दुर्भाग्यवश, यह केवल रैखिकलाइट की प्रकृति के कारण बाएं से दाएं दृश्यों को स्लाइड करने के लिए काम करता है। इसे दूसरी तरफ करने के लिए, मेरा सुझाव है कि आप http://stackoverflow.com/questions/4932462/animate-the-transition-between-fragments – Entreco

+0

देखें, मेरे दो दृश्य लाइनरलाइट में भी हैं लेकिन असमान भार – user1108995

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