source

그릴 수 있는 색을 프로그래밍 방식으로 변경

ittop 2023. 10. 4. 22:59
반응형

그릴 수 있는 색을 프로그래밍 방식으로 변경

화이트 마커 이미지의 색상을 코드로 변경하려고 합니다.아래 코드에서 색상을 변경해야 한다고 읽었는데, 제 마커는 흰색으로 남아있습니다.

Drawable.setColorFilter( 0xffff0000, Mode.MULTIPLY )

제가 뭔가를 빠뜨렸나요?제 레스 폴더에 있는 드로어에 다른 색상을 변경할 수 있는 방법은 없나요?

시도해 보기:

Drawable unwrappedDrawable = AppCompatResources.getDrawable(context, R.drawable.my_drawable); 
Drawable wrappedDrawable = DrawableCompat.wrap(unwrappedDrawable);
DrawableCompat.setTint(wrappedDrawable, Color.RED);    

사용.DrawableCompatAPI 22 이전 기기에서 역호환성과 버그 수정을 제공하기 때문에 중요합니다.

svg 벡터 드로잉이 가능한 경우 사용해보실 수 있습니다.

DrawableCompat.setTint(
    DrawableCompat.wrap(myImageView.getDrawable()),
    ContextCompat.getColor(context, R.color.another_nice_color)
);

그리기 가능한 부분에서 mutate()를 호출해야 할 수 있습니다. 그렇지 않으면 모든 아이콘이 영향을 받습니다.

Drawable icon = ContextCompat.getDrawable(getContext(), R.drawable.ic_my_icon).mutate();
TypedValue typedValue = new TypedValue();
getContext().getTheme().resolveAttribute(R.attr.colorIcon, typedValue, true);
icon.setColorFilter(typedValue.data, PorterDuff.Mode.SRC_ATOP);

이거 한번 해보세요.ImageView.사용.setColorFilter().

imageView.setColorFilter(ContextCompat.getColor(context, R.color.colorWhite));

롤리팝에서 이것을 하는 또 다른 방법인 안드로이드 5.+는 다음과 같이 그릴 수 있는 비트맵에 틴트를 설정하는 것입니다.

<?xml version="1.0" encoding="utf-8"?>
<bitmap
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/ic_back"
    android:tint="@color/red_tint"/>

이 방법은 그림 그리기에 사용할 색상이 제한되어 있는 경우에 사용할 수 있습니다.자세한 내용은 제 블로그 게시물을 확인해 보세요.

컨텍스트 전달, 아이콘은 id drawable/mipmap image 아이콘 및 해당 아이콘에 필요한 새로운 색상을 입력할 수 있는 일반적인 기능을 작성했습니다.

이 함수는 그리기 가능한 것을 반환합니다.

public static Drawable changeDrawableColor(Context context,int icon, int newColor) {
    Drawable mDrawable = ContextCompat.getDrawable(context, icon).mutate(); 
    mDrawable.setColorFilter(new PorterDuffColorFilter(newColor, PorterDuff.Mode.SRC_IN)); 
    return mDrawable;
} 

changeDrawableColor(getContext(),R.mipmap.ic_action_tune, Color.WHITE);

핵심 색상이 흰색이므로 ColorMatrixColorFilter를 사용해 볼 수 있습니다.

// Assuming "color" is your target color
float r = Color.red(color) / 255f;
float g = Color.green(color) / 255f;
float b = Color.blue(color) / 255f;

ColorMatrix cm = new ColorMatrix(new float[] {
        // Change red channel
        r, 0, 0, 0, 0,
        // Change green channel
        0, g, 0, 0, 0,
        // Change blue channel
        0, 0, b, 0, 0,
        // Keep alpha channel
        0, 0, 0, 1, 0,
});
ColorMatrixColorFilter cf = new ColorMatrixColorFilter(cm);
myDrawable.setColorFilter(cf);

저는 이게 통했어요.0x와 색상 코드 사이에 "off"를 반드시 넣으십시오.이렇게 0xff2196F3

Drawable mDrawable = ContextCompat.getDrawable(MainActivity.this,R.drawable.ic_vector_home);
                    mDrawable.setColorFilter(new
                            PorterDuffColorFilter(0xff2196F3,PorterDuff.Mode.SRC_IN));

승인된 답변과 동일하지만 보다 간단한 편리한 방법:

val myDrawable = ContextCompat.getDrawable(context, R.drawable.my_drawable)
myDrawable.setColorFilter(Color.GREEN, PorterDuff.Mode.SRC_IN)
setCompoundDrawablesWithIntrinsicBounds(myDrawable, null, null, null)

여기 암호는 코틀린입니다

Kotlin 단순 확장 기능을 사용하는 사람들을 위해:

fun Drawable.tint(context: Context,  @ColorRes color: Int) {
    DrawableCompat.setTint(this, context.resources.getColor(color, context.theme))
}

그다음에 그냥 해요.

background.tint(context, R.color.colorPrimary)

사용 방법:자바의 경우

view.getBackground().setColorFilter(Color.parseColor("#343434"), PorterDuff.Mode.SRC_OVER)

코틀린을 위하여

view.background.setColorFilter(Color.parseColor("#343434"),PorterDuff.Mode.SRC_OVER)

포터 더프를 사용할 수 있습니다.모드.SRC_TOP, 배경에 둥근 모서리 등이 있는 경우.

시도해 보셔도 좋습니다.Mode.LIGHTEN아니면Mode.DARKEN. Android Javadocs는 포터 더프 모드가 무엇을 하는지 설명하는 것을 형편없습니다.그들을 여기서 볼 수 있습니다: 포터 더프 | 안드로이드

여기 모질라 사이트의 Compositing을 둘러보는 것을 제안합니다. (안드로이드가 하는 모든 모드는 없지만 많은 모드를 가지고 있습니다.)

구문

"your image name".setColorFilter("your context".getResources().getColor("color name"));

myImage.setColorFilter(mContext.getResources().getColor(R.color.deep_blue_new));

다음과 같은 방법으로 그릴 수 있는 색상을 변경할 수 있습니다.

background = view.findViewById(R.id.background)

val uDrawable = AppCompatResources.getDrawable(view.context, R.drawable.background)
uDrawable?.let {
      val wDrawable = DrawableCompat.wrap(it)
      DrawableCompat.setTint(wDrawable, ContextCompat.getColor(view.context, 
                                                      color /*specify your int color code*/))
      background.background = wDrawable
}

SDK >= 21 한줄 myIconImageView.getDrawable().setTint(getResources().getColor(myColor))

코틀린 버전

val unwrappedDrawable =
            AppCompatResources.getDrawable(this, R.drawable.your_drawable)
        val wrappedDrawable = DrawableCompat.wrap(unwrappedDrawable!!)
DrawableCompat.setTint(wrappedDrawable, Color.RED)

이게 제가 한 일입니다.

public static Drawable changeDrawableColor(int drawableRes, int colorRes, Context context) {
    //Convert drawable res to bitmap
    final Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), drawableRes);
    final Bitmap resultBitmap = Bitmap.createBitmap(bitmap, 0, 0,
            bitmap.getWidth() - 1, bitmap.getHeight() - 1);
    final Paint p = new Paint();
    final Canvas canvas = new Canvas(resultBitmap);
    canvas.drawBitmap(resultBitmap, 0, 0, p);

    //Create new drawable based on bitmap
    final Drawable drawable = new BitmapDrawable(context.getResources(), resultBitmap);
    drawable.setColorFilter(new
            PorterDuffColorFilter(context.getResources().getColor(colorRes), PorterDuff.Mode.MULTIPLY));
    return drawable;
}

다음과 같은 메서드 만들기:

//CHANGE ICON COLOR
private void changeIconColor(Context context ,int drawable){
    Drawable unwrappedDrawable = AppCompatResources.getDrawable(context, drawable);
    assert unwrappedDrawable != null;
    Drawable wrappedDrawable = DrawableCompat.wrap(unwrappedDrawable);
    DrawableCompat.setTint(wrappedDrawable, getResources().getColor(R.color.colorAccent));
}

그리고 그것을 그것처럼 사용합니다.

    changeIconColor(this,R.drawable.ic_home);

가장 쉬운 방법:

imageView.setColorFilter(Color.rgb(r, g b));

아니면

imageView.setColorFilter(Color.argb(a, r, g, b));

a, r, g, b : Color argb 값.

간단히 말해서:

2023년 5월 Kotlin (모든 API):

 DrawableCompat.wrap
     (AppCompatResources.getDrawable(ctx, R.drawable.myDrawable)!!)
    .mutate()
    .also { DrawableCompat.setTint(it,0xFFff0000.toInt()) }

요를 잊지 mutate, 가변 뽑기 가능한 뽑기 가능한 것은 그 상태를 다른 어떤 것과도 공유하지 않는 것이 보장됩니다!리소스에서 로드된 도면요소의 속성을 수정해야 할 때 특히 유용합니다.기본적으로 동일한 리소스에서 로드된 모든 드로어블 인스턴스는 공통 상태를 공유하며, 한 인스턴스의 상태를 수정하면 다른 모든 인스턴스도 동일한 수정을 받습니다.가변 Drawable에서 이 메서드를 호출해도 효과가 없습니다.

이전 - Java:

public Drawable getColoredDrawable(@DrawableRes int resid,int color){
    Drawable drawable= ContextCompat.getDrawable(context, resid).mutate();
    DrawableCompat.setTint(drawable, color);
    return drawable;
}

언급URL : https://stackoverflow.com/questions/11376516/change-drawable-color-programmatically

반응형