سؤال
ما هي الطريقة الصحيحة لتحويل اللون القابل للرسم إلى لون رمادي (للإشارة إلى الحالة المعوقة)؟
تعديل:
ب/ث => رمادي
المحلول
أعلم أن هذا السؤال قد تم طرحه منذ فترة ، لكنني صادفت حلاً أبسط يعمل إذا كان لديك رسم وترغب فقط في عرض نفس السحب في رمادي. لا حاجة للحصول على قماش أو رسام ...
protected Drawable convertToGrayscale(Drawable drawable)
{
ColorMatrix matrix = new ColorMatrix();
matrix.setSaturation(0);
ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix);
drawable.setColorFilter(filter);
return drawable;
}
أتمنى أن يساعد هذا أيضًا!
نصائح أخرى
يبدو أنه يمكنك استخدام ColorMatrix
فئة للقيام بأي نوع من التحولات في مساحة الألوان. لديها setSaturation()
الطريقة التي تنشئ بسهولة تحول من اللون إلى غرامات (تشبع الأصفار) لك.
لذلك ، يمكنك استخدام هذا المرشح لرسم نسخة جديدة من الصورة. لم أحاول هذا ، لكن يجب أن يعمل:
Bitmap grayscaleBitmap = Bitmap.createBitmap(
colorBitmap.getWidth(), colorBitmap.getHeight(),
Bitmap.Config.RGB_565);
Canvas c = new Canvas(grayscaleBitmap);
Paint p = new Paint();
ColorMatrix cm = new ColorMatrix();
cm.setSaturation(0);
ColorMatrixColorFilter filter = new ColorMatrixColorFilter(cm);
p.setColorFilter(filter);
c.drawBitmap(colorBitmap, 0, 0, p);
بعض القوانين إلى إجابة intgr.
1. Bitmap.Config.ARGB_8888
للحفاظ على قناة ألفا.
2. رمز إضافي صغير:
//remember, you are converting a .png image, as opposed to a Drawable defined in .xml
Bitmap colorBitmap = ((BitmapDrawable)drawable).getBitmap();
// the code by intgr
Drawable grayscaleDrawable = new BitmapDrawable(grayscaleBitmap);
هل تريد على وجه التحديد القيام بذلك برمجيًا وليس فقط مع الإصدارات المعوقة من الصور؟ يمكنك الرجوع إلى XML قابلة للرسم ، شيء مثل:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_window_focused="false" android:state_enabled="true"
android:drawable="@drawable/btn_default_normal" />
<item android:state_window_focused="false" android:state_enabled="false"
android:drawable="@drawable/btn_default_normal_disable" />
<item android:state_pressed="true"
android:drawable="@drawable/btn_default_pressed" />
<item android:state_focused="true" android:state_enabled="true"
android:drawable="@drawable/btn_default_selected" />
<item android:state_enabled="true"
android:drawable="@drawable/btn_default_normal" />
<item android:state_focused="true"
android:drawable="@drawable/btn_default_normal_disable_focused" />
<item
android:drawable="@drawable/btn_default_normal_disable" />
</selector>