somerandomusername
somerandomusername

Reputation: 2023

Tint bitmap in layer-list

No longer relevant! This issue is related to a bug in old Android 4.x build. android:tint should now work correctly as in the example below

I'm trying to apply tint to bitmap inside < layer-list >

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item>
        <shape  xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
            <solid android:color="@color/grey" />
            <size android:width="45dp" android:height="45dp"/>
        </shape>
    </item>
    <item android:left="5dp" android:right="5dp" android:top="5dp" android:bottom="5dp">
        <bitmap android:src="@drawable/ic_action" android:tint="#FF000000"   />
    </item>
</layer-list>

Preview shows that it should work, FROM ANDROID-STUDIO: enter image description here

But it doesn't tint when deployed on device: enter image description here

It does tint correctly if i use ImageView in my layout, but fails with layer-list. I believe I have tried every tintMode with no results.

Upvotes: 26

Views: 16168

Answers (3)

Steve C.
Steve C.

Reputation: 1353

For anyone else that may come across this question, this is what I did:

Setup

  • Android Studio 2.3.2

Gradle

  • minSdkVersion 15
  • targetSdkVersion 25
  • compile 'com.android.support:appcompat-v7:25.3.1'

Layer Drawable I added android:id=@+id/bitmapID to the item containing the bitmap

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item>
        <shape android:shape="oval">
            <solid android:color="#9e9e9e" />
            <size android:width="45dp" android:height="45dp"/>
        </shape>
    </item>
    <item
        android:id="@+id/tintDrawableImg"
        android:left="5dp"
        android:right="5dp"
        android:top="5dp"
        android:bottom="5dp">
        <bitmap android:src="@mipmap/ic_pencil" android:tint="#860000"   />
    </item>
</layer-list>

Activity Layout I added the layer drawable to an ImageView

<ImageView
    android:id="@+id/tintLayerTest"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:src="@drawable/test_layer"/>

MainActivity In the onCreate() method we can locate the bitmap from the layer drawable using findViewByID

public class MainActivity extends AppCompatActivity {

    ImageView iv;
    LayerDrawable ld;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //Declare ImageView containing LayerDrawable
        iv = (ImageView)findViewById(R.id.tintLayerTest);
        //Get LayerDrawable from ImageView
        ld = (LayerDrawable)iv.getDrawable();
        //Get specific Drawable/Bitmap from within LayerDrawable
        //by ID and pass it as an independent Drawable
        Drawable ldDrawable = ld.findDrawableByLayerId(R.id.tintDrawableImg);
        
        //Pass your new Drawable to DrawableCompat.setTint
        //and define your color int
        DrawableCompat.setTint(ldDrawable, ContextCompat.getColor(this, R.color.colorAccent));

    }
}

I hope this helps others that come across this question.

Upvotes: 18

fobo66
fobo66

Reputation: 430

As it was mentioned by @lucidbrot in the comments, android:tint should work now without any hacks.

Upvotes: 1

Ranjithkumar
Ranjithkumar

Reputation: 18406

Try with xml drawable using bitmap tag

Save the following file xml custom_image.xml & replace your icon & tint color

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

Upvotes: 1

Related Questions