作者ericdoctor (小黑)
看板AndroidDev
标题[问题] Drawable mutate 使用方式
时间Thu Apr 14 17:35:30 2016
大家好
这次在练习使用drawable的layer-list
碰到一些问题,上来求助大家
我用xml写了一个 箭头的图案(arrow_shape.xml)
并且想用程式码动态更改颜色
但是因为一个Drawable档案载入至记忆体之後
为了方便重复使用以及节省资源
所以在记忆体内的Drawable物件有一个static的变数
去储存它的颜色值
而我会在萤幕上呈现出很多个箭头
箭头的颜色是随机选择的,而箭头旁边会有文字告知正确颜色是什麽
碰到问题是箭头的颜色不一定会正确
思考之後发现应该是CPU平行处理的关系
一般来说正常的处理方式是这样
更改颜色→显示在萤幕上
但假设我今天要呈现一个红色箭头(A)跟一个黄色箭头(B)
cpu可能这样跑
A箭头改成红色→B箭头改成黄色→显示A在萤幕上→显示B在萤幕上
结果因为static的颜色值的关系,导致A B都是黄色
请问应该怎麽解决才好呢!???
我有查到可以使用mutate()这个method去处理
但是自己尝试使用的结果会导致全部颜色都是第一次随机决定的颜色
请问有人有解法吗...
谢谢各位
以下附上箭头档案以及更改颜色的原始码
arrow_shape.xml
<?xml version="1.0" encoding="UTF-8"?>
<layer-list xmlns:android="
http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/arrow">
<shape android:shape="rectangle">
<size
android:width="55dp"
android:height="59dp" />
<solid android:color="#5EB888" />
<corners android:radius="0dp"/>
</shape>
</item>
<item
android:top="55dp"
android:bottom="-30dp"
android:left="-22dp">
<!--左边的三角形-->
<rotate
android:fromDegrees="42">
<shape android:shape="rectangle">
<solid android:color="#ffffff" />
</shape>
</rotate>
</item>
<item
android:top="55dp"
android:bottom="-30dp"
android:right="-22dp">
<!--右边的三角形-->
<rotate
android:fromDegrees="-42">
<shape android:shape="rectangle">
<solid android:color="#ffffff" />
</shape>
</rotate>
</item>
</layer-list>
动态换颜色的程式码
LayerDrawable d = (LayerDrawable) ContextCompat.getDrawable(getContext(),
R.drawable.arrow_shape);
GradientDrawable shape =
(GradientDrawable)d.findDrawableByLayerId(R.id.arrow);
shape.setColor(getResources().getColor(colorRef));
this.setBackgroundResource(backgroundImage);
在这边我的this是relativelayout
谢谢各位~~
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.121.196.88
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/AndroidDev/M.1460626532.A.220.html
1F:→ ssccg: 我不懂明明是不同的Drawable(不同颜色)为什麽硬要用同一个 04/18 17:20
2F:→ ssccg: 就算你弄到可以设颜色>系统draw>换颜色>系统draw,第一次没 04/18 17:25
3F:→ ssccg: 问题,那後面你能控制什麽时候view会重画吗? 每次重画前都 04/18 17:26
4F:→ ssccg: 依现在是要给哪个view用再去改颜色? 04/18 17:26
5F:→ ssccg: Drawable不是只有设给view用完後就能随便改,是有状态的 04/18 17:33
6F:→ ssccg: 应该每个颜色的都要从 getDrawable > mutate > 设颜色 04/18 17:35
7F:→ ssccg: 不要共用不同颜色的 04/18 17:35
8F:→ ericdoctor: 谢谢S大 我本来的想法是模组化 想说同一张图 可以使 04/19 00:51
9F:→ ericdoctor: 用程式去更改颜色就好 我懂他的状态的意思了 谢谢 04/19 00:52