2009-11-24 10 views

답변

91

나는이 질문에 얼마 전에 질문을 받았다 알아,하지만 난 당신이 드로어 블이 있고 그냥 같은 당김을 표시 할 경우에 작동하는 간단한 해결책을 가로 질러왔다 그레이 스케일. 캔버스 또는 화가가 필요하지 않습니다 ...

protected Drawable convertToGrayscale(Drawable drawable) 
{ 
    ColorMatrix matrix = new ColorMatrix(); 
    matrix.setSaturation(0); 

    ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix); 

    drawable.setColorFilter(filter); 

    return drawable; 
} 

희망이 너무 도움이됩니다!

+0

와우, 너무 간단, 너무 좋아! – tacone

+0

남자, 당신은 마법사입니다, 롤빵 고마워요! – Sipty

+1

좋은 팁! 흥미로운 점은 ContextCompat.getDrawable (context, R.drawable.myId);를 전달하여이 메서드를 실행하면됩니다. 다음 번에 동일한 드로어 블을 가져와야 할 때 컬러 필터가 이미 설정되어 있습니다. 내 파트의 경우 색을 내 드로어 블에서 다시 얻으려면 컬러 필터를 제거해야합니다. – Tobliug

17

은 분명히 당신은 색 공간 변환 모든 종류의 작업을 수행 할 ColorMatrix 클래스를 사용할 수 있습니다. 그것은 setSaturation() 방법을 사용하여 쉽게 색상 대 그레이 스케일 변환 (채도 0)을 만듭니다.

따라서이 필터를 사용하여 이미지의 새로운 복사본을 페인트 할 수 있습니다. 나는 이것을 시도하지는 않았지만 정상적으로 작동 할 것입니다 :

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

이미지의 비활성화 된 버전이 아니라 프로그래밍 방식으로이 작업을 구체적으로 수행하고 싶습니까?

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

예, 인스턴스별로 처리하고 싶습니다. 그래도 스 니펫 주셔서 감사합니다. – yanchenko

3

@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); 
+1

작은 Typo : Bitmap.Config.RGB_8888은 Bitmap.Config.ARGB_8888이어야합니다. 고마워. 고마워. – Minsky

관련 문제