অ্যান্ড্রয়েড বিবর্ণ এবং ইমেজভিউ দিয়ে বিবর্ণ


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>

যা করা হচ্ছে তা হ'ল ফিড এফেক্ট ব্যবহার করে ইমেজভিউ থেকে চিত্র পরিবর্তন করা, সুতরাং বর্তমানে প্রদর্শিত চিত্রটি বিবর্ণ হয়ে যাবে এবং অন্য একটি বিবর্ণ হবে I সমস্যা, এটির সাথে:

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

তবে তারপরে, আমি পরবর্তী চিত্রটি প্রদর্শিত হবে সেট করে রেখেছি:

    imageView.setImageBitmap(secondImage);

এটি কেবল চিত্রভিউতে প্রদর্শিত হয় এবং আমি যখন অ্যানিমেশনটি সেট করি এটি চিত্রটি আড়াল করে, তখন এটি বিবর্ণ হয়ে যায় ... এটির কোনও উপায় আছে, আমি বলতে চাইছি, যখন আমি চিত্রভিউ.সেটামেজবিটম্যাপ (দ্বিতীয় চিত্র) করি; কমান্ড, চিত্রটি তত্ক্ষণাত দেখাবে না, এবং কেবলমাত্র অ্যানিমেশন ফেইডটি কার্যকর হলে?

উত্তর:


66

আপনি যেভাবে শুরু করেছেন এইভাবে প্রয়োগ করতে আপনাকে একটি অ্যানিমেশনলিস্টনার যুক্ত করতে হবে যাতে আপনি কোনও অ্যানিমেশনের শুরু এবং শেষ সনাক্ত করতে পারেন। যখন ফিড আউট এর জন্য অ্যানিমেশনএন্ড () বলা হয়, আপনি নিজের চিত্রভিউ অবজেক্টের দৃশ্যমানতাটি ভিউ-এ নির্ধারণ করতে পারেন, চিত্রগুলি স্যুইচ করুন এবং অ্যানিমেশনটিতে আপনার বিবর্ণ শুরু করুন - আপনার এখানেও অন্য একটি অ্যানিমেশনলিস্টনারের প্রয়োজন হবে। যখন আপনি অ্যানিমেশনটিতে আপনার বিবর্ণ হওয়ার জন্য অ্যানিমেশনএন্ড () পান, তখন চিত্রভিউকে ভিউ হিসাবে সেট করুন IS দৃষ্টিভঙ্গি করুন এবং এটি আপনাকে সন্ধান করছে এমন প্রভাব দেয়।

আমি এর আগেও একইরকম প্রভাব প্রয়োগ করেছি, তবে আমি একক চিত্র দেখার চেয়ে 2 চিত্রবিউজ সহ একটি ভিউউইচর ব্যবহার করেছি । আপনি নিজের বিবর্ণ দিয়ে ভিউউইচারের জন্য "ইন" এবং "আউট" অ্যানিমেশনগুলি সেট করতে পারেন এবং বিবর্ণ হয়ে যেতে পারেন যাতে এটি অ্যানিমেশনলিস্টনার বাস্তবায়ন পরিচালনা করতে পারে। তারপরে আপনাকে যা করতে হবে তা হ'ল 2 ইমেজভিউগুলির মধ্যে বিকল্প।

সম্পাদনা: কিছুটা বেশি দরকারী হওয়ার জন্য, ভিউসউইচারটি কীভাবে ব্যবহার করতে হয় তার একটি দ্রুত উদাহরণ এখানে। আমি সম্পূর্ণ উত্সটি https://github.com/aldryd/imageswitcher এ অন্তর্ভুক্ত করেছি ।

কার্যকলাপ_মাইন.এক্সএমএল

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

মেইনএ্যাকটিভিটি.জভা

    // 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();
            }
        }
    });

ধন্যবাদ মানুষ! আমি সার্ভিসের কথা ভুলে গেছি! এবং ভিউসচিচার টিপটির জন্য ধন্যবাদ, নিজের দ্বারা সবকিছু পরিচালনা করার চেয়ে এটি সহজ বলে মনে হচ্ছে।
আইপিওয়ালভারদে

@ এ্যালড্রাইড এটি আরও কার্যকর পারফরম্যান্স ভিত্তিক? নির্বাচিত উত্তরের তুলনায় (পৃথক এক্সএমএল ফাইল)?
রন

@ রন আমি সত্যিই বিভিন্ন পদ্ধতির পারফরম্যান্সের তুলনা করি নি। ইমেজভিউ অবজেক্টগুলির জন্য বিটম্যাপের সাথে ডিকোডিং / কাজ করার সাথে তুলনা করে, আমি মনে করব যে অ্যানিমেশনলিস্টনার নিজেই বাস্তবায়নের তুলনায় ভিউউইচার ব্যবহার করে খুব বেশি নজর দেওয়া যায় না। আমি সম্প্রতি জানতে পেরেছি আপনি যদি 11 বা ততোধিক এপিআই ব্যবহার করে থাকেন তবে আপনি কিছু নতুন অ্যানিমেশন ক্লাস ব্যবহার করতে পারেন। আপনি এখানে এপিআই 11 এর সাথে 2 ভিউ
ক্রসফিডিংয়ের

96

আমি আপনার মতো একই লক্ষ্য অর্জন করতে চেয়েছিলাম, তাই আমি নিম্নলিখিত পদ্ধতিটি লিখেছিলাম যা হুবহু এটি করে যে আপনি যদি এটি একটি চিত্র ভিউ এবং চিত্র অঙ্কনযোগ্যদের রেফারেন্সের একটি তালিকা পাস করেন।

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

4
কোডে কীভাবে বিবর্ণ ইন ও আউট অ্যানিমেশনগুলি সংজ্ঞায়িত করা যায় তা
বোঝানোর জন্য

আপনি আপনার অন এনিমেশন রেপিট পদ্ধতিতে পুনরাবৃত্তিগুলি এবং একটি অ্যারে.রেংহিট% গণনাও করতে পারবেন
বুটেলো

4
@ ক্রোকোডাইল আপনি কি মনে করেন যে আপনার কোডটিতে মেমরির সমস্যা থাকতে পারে। উপরের কোড সহ ক্রিয়াকলাপটি চালিয়ে যেতে দিন। এটি অনেকগুলি অ্যানিমেশনসেট অবজেক্ট তৈরি করবে। এটির কি কোনও সম্ভাবনা আছে যে এটি কিছু সময়ের পরে আউট অফ স্মৃতিতে ক্র্যাশ হয়ে যাবে?
মণি

4
আপনি স্যার একটি জীবন রক্ষাকারী!
ফাজানজাহাঙ্গীর

4
@ জিম - কেন এই নির্দিষ্ট বরাদ্দ একটি সমস্যা সৃষ্টি করবে? প্রতিবার চিত্রভিউ.সেটএনিমেশন (অ্যানিমেশন) কে বলা হয় পূর্ববর্তী অ্যানিমেশনের কোনও রেফারেন্স নষ্ট হয়ে যায়, তাই আবর্জনা সংগ্রহকারী এই পূর্ববর্তী অবজেক্টটি মুছতে সক্ষম হবেন। আফাইক, কোনও স্মৃতির সমস্যা নয়।
greg7gkb

46

আপনি কি কাস্টম অ্যানিমেশনগুলির পরিবর্তে ট্রানজিশনড্রেবল ব্যবহার করার কথা ভেবে দেখেছেন? https://developer.android.com/references/android/ographicics/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);

4
এটি এই প্রশ্নের সেরা উত্তর।
ড্রাগনটি

বাম্পিংয়ের জন্য দুঃখিত, তবে আমি যদি এটি হ্যান্ডলারে ব্যবহার করি এবং এটি স্থায়ী লুপে রাখি তবে অ্যাপ্লিকেশনটি আমার থাকা অ্যানিমেশনটির অন্য ধ্রুবক বিবর্ণে পারফরম্যান্স হারিয়ে ফেলে। কোন recomendations?
জেমস

TransitionDrawable কেবল দুটি চিত্র / স্তর পরিচালনা করতে পারে।
Signcodeindie

পরিবৃত্তি অঙ্কনযোগ্য যখন এসপ্রেসো পরীক্ষা চলছে AppNotIdleException ঘটায়
পি কে গুপ্ত

6

আমি পুরানোটির জন্য নতুন চিত্র প্রতিস্থাপন করতে ফেইডইন অ্যানিমেশন ব্যবহার করেছি

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


ধন্যবাদ!! এখনও প্রাসঙ্গিক ... আমার এখনই সর্বাধিক যা দরকার ছিল!
তীकाम সুথার

4
ধন্যবাদ!! এটি সেরা উত্তর ... বাস্তবায়নের জন্য খুব সহজ এবং সহজেই কাজ করে।
ব্যবহারকারীর 15152377

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

আপনি দুটি সাধারণ পয়েন্ট দ্বারা এটি করতে পারেন এবং আপনার কোড পরিবর্তন করতে পারেন

আপনার প্রকল্পের আনিম ফোল্ডারে আপনার এক্সএমএলটিতে, বিবর্ণ সেট করুন এবং সময়কালের সময় কম হবে না

ফিড আউট অ্যানিমেশন শুরুর আগে আপনি জাভা ক্লাসে, দ্বিতীয় চিত্রটি দেখুন দৃশ্যমানতা চলে গেলেন তারপরে বিবর্ণ হওয়ার পরে অ্যানিমেশনটি দ্বিতীয় চিত্রটি দেখুন দৃশ্যমানতা সেট করুন যা আপনি দৃশ্যমান হয়ে যেতে চান

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

অসীম ফেড ইন এবং আউট জন্য For

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

এটি সম্ভবত আপনি পাবেন সেরা সমাধান। সহজ এবং সহজ। আমি তা শিখেছি আডেমিতে। ধরুন আপনি ইমেজ আইডি এর id1 থাকার দুটো চিত্রের আছে এবং যথাক্রমে id2 এবং বর্তমানে ইমেজ দৃশ্য 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
}

}

আমি আশা করি এটি অবশ্যই সহায়তা করবে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.