एंड्रॉइड फीका हो गया और ImageView के साथ फीका हो गया


89

मैं एक स्लाइड शो मैं निर्माण कर रहा हूँ के साथ कुछ परेशानी हो रही है।

मैंने फीका और फीका करने के लिए xml में 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>

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

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

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

    imageView.setImageBitmap(secondImage);

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

जवाबों:


65

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

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

संपादित करें: थोड़ा और अधिक उपयोगी होने के लिए, यहां ViewSwitcher का उपयोग करने का एक त्वरित उदाहरण है। मैंने 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();
            }
        }
    });

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

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

@ मैं वास्तव में विभिन्न तरीकों के प्रदर्शन की तुलना नहीं करता था। ImageView ऑब्जेक्ट्स के लिए बिटमैप्स के साथ डिकोडिंग / काम करने की तुलना में, मुझे लगता है कि एक ViewSwitcher बनाम का उपयोग करके एनिमेशनलाइनिस्टनर को स्वयं लागू करना बहुत ध्यान देने योग्य नहीं होगा। मुझे हाल ही में पता चला है कि यदि आप एपीआई 11 या उससे ऊपर का उपयोग कर रहे हैं, तो आप कुछ नए एनिमेशन वर्गों का उपयोग कर सकते हैं। आप यहाँ एपीआई 11 के साथ 2 विचारों को
पार करने

96

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

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
यह दिखाने के लिए कि कैसे और बाहर के फीका एनिमेशन को कोड में परिभाषित किया जा सकता है, आप सर, मेरा वोट प्राप्त करें
Herr Grumps

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

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

1
आप सर एक जीवन रक्षक हैं!
faizanjehangir

2
@ जीम - उस विशेष आवंटन से कोई समस्या क्यों होगी? हर बार ImageView.setAnimation (एनीमेशन) को पिछले एनीमेशन के किसी भी संदर्भ को कहा जाता है, खो जाता है, इसलिए कचरा संग्रहकर्ता इस पिछले ऑब्जेक्ट को हटाने में सक्षम होगा। AFAIK, एक स्मृति मुद्दा नहीं है।
greg7gkb

46

क्या आपने कस्टम एनिमेशन के बजाय 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);

2
यह इस सवाल का सबसे अच्छा जवाब है।
ड्रैगनट्रेट

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

TransitionDrawable केवल दो छवियों / परत को संभाल सकता है।
साइनकोडिंडी

एस्प्रेसो टेस्ट चलाने के दौरान संक्रमण का कारण बनता है AppNotIdleException
पीके गुप्ता

6

मैंने पुराने के लिए नई छवि को बदलने के लिए fadeIn एनीमेशन का उपयोग किया

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

2
क्लीनर कोड के लिए android-developers.blogspot.com/2011/05/… देखें ।
zyamys

धन्यवाद!! अभी भी प्रासंगिक ... मुझे अभी सबसे ज्यादा क्या चाहिए था!
टेकाम सुथार

1
धन्यवाद!! यह सबसे अच्छा उत्तर है ... लागू करने के लिए बहुत सरल और आसानी से काम करता है।
user3152377

3

अलादीन क्यू के समाधान के आधार पर, यहां एक सहायक फ़ंक्शन है जो मैंने लिखा था, जो एनीमेशन में थोड़ा फीका आउट / फीका चलाते समय छवि को एक छवि में बदल देगा:

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

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

1. अपने xml में अपने प्रोजेक्ट के एनीमेशन फोल्डर में, फीका सेट करें और फीका करें समय नहीं के बराबर

2. आप जावेद वर्ग से पहले फीका आउट एनीमेशन शुरू करते हैं, दूसरा इमेज व्यू विजिबिलिटी सेट करते हैं फिर फीका आउट एनीमेशन शुरू होने के बाद दूसरी इमेज व्यू विजिबिलिटी सेट करते हैं जिसे आप दृश्य में फीका करना चाहते हैं

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);

3

अनंत फीका में और बाहर के लिए

AlphaAnimation fadeIn=new AlphaAnimation(0,1);

AlphaAnimation fadeOut=new AlphaAnimation(1,0);


final AnimationSet set = new AnimationSet(false);

set.addAnimation(fadeIn);
set.addAnimation(fadeOut);
fadeOut.setStartOffset(2000);
set.setDuration(2000);
imageView.startAnimation(set);

set.setAnimationListener(new Animation.AnimationListener() {
    @Override
    public void onAnimationStart(Animation animation) { }
    @Override
    public void onAnimationRepeat(Animation animation) { }
    @Override
    public void onAnimationEnd(Animation animation) {
        imageView.startAnimation(set);
    }
});

1

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

    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);

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

यह शायद सबसे अच्छा समाधान आपको मिलेगा। सरल और आसान। मैंने इसे udemy पर सीखा। मान लें कि आपके पास क्रमशः छवि आईडी की आईडी 1 और आईडी 2 वाली दो छवियां हैं और वर्तमान में छवि दृश्य आईडी 1 के रूप में सेट है और आप इसे किसी अन्य छवि पर क्लिक करने के लिए बदलना चाहते हैं। इसलिए यह 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
}

}

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.