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




android-layout shape (5)

التوسيع على إجابة 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");
    }

}

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

قل لدي الشكل 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>

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


تفعل مثل هذا:

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

جرب هذا:

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

ملاحظة : تم تحديث الإجابة لتغطية السيناريو حيث تكون 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 في نفس الحالة.)





shape