图层列表中的着色位图

Posted

技术标签:

【中文标题】图层列表中的着色位图【英文标题】:Tint bitmap in layer-list 【发布时间】:2014-12-18 22:06:03 【问题描述】:

不再相关! 此问题与旧 android 4.x 版本中的错误有关。 android:tint 现在应该像在 下面的例子

我正在尝试将色调应用于

内的位图
<?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: android:/>
        </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>

预览显示它应该可以工作,来自 ANDROID-STUDIO:

但在设备上部署时不会着色:

如果我在布局中使用 ImageView,它会正确着色,但会因图层列表而失败。 我相信我已经尝试了所有 tintMode,但没有任何结果。

【问题讨论】:

这方面有什么进展吗?会很棒。 对不起,我对此没有任何新意。我想你有同样的问题?目前我只是避免使用带有位图的图层列表。 我将此提交给谷歌:code.google.com/p/android/issues/… 问题已在 master 分支中解决,以备将来发布。 我投票结束这个问题,因为 OP 表示自己不再相关,并且是由 Android 中的一个错误引起的,该错误在此期间长期修复。 【参考方案1】:

对于可能遇到此问题的其他任何人。这就是我所做的。

设置

Android Studio 2.3.2

Gradle

minSdkVersion 15 targetSdkVersion 25 编译'com.android.support:appcompat-v7:25.3.1'

图层可绘制 我在包含位图的项目中添加了android:id=@+id/bitmapID

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item>
        <shape android:shape="oval">
            <solid android:color="#9e9e9e" />
            <size android: android:/>
        </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>

活动布局 我将图层可绘制添加到 ImageView

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

主活动 在 onCreate() 方法中,我们可以从图层 drawable 中定位位图 使用 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));

    

我希望这可以帮助遇到这个问题的其他人。

【讨论】:

这还有用吗?他们(据说)像 3 年前一样修复了这个错误。 我最近尝试做类似的事情时遇到了同样的问题。这就是为我解决的问题。 请注意,如果在同一页面上有多个图层列表可绘制对象以不同的色调显示,则此解决方案不起作用:Android 可绘制缓存在膨胀相同资源时使用相同的可绘制实例,因此手动设置它的色调是为页面上显示的所有相同的drawable设置相同的色调。 @Nit 但是您仍然可以定义每一层,但 id 对吗?我没有使用超过2个,这就是我问的原因 @somerandomusername 它只适用于 2019 年的 android:tint!不再需要黑客攻击【参考方案2】:

尝试使用位图标记的 xml 可绘制对象

保存以下文件 xml custom_image.xml 并替换您的图标和色调

<?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>

【讨论】:

这是 Android Studio 2 中的老问题。我相信它很久以前就修复了【参考方案3】:

正如@lucidbrot 在 cmets 中提到的那样,android:tint 现在应该可以在没有任何 hack 的情况下工作。

【讨论】:

这是大约 7 年前 Android 中的问题。当然早就解决了。 确实如此,但是当您通过搜索找到此问题并查看不再相关的解决方案时会感到困惑

以上是关于图层列表中的着色位图的主要内容,如果未能解决你的问题,请参考以下文章

调整可绘制图层列表内的位图大小 2

在可绘制图层列表中调整位图大小

在 Picasso 图像加载器中加载位图图像会减慢列表视图中的滚动速度

按颜色着色条码位图

为 iTunes 11 中的歌曲列表着色的算法如何工作? [关闭]

如何从 Geoserver 中的已发布图层生成 <a> 列表?