मैं कई दृश्य के बीच में एक भी एनीमेशन उदाहरण साझा करने के लिए प्रबंधित किया है। कम से कम अल्फाएनीमेशन के साथ। मेरे पास एक सूची दृश्य और एक एनीमेशन था जिसे सभी सूची आइटम दृश्यों के किसी विशेष बच्चे पर लागू किया जाना चाहिए। मेरे मामले में किसी भी समय साझा एनीमेशन 'जुड़ने' और 'छोड़ने' के विचारों के लिए संभव होना चाहिए और इसे किसी अन्य तरीके से अन्य एनिमेटेड दृश्यों को प्रभावित नहीं करना चाहिए या पहले से चल रहे एनीमेशन में हस्तक्षेप नहीं करना चाहिए। इसे प्राप्त करने के लिए मुझे एंड्रॉइड के स्टॉक अल्फाएनीमेशन की एक समायोजित प्रतिलिपि बनाना पड़ा। मेरा उपयोग केस अपेक्षाकृत विशेष है, लेकिन अगर किसी को ListView के साथ समान लक्ष्य से निपटना है तो इसे यहां रहने दें।
/**
* This class is a copy of android's stock AlphaAnimation with two adjustments:
* - fromAlpha, toAlpha and duration are settable at any time.
* - reset() method can be blocked. Reason: view.setAnimation() calls animation's reset() method
* which is not intended in our use case.
* For every new list item view we call setAnimation once for it's life time
* and animation should not be reset because it is shared by all list item views and may be in progress.
*/
public class MutableAlphaAnimation extends Animation {
private float mFromAlpha;
private float mToAlpha;
private boolean resetBlocked;
public MutableAlphaAnimation() {
}
public void start(float fromAlpha, float toAlpha, long duration) {
mFromAlpha = fromAlpha;
mToAlpha = toAlpha;
setDuration(duration);
setStartTime(START_ON_FIRST_FRAME);
}
public void setResetBlocked(boolean resetBlocked) {
this.resetBlocked = resetBlocked;
}
@Override
public void reset() {
if (! resetBlocked) super.reset();
}
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
final float alpha = mFromAlpha;
t.setAlpha(alpha + ((mToAlpha - alpha) * interpolatedTime));
}
@Override
public boolean willChangeTransformationMatrix() {
return false;
}
@Override
public boolean willChangeBounds() {
return false;
}
}
एक दृश्य के लिए इस एनीमेशन सेट करने के लिए:
animation.setResetBlocked(true);
view.setAnimation(animation);
animation.setResetBlocked(false);
और एक एनीमेशन (पहले setAnimation द्वारा निर्धारित) शुरू करने के लिए दो बातें किया जाना चाहिए:
animation.start(0.0f, 1.0f, FADE_IN_DURATION);
और उसके बाद आप एनीमेशन द्वारा प्रभावित हर दृश्य पर मैन्युअल रूप से अमान्य() को कॉल करना होगा।
सामान्य प्रारंभएनीमेशन() आपके लिए अमान्य() करता है, लेकिन सेटएनीमेशन नहीं है। (एंड्रॉइड के स्रोतों में View.setAnimation() विधि पर टिप्पणी पढ़ें)।
स्रोत
2012-06-26 14:25:43
उपयोग कर सकते हैं यह उनके कारण नहीं होगा (यहाँ आवश्यक नहीं) सिंक्रनाइज़ेशन से बाहर होने के लिए , विशेष रूप से वे जो बाद में शुरू कर रहे हैं? – Matthew
वास्तव में नहीं। असल में क्या होता है जब आप किसी दृश्य पर 'startAnimation' का उपयोग करते हैं, तब तक यह वांछित स्थान तक पहुंचने तक स्वयं को अमान्य करना शुरू कर देता है। जब आप इसे एक ही समय में सभी विचारों पर कॉल करते हैं, तो वे सभी अपने आप को 'अवैध() 'पर कॉल करेंगे, फिर अगले ड्राइंग पास पर प्रत्येक दृश्य उनके अगले फ्रेम में खींचा जाएगा। चूंकि आप इसे यूआई थ्रेड पर वैसे भी बुला रहे हैं, तब तक कोई भी एनिमेशन तब तक शुरू नहीं होगा जब तक आप उस विधि से वापस नहीं आ जाते। नोट: प्री-हनीकॉम्ब एनीमेशन फ्रेमवर्क का उपयोग केवल दृश्य के दृश्य भाग को ले जाता है।उपयोगकर्ता उस पर क्लिक करने में सक्षम नहीं होगा। – DeeV
मैं anim1.setFillAfter (सत्य) के साथ एनिमेशन लागू करता हूं; और फिर लेआउट पैराम्स का उपयोग कर वास्तव में दृश्य को स्थानांतरित करने के लिए? (मुझे बस कोशिश करनी चाहिए, लेकिन इसके देर से :) – Matthew