2012-08-17 26 views
13

मुझे इसमें आइटम के साथ एक सूची दृश्य मिला है। जब उपयोगकर्ता किसी आइटम पर क्लिक करता है तो इसकी ऊंचाई शून्य पर स्केल होनी चाहिए और नीचे दी गई सभी वस्तुओं को स्क्रॉल करना चाहिए। नीचे मेरा कोड काम नहीं करता है। मेरे कोड के साथ जिस आइटम को स्केल पर क्लिक किया गया था, लेकिन नीचे दिए गए आइटम स्क्रॉल नहीं करते हैं, वे एक ही स्थिति में रहते हैं। मैंने इसे लाइनरलाउट के साथ भी आजमाया है लेकिन एक ही समस्या है।ListView एक आइटम को एनिमेट करें

एक ऐसा ऐप है जो यह सही करता है। इसे Tasks कहा जाता है।

This little image should explain the problem

मेरे वर्तमान कार्यान्वयन इस तरह दिखता है:

@Override 
public void onItemClick(AdapterView<?> arg0, View v, final int index, 
     long id) { 
    Animation anim = AnimationUtils.loadAnimation(getActivity(), 
      R.anim.scaleup); 
    v.startAnimation(anim); 
} 

<set android:shareInterpolator="false" > 
    <scale 
     android:duration="700" 
     android:fillAfter="false" 
     android:fillBefore="false" 
     android:fromXScale="1.0" 
     android:fromYScale="1.0" 
     android:interpolator="@android:anim/accelerate_decelerate_interpolator" 
     android:pivotY="0%" 
     android:toXScale="1.0" 
     android:toYScale="0.0" /> 
</set> 

+1

आपका वर्तमान कार्यान्वयन कैसा दिखता है? – wsanville

+0

@wsanville ने स्रोत जोड़ा –

+0

यह समझना वाकई मुश्किल है कि आप –

उत्तर

7

यहाँ एक वर्ग मैंने बनाया (source I found here से संशोधित) जो आपको इच्छित कार्यक्षमता दे सकता है।

public class FadeUpAnimation extends Animation { 

int mFromHeight; 
View mView; 

public FadeUpAnimation(View view) { 
    this.mView = view; 
    this.mFromHeight = view.getHeight(); 
} 

@Override 
protected void applyTransformation(float interpolatedTime, Transformation t) { 
    int newHeight; 
    newHeight = (int) (mFromHeight * (1 - interpolatedTime)); 
    mView.getLayoutParams().height = newHeight; 
    mView.setAlpha(1 - interpolatedTime); 
    mView.requestLayout(); 
} 

@Override 
public void initialize(int width, int height, int parentWidth, 
     int parentHeight) { 
    super.initialize(width, height, parentWidth, parentHeight); 
} 

@Override 
public boolean willChangeBounds() { 
    return true; 
} 
} 

तो यह आपके यदि आप इसे अपनी आवश्यकताओं फिट करने के लिए प्राप्त कर सकते हैं देखने के लिए इसके साथ खेल सकते हैं मैं इसे कैसे उपयोग कर रहा हूँ

View tv = ... 
Animation a = new FadeUpAnimation(tv); 
a.setInterpolator(new AccelerateInterpolator()); 
a.setDuration(300); 
tv.setAnimation(a); 
tv.startAnimation(a); 

+0

अरे, मैं सूचीकरण को संक्षिप्त करने के लिए इसका उपयोग कर रहा था, लेकिन जब उपयोगकर्ता पूर्ववत दबाता है तो मुझे वापस आने के लिए आइटम की आवश्यकता होती है। किसी भी तरह से मैं एनीमेशन उलटा सकता है? मैंने कोशिश की 'newHeight = (int) (mFromHeight * (1 + interpolatedTime));' शून्य से + को बदलना, लेकिन यह एक अजीब प्रभाव देता है – Zen

+0

'इंटरपोलेटेडटाइम' 0 से 1 तक इंटरपोलेट करता है इसलिए '0 -' को हटाने से विपरीत प्रभाव उत्पन्न होना चाहिए। दृश्य की प्राकृतिक ऊंचाई को आरंभ करने के लिए आपको 'mFromHeight' (संभवतः' mToHeight' का नाम बदलना होगा) को बदलना होगा। जैसे 'this.mToHeight = view.getMeasuredHeight();' – devnate

+0

एक बात: यदि ऊंचाई 0 पर सेट की गई है तो दृश्य फिर से पूर्ण ऊंचाई ले जाएगा (कम से कम मेरे कोड के साथ), तो कुछ करें जैसे 'mView.getLayoutParams() ऊंचाई = गणितअधिकतम (नया हाइट, 1); ' – bluewhile

0

एंड्रॉयड एचटीएमएल, जब आप चौड़ाई बदलने के लिए, ऊंचाई की तरह काम नहीं करते या एक दृश्य में दृश्यता, अन्य विचार उनके पदों को अद्यतन नहीं करते हैं । यदि आपको ऐसा करने की ज़रूरत है, तो आपको व्यक्तिगत रूप से सभी सूचीदृश्य और अपने विचारों को अपडेट करना होगा। यह करने के लिए एक जटिल कोड है।

+0

गलत के लिए क्या पूछ रहे हैं। जैसा कि आप @devnate उत्तर में देख सकते हैं, आप दृश्य सीमा अपडेट को बहुत सरल बना सकते हैं। – bluewhile

3

क्या आप फिर से क्लिक किए गए आइटम का उपयोग करेंगे? यदि नहीं, तो आप कर सकते थे

  1. प्रतीक्षा जब तक एनीमेशन खत्म
  2. भी आप अंतर्निहित डेटा स्टोर से आइटम को हटाना
  3. फिर अपने listadapter की विधि notifyDataSetChanged() फोन
+0

यह सही है। "onAnimationEnd" के लिए एनीमेशन से जुड़े एनीमेशन श्रोता का उपयोग करें और फिर सुझाए गए अनुसार करें। –

+0

यह प्रश्न का उत्तर नहीं देता है - निचले विचार लक्ष्य दृश्य स्केल के रूप में कुछ भी नहीं बढ़ेंगे, एनीमेशन समाप्त हो जाने के बाद वे केवल जगह में स्नैप करेंगे। – Tom

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