android - تعيين لون شكل الروبوت برمجيا




android-layout shape (7)

أنا أقوم بتحريرها لجعل السؤال أكثر بساطة ، على أمل أن يساعد في الحصول على إجابة دقيقة.

قل لدي الشكل oval التالي:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
    <solid android:angle="270"
           android:color="#FFFF0000"/>
    <stroke android:width="3dp"
            android:color="#FFAA0055"/>
</shape>

كيف يمكنني ضبط اللون برمجيًا ، من داخل فئة النشاط؟


Answers

ملاحظة : تم تحديث الإجابة لتغطية السيناريو حيث تكون background عبارة عن ColorDrawable . شكراً لك تايلر بفاف على ذلك.

إن drawable هو بيضاوي وهو خلفية ImageView

احصل على Drawable من imageView باستخدام getBackground() :

Drawable background = imageView.getBackground();

تحقق ضد المشتبه بهم المعتاد:

if (background instanceof ShapeDrawable) {
    // cast to 'ShapeDrawable'
    ShapeDrawable shapeDrawable = (ShapeDrawable) background;
    shapeDrawable.getPaint().setColor(ContextCompat.getColor(mContext,R.color.colorToSet));
} else if (background instanceof GradientDrawable) {
    // cast to 'GradientDrawable'
    GradientDrawable gradientDrawable = (GradientDrawable) background;
    gradientDrawable.setColor(ContextCompat.getColor(mContext,R.color.colorToSet));
} else if (background instanceof ColorDrawable) {
    // alpha value may need to be set again after this call
    ColorDrawable colorDrawable = (ColorDrawable) background;
    colorDrawable.setColor(ContextCompat.getColor(mContext,R.color.colorToSet));
}

نسخة مدمجة:

Drawable background = imageView.getBackground();
if (background instanceof ShapeDrawable) {
    ((ShapeDrawable)background).getPaint().setColor(ContextCompat.getColor(mContext,R.color.colorToSet));
} else if (background instanceof GradientDrawable) {
    ((GradientDrawable)background).setColor(ContextCompat.getColor(mContext,R.color.colorToSet));
} else if (background instanceof ColorDrawable) {
    ((ColorDrawable)background).setColor(ContextCompat.getColor(mContext,R.color.colorToSet));
}

لاحظ أن الفحص الفارغ غير مطلوب.

ومع ذلك ، يجب استخدام mutate() على drawables قبل تعديلها إذا تم استخدامها في مكان آخر. (بشكل افتراضي ، تشترك الرسومات المحملة من XML في نفس الحالة.)


جرب هذا:

 public void setGradientColors(int bottomColor, int topColor) {
 GradientDrawable gradient = new GradientDrawable(Orientation.BOTTOM_TOP, new int[]  
 {bottomColor, topColor});
 gradient.setShape(GradientDrawable.RECTANGLE);
 gradient.setCornerRadius(10.f);
 this.setBackgroundDrawable(gradient);
 }

لمزيد من التفاصيل تحقق من هذا الرابط this

امل مساعدة.


نأمل أن يساعد هذا شخصًا لديه نفس المشكلة

GradientDrawable gd = (GradientDrawable) YourImageView.getBackground();
//To shange the solid color
gd.setColor(yourColor)

//To change the stroke color
int width_px = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, youStrokeWidth, getResources().getDisplayMetrics());
gd.setStroke(width_px, yourColor);

تمت الإجابة على هذا السؤال لفترة من الوقت ، ولكن يمكن تحديثه من خلال إعادة الكتابة كوظيفة تمديد kotlin.

fun Drawable.overrideColor(@ColorInt colorInt: Int) {
    when (this) {
        is GradientDrawable -> setColor(colorInt)
        is ShapeDrawable -> paint.color = colorInt
        is ColorDrawable -> color = colorInt
    }
}

التوسيع على إجابة Vikram ، إذا كنت تلوين طرق عرض ديناميكية ، مثل عناصر عرض recycler ، إلخ ... ثم ربما تريد استدعاء mutate () قبل تعيين اللون. إذا لم تقم بذلك ، فسيتم أيضًا تغيير / تلوين أي مشاهد لديها رسمًا عامًا (أي خلفية).

public static void setBackgroundColorAndRetainShape(final int color, final Drawable background) {

    if (background instanceof ShapeDrawable) {
        ((ShapeDrawable) background.mutate()).getPaint().setColor(color);
    } else if (background instanceof GradientDrawable) {
        ((GradientDrawable) background.mutate()).setColor(color);
    } else if (background instanceof ColorDrawable) {
        ((ColorDrawable) background.mutate()).setColor(color);
    }else{
        Log.w(TAG,"Not a valid background type");
    }

}

تفعل مثل هذا:

    ImageView imgIcon = findViewById(R.id.imgIcon);
    GradientDrawable backgroundGradient = (GradientDrawable)imgIcon.getBackground();
    backgroundGradient.setColor(getResources().getColor(R.color.yellow));

Context in Android is an interface to global information about an application environment. This is an abstract class whose implementation is provided by the Android system. It allows access to application-specific resources and classes, as well as up-calls for application-level operations such as launching activities, broadcasting and receiving intents, etc.





android android-layout shape