অ্যান্ড্রয়েডে পটভূমির রঙের পরিবর্তন এনিমেট করুন


335

আপনি কীভাবে অ্যান্ড্রয়েডে কোনও দৃশ্যের পটভূমির রঙ পরিবর্তন করতে পারেন?

উদাহরণ স্বরূপ:

আমি একটি লাল পটভূমির রঙের সাথে একটি ভিউ আছে। ভিউটির পটভূমি রঙ নীল হয়ে যায়। আমি কীভাবে রঙের মধ্যে মসৃণ রূপান্তর করতে পারি?

যদি দর্শন দিয়ে এটি করা না যায় তবে একটি বিকল্প স্বাগত হবে।


11
যে কেউ আশা করতে পারে যে রঙগুলির মধ্যে একটি মসৃণ রূপান্তর অ্যান্ড্রয়েডের মতো প্ল্যাটফর্মের সমস্যা হওয়া উচিত নয়। যদিও এর জন্য দর্শনগুলি নির্মিত হয়নি। প্রশ্নটি এখনও দাঁড়িয়ে আছে।
এইচপিফিক

উত্তর:


374

আমি এই সমস্যার জন্য একটি (বেশ ভাল) সমাধান বের করে শেষ করেছি!

এটি সম্পন্ন করার জন্য আপনি ট্রানজিশনড্রেইবল ব্যবহার করতে পারেন । উদাহরণস্বরূপ, অঙ্কনযোগ্য ফোল্ডারে কোনও এক্সএমএল ফাইলে আপনি এমন কিছু লিখতে পারেন:

<?xml version="1.0" encoding="UTF-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- The drawables used here can be solid colors, gradients, shapes, images, etc. -->
    <item android:drawable="@drawable/original_state" />
    <item android:drawable="@drawable/new_state" />
</transition>

তারপরে, আপনার এক্সএমএলে প্রকৃত দৃশ্যের জন্য আপনি এই ট্রানজিশন ড্র্যাবেলটিকে android:backgroundঅ্যাট্রিবিউটটিতে উল্লেখ করবেন।

এই মুহুর্তে আপনি নিজের কোড অন-কমান্ডের মাধ্যমে संक्रमणটি শুরু করতে পারেন:

TransitionDrawable transition = (TransitionDrawable) viewObj.getBackground();
transition.startTransition(transitionTime);

অথবা কল করে বিপরীতে ট্রানজিশনটি চালান:

transition.reverseTransition(transitionTime);

সম্পত্তি অ্যানিমেশন এপিআই ব্যবহার করে অন্য সমাধানের জন্য রোমানের উত্তর দেখুন , যা এই উত্তরটি মূলত পোস্ট করার সময় পাওয়া যায় নি।


3
ধন্যবাদ এমএক্সাইডার! এটি প্রশ্নের উত্তর দেয়। দুর্ভাগ্যক্রমে এটি আমার পক্ষে কার্যকর হয় না কারণ পটভূমি হিসাবে ট্রানজিশনড্রেওয়েবলের মতামতটিও অ্যানিমেটেড করতে হবে এবং দেখে মনে হচ্ছে ভিউ অ্যানিমেশনটি ব্যাকগ্রাউন্ড ট্রানজিশনকে ওভাররাইড করে। কোন ধারনা?
এইচপিক

6
অ্যানিমেশনটি শুরু করার পরে ট্রানজিশনড্রেভেবলের শুরু করে এটি সমাধান করুন।
hpique

2
অসাধারণ! ভাল লাগছে আপনাকে কাজ করতে দেখে! অ্যান্ড্রয়েডের সাথে এক্সএমএল করতে পারেন এমন প্রচুর দুর্দান্ত জিনিস রয়েছে - যার বেশিরভাগ অংশটি ডক্সে সমাহিত এবং আমার মতে স্পষ্ট নয়।
ভক্তি

4
মোটেই সুস্পষ্ট নয় Not আমার উল্লেখ করা উচিত যে আমি রঙটি গতিশীল হওয়ায় আমি আমার ক্ষেত্রে এক্সএমএল ব্যবহার করছি না। আপনি কোড দ্বারা ট্রানজিশনড্রেইবল তৈরি করলে আপনার সমাধানটিও কাজ করে।
hpique

2
প্রধান ত্রুটিগুলির মধ্যে একটি হ'ল কোনও অ্যানিমেশন সম্পূর্ণ শ্রোতা নেই
লিও ড্রয়েডকোডার

509

রঙ অ্যানিমেশনের জন্য আপনি নতুন সম্পত্তি অ্যানিমেশন এপি ব্যবহার করতে পারেন :

int colorFrom = getResources().getColor(R.color.red);
int colorTo = getResources().getColor(R.color.blue);
ValueAnimator colorAnimation = ValueAnimator.ofObject(new ArgbEvaluator(), colorFrom, colorTo);
colorAnimation.setDuration(250); // milliseconds
colorAnimation.addUpdateListener(new AnimatorUpdateListener() {

    @Override
    public void onAnimationUpdate(ValueAnimator animator) {
        textView.setBackgroundColor((int) animator.getAnimatedValue());
    }

});
colorAnimation.start();

অ্যান্ড্রয়েড ২.x এর সাথে পশ্চাদগম সামঞ্জস্যের জন্য জ্যাক ওয়ার্টন থেকে নয়টি ওল্ড অ্যান্ড্রয়েড গ্রন্থাগার ব্যবহার করুন ।

getColorপদ্ধতি অ্যান্ড্রয়েড এম এ অসমর্থিত হয়েছে, তাই আপনি দুটি বিকল্প আছে:

  • আপনি যদি সমর্থন লাইব্রেরি ব্যবহার করেন তবে আপনার getColorসাথে কলগুলি প্রতিস্থাপন করতে হবে :

    ContextCompat.getColor(this, R.color.red);
  • আপনি যদি সমর্থন লাইব্রেরি ব্যবহার না করেন তবে আপনার getColorসাথে কলগুলি প্রতিস্থাপন করতে হবে :

    getColor(R.color.red);

2
যদি আপনি সম্পত্তি অ্যানিমেশন এপিআই (বা NineOldAndroid) ব্যবহার করে থাকেন তবে "অবশ্যই" সমাধান করুন solution খুব সাবলীলভাবে অ্যানিমেট করে।
দিমিত্রি জায়েতসেভ

1
এইভাবে ট্রানজিশনের সময়কাল নির্ধারণের কোনও উপায় আছে কি?
iGio90

159
@ iGio90 হ্যাঁ, আপনি এটি বিশ্বাস করবেন না তবে পদ্ধতি কল সেটডিউশন () :)
রোমান মিনেনোক

6
ValueAnimator.ofArgb(colorFrom, colorTo)বিষয়টিকে আরও বেশি দেখায় তবে দুঃখের বিষয় এটি নতুন।
TWiStErRob

1
সুন্দর সমাধান! ধন্যবাদ.
স্টিভ ফলি

137

কীভাবে আপনার দর্শনটি এর পটভূমির রঙ পায় এবং আপনি কীভাবে আপনার লক্ষ্য রঙটি পান তার উপর নির্ভর করে এটি করার বিভিন্ন উপায় রয়েছে।

প্রথম দুটি Android অ্যানিমেশন ফ্রেমওয়ার্ক ব্যবহার করে ।

একটি অবজেক্ট অ্যানিমেটার ব্যবহার করুন যদি:

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

অবজেক্ট অ্যানিমেটার কল করে কাজ করে view.setBackgroundColorযা সংজ্ঞায়িত অঙ্কনযোগ্যকে প্রতিস্থাপন করে যদি না এটির কোনও উদাহরণ থাকে ColorDrawable, যা এটি খুব কমই হয়। এর অর্থ এটি হ'ল স্ট্রোক বা কর্নারের মতো আঁকতে সক্ষম কোনও অতিরিক্ত পটভূমি সম্পত্তি মুছে ফেলা হবে।

একটি মান অ্যানিমেটার ব্যবহার করুন যদি:

  • আপনার দৃশ্যের ব্যাকগ্রাউন্ডের রঙটি একটি অঙ্কনযোগ্যতে সংজ্ঞায়িত করা হয়েছে যা স্ট্রোক বা কর্নার রেডিয়াসের মতো বৈশিষ্ট্যও সেট করে এবং আপনি এটিকে নতুন রঙে পরিবর্তন করতে চান যা চলার সময় সিদ্ধান্ত নেওয়া হয়।

একটি ট্রানজিশন অঙ্কনযোগ্য ব্যবহার করুন যদি:

  • আপনার দৃষ্টিভঙ্গি স্থাপনের আগে সংজ্ঞাযুক্ত দুটি অঙ্কনযোগ্যের মধ্যে স্যুইচ করা উচিত।

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

আপনি যদি স্টেটলিস্টস ড্রইয়েবল বা একটি লেয়ারলিস্টস আঁকতে সক্ষম ব্যবহার করতে চান তবে আপনাকে মান অ্যানিম্যাটর উদাহরণটি সংশোধন করতে হবে, অন্যথায় এটি final GradientDrawable background = (GradientDrawable) view.getBackground();লাইনে ক্রাশ হবে ।

অবজেক্ট অ্যানিমেটার :

সংজ্ঞা দেখুন:

<View
    android:background="#FFFF0000"
    android:layout_width="50dp"
    android:layout_height="50dp"/>

এটি তৈরি করুন এবং এর ObjectAnimatorমতো ব্যবহার করুন ।

final ObjectAnimator backgroundColorAnimator = ObjectAnimator.ofObject(view,
                                                                       "backgroundColor",
                                                                       new ArgbEvaluator(),
                                                                       0xFFFFFFFF,
                                                                       0xff78c5f9);
backgroundColorAnimator.setDuration(300);
backgroundColorAnimator.start();

আপনি অ্যানিম্যাটরআইনফ্লেটার ব্যবহার করে এক্সএমএল থেকে অ্যানিমেশন সংজ্ঞাটি লোড করতে পারেন যেমন অ্যান্ড্রয়েড অবজেক্টে অ্যানিম্যাটর অ্যানিমেট ব্যাকগ্রাউন্ডের রঙ

মান অ্যানিম্যাটর :

সংজ্ঞা দেখুন:

<View
    android:background="@drawable/example"
    android:layout_width="50dp"
    android:layout_height="50dp"/>

অঙ্কনযোগ্য সংজ্ঞা:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#FFFFFF"/>
    <stroke
        android:color="#edf0f6"
        android:width="1dp"/>
    <corners android:radius="3dp"/>

</shape>

এটির মতো একটি মান অ্যানিম্যাটর তৈরি এবং ব্যবহার করুন:

final ValueAnimator valueAnimator = ValueAnimator.ofObject(new ArgbEvaluator(),
                                                           0xFFFFFFFF,
                                                           0xff78c5f9);

final GradientDrawable background = (GradientDrawable) view.getBackground();
currentAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

    @Override
    public void onAnimationUpdate(final ValueAnimator animator) {
        background.setColor((Integer) animator.getAnimatedValue());
    }

});
currentAnimation.setDuration(300);
currentAnimation.start();

স্থানান্তর অঙ্কনযোগ্য :

সংজ্ঞা দেখুন:

<View
    android:background="@drawable/example"
    android:layout_width="50dp"
    android:layout_height="50dp"/>

অঙ্কনযোগ্য সংজ্ঞা:

<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape>
            <solid android:color="#FFFFFF"/>
            <stroke
                android:color="#edf0f6"
                android:width="1dp"/>
            <corners android:radius="3dp"/>
        </shape>
    </item>

    <item>
        <shape>
            <solid android:color="#78c5f9"/>
            <stroke
                android:color="#68aff4"
                android:width="1dp"/>
            <corners android:radius="3dp"/>
        </shape>
    </item>
</transition>

ট্রানজিশনড্রেবেবলটি এর মতো ব্যবহার করুন:

final TransitionDrawable background = (TransitionDrawable) view.getBackground();
background.startTransition(300);

আপনি .reverse()অ্যানিমেশন উদাহরণটি কল করে অ্যানিমেশনগুলি বিপরীত করতে পারেন ।

অ্যানিমেশনগুলি করার অন্যান্য কিছু উপায় আছে তবে এই তিনটি সম্ভবত সবচেয়ে সাধারণ। আমি সাধারণত একটি ভ্যালুএনিমেটার ব্যবহার করি।


কোডে ট্রানজিশনড্রেইবলকে সংজ্ঞায়িত করা এবং ব্যবহার করা সম্ভব, তবে কিছু কারণে এটি দ্বিতীয়বার কাজ করে না। অদ্ভুত।
অ্যান্ড্রয়েড বিকাশকারী

আমার ভিউতে কালারড্র্যাবেবল সেট থাকলেও আমি অবজেক্ট অ্যানিমেটারটি ব্যবহার করতে সক্ষম। আমি কেবল এটি স্থানীয় ভেরিয়েবলে সংরক্ষণ করব, এটিকে শূন্যতে সেট করব এবং অ্যানিমেশনটি শেষ হয়ে গেলে মূল রঙিন ড্র্যাবলকে পিছনে সেট করুন।
মিলো আর্নিলোভস্ক

55

আপনি একটি বস্তু অ্যানিম্যাটর করতে পারেন। উদাহরণস্বরূপ, আমার একটি টার্গেটভিউ আছে এবং আমি আপনার ব্যাকগ্রাউন্ডের রঙটি পরিবর্তন করতে চাই:

int colorFrom = Color.RED;
int colorTo = Color.GREEN;
int duration = 1000;
ObjectAnimator.ofObject(targetView, "backgroundColor", new ArgbEvaluator(), colorFrom, colorTo)
    .setDuration(duration)
    .start();

2
API 21 থেকে আপনি ব্যবহার করতে পারেন ofArgb(targetView, "backgroundColor", colorFrom, colorTo)। তার বাস্তবায়ন শুধু ofInt(...).setEvaluator(new ArgbEvaluator())
ypresto

20

আপনি যদি এর মতো রঙিন অ্যানিমেশন চান,

এখানে চিত্র বিবরণ লিখুন

এই কোডটি আপনাকে সহায়তা করবে:

ValueAnimator anim = ValueAnimator.ofFloat(0, 1);   
anim.setDuration(2000);

float[] hsv;
int runColor;
int hue = 0;
hsv = new float[3]; // Transition color
hsv[1] = 1;
hsv[2] = 1;
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

    @Override
    public void onAnimationUpdate(ValueAnimator animation) {

        hsv[0] = 360 * animation.getAnimatedFraction();

        runColor = Color.HSVToColor(hsv);
        yourView.setBackgroundColor(runColor);
    }
});

anim.setRepeatCount(Animation.INFINITE);

anim.start();

9
আনিম ভেরিয়েবলটি আরম্ভ করা হলে অংশটি কোথায় ?
অগস্ট ভোজন

@ ভয়ে, এটি মান মানচিত্রের উদাহরণ মাত্র।
আরবিকে

এটা করা উচিত anim.setRepeatCount(ValueAnimator.INFINITE); অ্যানিমেশন না now এখনকার মতো এটি নির্ধারণ করুন তবে আমাদের কোনও গ্যারান্টি নেই
মিখাইলকৃস্টপ

@ মিখাইলকিশটপ এনিমেশন-এ কী দোষ হয়েছে? INFINITE? বিকাশকারী.অ্যান্ড্রয়েড
রেফারেন্স

14

সর্বোত্তম উপায় হ'ল মূল্যআনিমেটর এবং ব্যবহার করাColorUtils.blendARGB

 ValueAnimator valueAnimator = ValueAnimator.ofFloat(0.0f, 1.0f);
 valueAnimator.setDuration(325);
 valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator valueAnimator) {

              float fractionAnim = (float) valueAnimator.getAnimatedValue();

              view.setBackgroundColor(ColorUtils.blendARGB(Color.parseColor("#FFFFFF")
                                    , Color.parseColor("#000000")
                                    , fractionAnim));
        }
});
valueAnimator.start();

12

এটি অর্জনের আর একটি সহজ উপায় হ'ল আলফাএনিমেশন ব্যবহার করে ম্লান সঞ্চালন।

  1. আপনার দর্শনকে একটি ভিউগ্রুপ তৈরি করুন
  2. ম্যাচ_ পিতামাতার বিন্যাসের মাত্রা সহ সূচক 0 এ এতে একটি শিশু দর্শন যুক্ত করুন
  3. আপনার সন্তানের ধারক হিসাবে একই পটভূমি দিন
  4. লক্ষ্য রঙে ধারকটির পটভূমিতে পরিবর্তন করুন
  5. আলফাএনিমেশন ব্যবহার করে শিশুটিকে বিবর্ণ করুন।
  6. অ্যানিমেশনটি সম্পূর্ণ হয়ে গেলে শিশুটিকে সরিয়ে ফেলুন (একটি অ্যানিমেশনলিস্টনার ব্যবহার করে)

এক কৌশল! সাবাশ . । ।
এলায়ার আবাদ

9

ব্যাকগ্রাউন্ড পরিবর্তন করতে আমি বেস ক্রিয়াকলাপে এটি ব্যবহার করেছিলাম আমি কোডে উত্পন্ন গ্রেডিয়েন্টড্রেইবলগুলি ব্যবহার করছি, তবে এটি অনুসারে মানিয়ে নেওয়া যেতে পারে।

    protected void setPageBackground(View root, int type){
        if (root!=null) {
            Drawable currentBG = root.getBackground();
            //add your own logic here to determine the newBG 
            Drawable newBG = Utils.createGradientDrawable(type); 
            if (currentBG==null) {
                if(Build.VERSION.SDK_INT<Build.VERSION_CODES.JELLY_BEAN){
                    root.setBackgroundDrawable(newBG);
                }else{
                    root.setBackground(newBG);
                }
            }else{
                TransitionDrawable transitionDrawable = new TransitionDrawable(new Drawable[]{currentBG, newBG});
                transitionDrawable.setCrossFadeEnabled(true);
                if(Build.VERSION.SDK_INT<Build.VERSION_CODES.JELLY_BEAN){
                     root.setBackgroundDrawable(transitionDrawable);
                }else{
                    root.setBackground(transitionDrawable);
                }
                transitionDrawable.startTransition(400);
            }
        }
    }

আপডেট: যদি কেউ একই ইস্যুতে চালিত হয় তবে আমি জানতে পেরেছি যে অ্যান্ড্রয়েড <4.3 এ কোনও কারণে setCrossFadeEnabled(true)একটি অনাকাঙ্ক্ষিত শ্বেত প্রভাবের কারণ হিসাবে আমাকে উপরে উল্লিখিত @ রোমান মিনেনোক ভ্যালুঅ্যানিম্যাটর পদ্ধতিটি ব্যবহার করে <4.3 এর জন্য একটি শক্ত রঙে স্যুইচ করতে হয়েছিল।


আমি ঠিক এটিই খুঁজছিলাম। ধন্যবাদ! :)
সিপাই 3 ই

7

উত্তর বিভিন্নভাবে দেওয়া হয়। এছাড়াও আপনি ব্যবহার করতে পারেন ofArgb(startColor,endColor)এর ValueAnimator

API এর জন্য> 21:

int cyanColorBg = ContextCompat.getColor(this,R.color.cyan_bg);
int purpleColorBg = ContextCompat.getColor(this,R.color.purple_bg);

ValueAnimator valueAnimator = ValueAnimator.ofArgb(cyanColorBg,purpleColorBg);
        valueAnimator.setDuration(500);
        valueAnimator.setInterpolator(new LinearInterpolator());
        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
              @Override
              public void onAnimationUpdate(ValueAnimator valueAnimator) {
                   relativeLayout.setBackgroundColor((Integer)valueAnimator.getAnimatedValue());
              }
        });
        valueAnimator.start();

7

এক্সএমএল চালিত অ্যানিমেশনগুলিতে ডকুমেন্টেশনটি ভয়ঙ্কর। আপনি ব্যবহার করতে পারেন: আমি ঘন্টার কাছাকাছি মাত্র একটি বোতাম পটভূমির রঙ সজীব যখন টিপে ... দু: খিত জিনিস যে অ্যানিমেশন শুধুমাত্র একটি অ্যাট্রিবিউট দূরে হয় অনুসন্ধান করেছেন exitFadeDurationমধ্যে selector:

<selector xmlns:android="http://schemas.android.com/apk/res/android"
    android:exitFadeDuration="200">

    <item android:state_pressed="true">
        <shape android:tint="#3F51B5" />
    </item>

    <item>
        <shape android:tint="#F44336" />
    </item>

</selector>

তারপরে এটি কেবল backgroundআপনার দর্শন হিসাবে ব্যবহার করুন। কোনও জাভা / কোটলিন কোডের প্রয়োজন নেই।


আপনি আমার দিন বাঁচিয়েছেন। ধন্যবাদ।
ফেডেরিকো হিল্যান্ড

1
দুর্দান্ত উত্তর। নোট করুন যে আপনার প্রয়োজনও হতে পারে android:enterFadeDuration; আমার অভিজ্ঞতা ছিল যে এটি ছাড়া আমার অ্যানিমেশনটি দ্বিতীয়বার কার্যকর হয়নি।
স্ট্রিং

7

এখানে একটি দুর্দান্ত ফাংশন যা এটির অনুমতি দেয়:

public static void animateBetweenColors(final @NonNull View viewToAnimateItsBackground, final int colorFrom,
                                        final int colorTo, final int durationInMs) {
    final ColorDrawable colorDrawable = new ColorDrawable(durationInMs > 0 ? colorFrom : colorTo);
    ViewCompat.setBackground(viewToAnimateItsBackground, colorDrawable);
    if (durationInMs > 0) {
        final ValueAnimator colorAnimation = ValueAnimator.ofObject(new ArgbEvaluator(), colorFrom, colorTo);
        colorAnimation.addUpdateListener(animator -> {
            colorDrawable.setColor((Integer) animator.getAnimatedValue());
            ViewCompat.setBackground(viewToAnimateItsBackground, colorDrawable);
        });
        colorAnimation.setDuration(durationInMs);
        colorAnimation.start();
    }
}

এবং কোটলিনে:

@JvmStatic
fun animateBetweenColors(viewToAnimateItsBackground: View, colorFrom: Int, colorTo: Int, durationInMs: Int) {
    val colorDrawable = ColorDrawable(if (durationInMs > 0) colorFrom else colorTo)
    ViewCompat.setBackground(viewToAnimateItsBackground, colorDrawable)
    if (durationInMs > 0) {
        val colorAnimation = ValueAnimator.ofObject(ArgbEvaluator(), colorFrom, colorTo)
        colorAnimation.addUpdateListener { animator: ValueAnimator ->
            colorDrawable.color = (animator.animatedValue as Int)
            ViewCompat.setBackground(viewToAnimateItsBackground, colorDrawable)
        }
        colorAnimation.duration = durationInMs.toLong()
        colorAnimation.start()
    }
}

এটি লোয়ার এন্ড ভার্সন ফোনগুলিকে সমর্থন করে না
কার্তিক এস

2
@ কার্তিক্স আপনার মানে অ্যান্ড্রয়েড 10 এবং নীচে? যদি তা হয় তবে এটি সমর্থন করার জন্য আপনি সহজেই একটি "নাইন ওল্ড অ্যান্ড্রয়েডস" লাইব্রেরি ব্যবহার করতে পারেন: ননলড্যান্ড্রয়েডস ডটকম । বাক্য গঠন প্রায় একই রকম।
অ্যান্ড্রয়েড বিকাশকারী 8

নিম্ন সংস্করণের রঙের জন্য ;
মাহবুবুর রহমান খান

5

একটি ফোল্ডার যোগ অ্যানিমেটর মধ্যে মাঝামাঝি ফোল্ডার। (নামটি অবশ্যই অ্যানিমেটার হতে হবে )। একটি অ্যানিমেটার সংস্থান ফাইল যুক্ত করুন। উদাহরণস্বরূপ res / animator / fade.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <objectAnimator
        android:propertyName="backgroundColor"
        android:duration="1000"
        android:valueFrom="#000000"
        android:valueTo="#FFFFFF"
        android:startOffset="0"
        android:repeatCount="-1"
        android:repeatMode="reverse" />
</set>

ক্রিয়াকলাপ জাভা ফাইলের ভিতরে, এটিকে কল করুন

View v = getWindow().getDecorView().findViewById(android.R.id.content);
AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(this, R.animator.fade);
set.setTarget(v);
set.start();

3

কোটলিনের জন্য নীচের ফাংশনটি ব্যবহার করুন:

private fun animateColorValue(view: View) {
    val colorAnimation =
        ValueAnimator.ofObject(ArgbEvaluator(), Color.GRAY, Color.CYAN)
    colorAnimation.duration = 500L
    colorAnimation.addUpdateListener { animator -> view.setBackgroundColor(animator.animatedValue as Int) }
    colorAnimation.start()
}

আপনি যে রঙের রঙ পরিবর্তন করতে চান তা পাস করুন।


2

আমি দেখতে পেয়েছি যে ArgbEvaluatorঅ্যান্ড্রয়েড উত্স কোডে ব্যবহৃত বাস্তবায়ন রঙের উত্তরণে সেরা কাজ করে। এইচএসভি ব্যবহার করার সময়, দুটি রঙের উপর নির্ভর করে, স্থানান্তরটি আমার জন্য অনেকগুলি রঙের মধ্য দিয়ে ঝাঁপিয়ে পড়েছিল। কিন্তু এই পদ্ধতিটি হয় না।

আপনি কেবল অ্যানিমেট করতে চেষ্টা করছেন, ব্যবহার ArgbEvaluatorসঙ্গে ValueAnimatorহিসাবে প্রস্তাব এখানে :

ValueAnimator colorAnimation = ValueAnimator.ofObject(new ArgbEvaluator(), colorFrom, colorTo);
colorAnimation.addUpdateListener(new AnimatorUpdateListener() {

    @Override
    public void onAnimationUpdate(ValueAnimator animator) {
        view.setBackgroundColor((int) animator.getAnimatedValue());
    }

});
colorAnimation.start();

তবে, আপনি যদি আমার মতো হয়ে থাকেন এবং কোনও ব্যবহারকারীর অঙ্গভঙ্গি বা কোনও ইনপুট থেকে পাস করা অন্য মান দিয়ে আপনার রূপান্তরটি বেঁধে রাখতে চান, তবে ValueAnimatorএটি তেমন কোনও উপকারে আসে না (যদি না আপনার 22 এবং ততোধিক এপিআই-র জন্য টার্গেট করা হয়, তবে এই ক্ষেত্রে আপনি ValueAnimator.setCurrentFraction()পদ্ধতিটি ব্যবহার করতে পারেন )। নীচে দেখানো হিসাবে , এপিআই 22 এর নীচে লক্ষ্য করার সময়, আপনার নিজস্ব পদ্ধতিতে ArgbEvaluatorউত্স কোডে পাওয়া কোডটি মোড়ক করুন :

public static int interpolateColor(float fraction, int startValue, int endValue) {
    int startA = (startValue >> 24) & 0xff;
    int startR = (startValue >> 16) & 0xff;
    int startG = (startValue >> 8) & 0xff;
    int startB = startValue & 0xff;
    int endA = (endValue >> 24) & 0xff;
    int endR = (endValue >> 16) & 0xff;
    int endG = (endValue >> 8) & 0xff;
    int endB = endValue & 0xff;
    return ((startA + (int) (fraction * (endA - startA))) << 24) |
            ((startR + (int) (fraction * (endR - startR))) << 16) |
            ((startG + (int) (fraction * (endG - startG))) << 8) |
            ((startB + (int) (fraction * (endB - startB))));
}

আপনি এটি চান তবে এটি ব্যবহার করুন।


0

এডেমার 111190 এর উত্তরের ভিত্তিতে , আমি এই পদ্ধতিটি তৈরি করেছি এটি যে কোনও দুটি রঙের মধ্যে একটি দৃশ্যের পটভূমির রঙটি পালস করবে:

private void animateBackground(View view, int colorFrom, int colorTo, int duration) {


    ObjectAnimator objectAnimator = ObjectAnimator.ofObject(view, "backgroundColor", new ArgbEvaluator(), colorFrom, colorTo);
    objectAnimator.setDuration(duration);
    //objectAnimator.setRepeatCount(Animation.INFINITE);
    objectAnimator.addListener(new Animator.AnimatorListener() {
        @Override
        public void onAnimationStart(Animator animation) {

        }

        @Override
        public void onAnimationEnd(Animator animation) {
            // Call this method again, but with the two colors switched around.
            animateBackground(view, colorTo, colorFrom, duration);
        }

        @Override
        public void onAnimationCancel(Animator animation) {

        }

        @Override
        public void onAnimationRepeat(Animator animation) {

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