2012-01-04 13 views
71

मुझे एक स्लाइड शो के साथ कुछ परेशानी हो रही है जो मैं बना रहा हूं।एंड्रॉइड फीड इन और फीड आउट इमेज व्यू

मैं में फीका के लिए एक्सएमएल में 2 एनिमेशन बनाया है और बाहर फीका कर दिया है:

fadein.xml

<?xml version="1.0" encoding="UTF-8"?> 
     <set xmlns:android="http://schemas.android.com/apk/res/android"> 
     <alpha android:fromAlpha="0.0" android:toAlpha="1.0" 
      android:interpolator="@android:anim/accelerate_interpolator" 
      android:duration="2000"/> 
    </set> 

fadeout.xml

<?xml version="1.0" encoding="UTF-8"?> 
     <set xmlns:android="http://schemas.android.com/apk/res/android"> 
     <alpha android:fromAlpha="1.0" android:toAlpha="0.0" 
      android:interpolator="@android:anim/accelerate_interpolator" 
      android:duration="2000"/> 
    </set> 

क्या इम ' करने की कोशिश कर रहा है, फीड इफेक्ट का उपयोग करके इमेज व्यू से छवियों को बदलना है, इसलिए वर्तमान में प्रदर्शित छवि खराब हो जाएगी, एक । Nd एक और एक में फीका करना होगा यह देखते हुए कि मैं एक छवि पहले से ही निर्धारित किया है, मैं इस के साथ समस्या के बिना इस छवि Fadeout कर सकते हैं,:

Animation fadeInAnimation = AnimationUtils.loadAnimation(this, R.anim.your_fade_in_anim); 
    imageView.startAnimation(fadeoutAnim); 

लेकिन फिर भी, मैं प्रदर्शित करने के लिए अगली छवि सेट:

imageView.setImageBitmap(secondImage); 

यह सिर्फ छवि दृश्य में दिखाई देता है, और जब मैं एनीमेशन सेट करता हूं तो यह छवि को छुपाता है, इसे फीका करता है ... क्या इसका मतलब है कि, ठीक है, जब मैं छवि दृश्यता हूं I); कमांड, छवि तुरंत दिखाई नहीं देती है, और केवल तभी जब एनीमेशन में फीका निष्पादित किया जाता है?

उत्तर

53

इस तरह से इसे लागू करने के तरीके को लागू करने के लिए, आपको AnimationListener जोड़ने की आवश्यकता होगी ताकि आप एनीमेशन की शुरुआत और समाप्ति का पता लगा सकें। जब fade out के लिए annimationEnd() पर कॉल किया जाता है, तो आप अपनी छवि दृश्य वस्तु की दृश्यता को View.INVISIBLE पर सेट कर सकते हैं, छवियों को स्विच कर सकते हैं और एनीमेशन में अपना फीड शुरू कर सकते हैं - आपको यहां एक और एनीमेशन लिस्टनर की भी आवश्यकता होगी। जब आप एनीमेशन एन्ड() पर एनीमेशन में अपने फीड के लिए प्राप्त करते हैं, तो ImageView को देखने के लिए सेट करें। विज़िबल और इससे आपको वह प्रभाव देना चाहिए जो आप ढूंढ रहे हैं।

मैंने पहले एक समान प्रभाव लागू किया है, लेकिन मैंने एक छवि दृश्य के बजाय 2 छवि दृश्यों के साथ ViewSwitcher का उपयोग किया था। आप व्यूस्विचर के लिए "इन" और "आउट" एनीमेशन सेट कर सकते हैं जिसमें फीका हो और फीका हो ताकि यह एनीमेशन लिस्टर कार्यान्वयन का प्रबंधन कर सके। तो आपको बस 2 छवि दृश्यों के बीच वैकल्पिक करना है।

संपादित करें: थोड़ा और उपयोगी होने के लिए, व्यूस्विचर का उपयोग करने का एक त्वरित उदाहरण यहां दिया गया है। मैंने https://github.com/aldryd/imageswitcher पर पूर्ण स्रोत शामिल किया है।

activity_main.xml

<ViewSwitcher 
     android:id="@+id/switcher" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:layout_centerHorizontal="true" 
     android:inAnimation="@anim/fade_in" 
     android:outAnimation="@anim/fade_out" > 

     <ImageView 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:scaleType="fitCenter" 
      android:src="@drawable/sunset" /> 

     <ImageView 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:scaleType="fitCenter" 
      android:src="@drawable/clouds" /> 
    </ViewSwitcher> 

MainActivity.java

// Let the ViewSwitcher do the animation listening for you 
    ((ViewSwitcher) findViewById(R.id.switcher)).setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      ViewSwitcher switcher = (ViewSwitcher) v; 

      if (switcher.getDisplayedChild() == 0) { 
       switcher.showNext(); 
      } else { 
       switcher.showPrevious(); 
      } 
     } 
    }); 
+0

धन्यवाद आदमी! मैं serisisible के बारे में भूल गया! और व्यूस्विचर टिप के लिए धन्यवाद, यह सब कुछ मेरे द्वारा संभालने से आसान लगता है। – IPValverde

+0

@Aldryd यह अधिक कुशल प्रदर्शन-वार है? चयनित उत्तर (अलग एक्सएमएल फ़ाइल) की तुलना में? – Ron

+0

@ रॉन मैं वास्तव में विभिन्न तरीकों के प्रदर्शन की तुलना नहीं करता था। ImageView ऑब्जेक्ट्स के लिए बिटमैप के साथ डिकोडिंग/काम करने की तुलना में, मुझे लगता है कि एनीमेशन लिस्टर को लागू करने के विरुद्ध एक व्यूविचचर का उपयोग करके आप बहुत ध्यान देने योग्य नहीं होंगे।मैंने हाल ही में यह पता लगाया है कि यदि आप एपीआई 11 या ऊपर का उपयोग कर रहे हैं, तो आप कुछ नए एनीमेशन कक्षाओं का उपयोग कर सकते हैं। आप एपीआई 11 के साथ क्रॉसफैडिंग 2 विचारों का एक उदाहरण यहां देख सकते हैं: http://developer.android.com/training/animation/crossfade.html – Aldryd

93

मैं आप के रूप में एक ही लक्ष्य को प्राप्त करना चाहता था, इसलिए मैं निम्न विधि जो वास्तव में करता है ने लिखा है कि अगर आप इसे एक छवि दृश्य और छवि drawables के संदर्भों की एक सूची पास करें।

ImageView demoImage = (ImageView) findViewById(R.id.DemoImage); 
int imagesToShow[] = { R.drawable.image1, R.drawable.image2,R.drawable.image3 }; 

animate(demoImage, imagesToShow, 0,false); 



    private void animate(final ImageView imageView, final int images[], final int imageIndex, final boolean forever) { 

    //imageView <-- The View which displays the images 
    //images[] <-- Holds R references to the images to display 
    //imageIndex <-- index of the first image to show in images[] 
    //forever <-- If equals true then after the last image it starts all over again with the first image resulting in an infinite loop. You have been warned. 

    int fadeInDuration = 500; // Configure time values here 
    int timeBetween = 3000; 
    int fadeOutDuration = 1000; 

    imageView.setVisibility(View.INVISIBLE); //Visible or invisible by default - this will apply when the animation ends 
    imageView.setImageResource(images[imageIndex]); 

    Animation fadeIn = new AlphaAnimation(0, 1); 
    fadeIn.setInterpolator(new DecelerateInterpolator()); // add this 
    fadeIn.setDuration(fadeInDuration); 

    Animation fadeOut = new AlphaAnimation(1, 0); 
    fadeOut.setInterpolator(new AccelerateInterpolator()); // and this 
    fadeOut.setStartOffset(fadeInDuration + timeBetween); 
    fadeOut.setDuration(fadeOutDuration); 

    AnimationSet animation = new AnimationSet(false); // change to false 
    animation.addAnimation(fadeIn); 
    animation.addAnimation(fadeOut); 
    animation.setRepeatCount(1); 
    imageView.setAnimation(animation); 

    animation.setAnimationListener(new AnimationListener() { 
     public void onAnimationEnd(Animation animation) { 
      if (images.length - 1 > imageIndex) { 
       animate(imageView, images, imageIndex + 1,forever); //Calls itself until it gets to the end of the array 
      } 
      else { 
       if (forever){ 
       animate(imageView, images, 0,forever); //Calls itself to start the animation all over again in a loop if forever = true 
       } 
      } 
     } 
     public void onAnimationRepeat(Animation animation) { 
      // TODO Auto-generated method stub 
     } 
     public void onAnimationStart(Animation animation) { 
      // TODO Auto-generated method stub 
     } 
    }); 
} 
+1

यह दिखाने के लिए कि कोड में फीड इन और आउट एनिमेशन को कैसे परिभाषित किया जा सकता है, आप महोदय, मेरा वोट प्राप्त करें –

+0

आप दोहराने की गिनती भी कर सकते हैं और अपने ऐरेमेशन में एक Array.lenght% गिनती कर सकते हैं एनीमेशन रीपेट विधि – butelo

+2

@Crocodile क्या आपको लगता है कि आपके कोड में स्मृति समस्या हो सकती है। उपरोक्त कोड के साथ गतिविधि चलते रहें। यह इतने सारे एनीमेशनसेट ऑब्जेक्ट्स बनाएगा। क्या कोई संभावना है कि यह कुछ समय बाद ओफमेमरी के साथ दुर्घटनाग्रस्त हो जाएगा? – Gem

1

मैं प्रोग्रामेटिक रूप से चेनिंग एनिमेशन के लिए इस तरह के दिनचर्या का उपयोग कर रहा हूं।

public static void ImageViewAnimatedChange(Context c, final ImageView v, final Bitmap new_image) { 
     final Animation anim_out = AnimationUtils.loadAnimation(c, android.R.anim.fade_out); 
     final Animation anim_in = AnimationUtils.loadAnimation(c, android.R.anim.fade_in); 
     anim_out.setAnimationListener(new AnimationListener() 
     { 
      @Override public void onAnimationStart(Animation animation) {} 
      @Override public void onAnimationRepeat(Animation animation) {} 
      @Override public void onAnimationEnd(Animation animation) 
      { 
       v.setImageBitmap(new_image); 
       anim_in.setAnimationListener(new AnimationListener() { 
        @Override public void onAnimationStart(Animation animation) {} 
        @Override public void onAnimationRepeat(Animation animation) {} 
        @Override public void onAnimationEnd(Animation animation) {} 
       }); 
       v.startAnimation(anim_in); 
      } 
     }); 
     v.startAnimation(anim_out); 
    } 
3

अलादीन क्यू के समाधान के आधार पर, यहाँ एक सहायक समारोह है कि मैं ने लिखा है, कि एक imageView में छवि बदल जाएगा एक छोटे से फीका निकलता जा रहा है, जबकि एनीमेशन में/फीका है कस्टम एनिमेशन के बजाय TransitionDrawable का उपयोग करने का विचार? https://developer.android.com/reference/android/graphics/drawable/TransitionDrawable.html

एक तरह से प्राप्त करने के लिए आप के लिए क्या देख रहे है:

// create the transition layers 
Drawable[] layers = new Drawable[2]; 
layers[0] = new BitmapDrawable(getResources(), firstBitmap); 
layers[1] = new BitmapDrawable(getResources(), secondBitmap); 

TransitionDrawable transitionDrawable = new TransitionDrawable(layers); 
imageView.setImageDrawable(transitionDrawable); 
transitionDrawable.startTransition(FADE_DURATION); 
39

आप शामिल हैं:

final Animation anim_out = AnimationUtils.loadAnimation(context, android.R.anim.fade_out); 
    final Animation anim_in = AnimationUtils.loadAnimation(context, android.R.anim.fade_in); 

    anim_out.setAnimationListener(new AnimationListener() 
    { 
     @Override 
     public void onAnimationStart(Animation animation) {} 

     @Override 
     public void onAnimationRepeat(Animation animation) {} 

     @Override 
     public void onAnimationEnd(Animation animation) 
     { 
      //////////////////////////////////////// 
      // HERE YOU CHANGE YOUR IMAGE CONTENT // 
      //////////////////////////////////////// 
      //ui_image.setImage... 

      anim_in.setAnimationListener(new AnimationListener() 
      { 
       @Override 
       public void onAnimationStart(Animation animation) {} 

       @Override 
       public void onAnimationRepeat(Animation animation) {} 

       @Override 
       public void onAnimationEnd(Animation animation) {} 
      }); 

      ui_image.startAnimation(anim_in); 
     } 
    }); 

    ui_image.startAnimation(anim_out); 
+2

अद्भुत! exctly मुझे क्या चाहिए .... – ERJAN

+0

यह इस सवाल के लिए सबसे अच्छा जवाब है। – DragonT

+0

बंपिंग के लिए खेद है, लेकिन अगर मैं इसे हैंडलर में उपयोग करता हूं, और इसे स्थायी लूप में रखता हूं, तो ऐप मेरे पास एक अन्य निरंतर फीका/प्रदर्शन एनीमेशन में प्रदर्शन खो देता है। कोई सिफारिशें? – Firecat

2

मैं इस्तेमाल किया fadein एनिमेशन का उपयोग के लिए एक पुरानी

ObjectAnimator.ofFloat(imageView, View.ALPHA, 0.2f, 1.0f).setDuration(1000).start(); 
+1

क्लीनर कोड के लिए http://android-developers.blogspot.com/2011/05/introducing-viewpropertyanimator.html देखें। – zyamys

1
सबसे अच्छा

और आसान तरीका नई छवि को बदलने के लिए, मेरे लिए यह था ..

-> बस हैंडलर युक्त नींद() युक्त धागा बनाएं।

private ImageView myImageView; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_shape_count); myImageView= (ImageView)findViewById(R.id.shape1); 
    Animation myFadeInAnimation = AnimationUtils.loadAnimation(this, R.anim.fadein); 
    myImageView.startAnimation(myFadeInAnimation); 

    new Thread(new Runnable() { 
     private Handler handler = new Handler(){ 
      @Override 
      public void handleMessage(Message msg) { 
       Log.w("hendler", "recived"); 
        Animation myFadeOutAnimation = AnimationUtils.loadAnimation(getBaseContext(), R.anim.fadeout); 
        myImageView.startAnimation(myFadeOutAnimation); 
        myImageView.setVisibility(View.INVISIBLE); 
      } 
     }; 

     @Override 
     public void run() { 
      try{ 
       Thread.sleep(2000); // your fadein duration 
      }catch (Exception e){ 
      } 
      handler.sendEmptyMessage(1); 

     } 
    }).start(); 
} 
1

आप दो सरल बिंदु से यह करते हैं और अपने कोड में बदल सकते हैं

1.In अपनी परियोजना के anim फ़ोल्डर में अपने xml, में फीका सेट और अवधि समय बराबर नहीं बाहर फीका

बाहर फीका एनीमेशन की शुरुआत से पहले

2.In आप जावा वर्ग, सेट दूसरा imageView चला गया तो बाद एनीमेशन बाहर फीका दृश्यता दूसरा imageView दृश्यता जो आप दिखाई

fadeout.xml में फीका करना चाहते हैं निर्धारित शुरू कर दिया

<alpha 
    android:duration="4000" 
    android:fromAlpha="1.0" 
    android:interpolator="@android:anim/accelerate_interpolator" 
    android:toAlpha="0.0" /> 

fadein.xml

<alpha 
    android:duration="6000" 
    android:fromAlpha="0.0" 
    android:interpolator="@android:anim/accelerate_interpolator" 
    android:toAlpha="1.0" /> 

आप में जावा वर्ग

Animation animFadeOut = AnimationUtils.loadAnimation(this, R.anim.fade_out); 
    ImageView iv = (ImageView) findViewById(R.id.imageView1); 
    ImageView iv2 = (ImageView) findViewById(R.id.imageView2); 
    iv.setVisibility(View.VISIBLE); 
    iv2.setVisibility(View.GONE); 
    animFadeOut.reset(); 
    iv.clearAnimation(); 
    iv.startAnimation(animFadeOut); 

    Animation animFadeIn = AnimationUtils.loadAnimation(this, R.anim.fade_in); 
    iv2.setVisibility(View.VISIBLE); 
    animFadeIn.reset(); 
    iv2.clearAnimation(); 
    iv2.startAnimation(animFadeIn); 
0

यह probab है आपको सबसे अच्छा समाधान मिलेगा। सरल और आसान। मैंने इसे उदमी पर सीखा। मान लीजिए आप क्रमशः छवि आईडी के ID1 और आईडी 2 होने दो छवियों है और वर्तमान में छवि को देखने ID1 के रूप में सेट कर दिया जाता है और आप अन्य छवि हर किसी में क्लिक करता है करने के लिए इसे बदलना चाहते हैं। इसलिए इस MainActivity.java फ़ाइल में बुनियादी कोड है

int clickNum=0; 
public void click(View view){ 
clickNum++; 
ImageView a=(ImageView)findViewById(R.id.id1); 
ImageView b=(ImageView)findViewById(R.id.id2); 
if(clickNum%2==1){ 
    a.animate().alpha(0f).setDuration(2000); //alpha controls the transpiracy 
} 
else if(clickNum%2==0){ 
    b.animate().alpha(0f).setDuration(2000); //alpha controls the transpiracy 
} 

} 

मुझे आशा है कि यह निश्चित रूप से मदद मिलेगी

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