我正在尝试为我的应用添加材料文本选择手柄。我从SDK中获取了中间/右侧/左侧手柄(位图)和文本光标(9-patch)的可绘制对象,并设置:
<item name="android:textSelectHandleLeft">@drawable/text_select_handle_left_mtrl_alpha</item>
<item name="android:textSelectHandleRight">@drawable/text_select_handle_right_mtrl_alpha</item>
<item name="android:textSelectHandle">@drawable/text_select_handle_middle_mtrl_alpha</item>
<item name="android:textCursorDrawable">@drawable/text_cursor_mtrl_alpha</item>
它按预期工作。然而,在棒棒糖中,这些可绘制对象使用android:tint
属性以特定颜色进行XML着色,但我无法在API<21上使用。因此,我正在尝试在运行时设置颜色过滤器。
文本光标没有被着色。我认为这可能是由于它是一个9 patch引起的。如何在运行时过滤9-patch可绘制对象?我尝试了所有的
PorterDuff.Mode
。右/左手柄是黑色的,而中间手柄是白色的。
也就是说,它们都不是我想要的绿色。为什么?
正如您在上面所看到的,我在我的编辑文本下设置了四个ImageView
,它们被着色了。
private void setUpTextCursors() {
Drawable left = getResources().getDrawable(R.drawable.text_select_handle_left_mtrl_alpha);
Drawable right = getResources().getDrawable(R.drawable.text_select_handle_right_mtrl_alpha);
Drawable middle = getResources().getDrawable(R.drawable.text_select_handle_middle_mtrl_alpha);
Drawable cursor = getResources().getDrawable(R.drawable.text_cursor_mtrl_alpha);
ColorFilter cf = new PorterDuffColorFilter(mGreenColor, PorterDuff.Mode.SRC_IN);
/**
* tint my ImageViews, but no effect on edit text handles
*/
left.setColorFilter(cf);
right.setColorFilter(cf);
middle.setColorFilter(cf);
/**
* no effect whatsoever
*/
cursor.setColorFilter(cf);
}
看起来我们在这里有一个9-patch着色问题——因为即使在测试ImageView上也无法通过过滤器,以及一个与应用的过滤器都未被文本选择管理器考虑到的问题。
相关的源代码来自于
TextView
class和我不知道怎么找到的这个Editor
隐藏的helper class。花了一些时间研究,但仍然不知道为什么我的过滤器被忽略了。
给 @pskink:让
cursor
成为筛选后的可绘制对象,我可以得到:<ImageView
android:id="@id/1"
android:src="@drawable/cursor_drawable" />
<ImageView
android:id="@id/2" />
第一个不会被着色,但如果我调用
imageView2.setBackground(cursor)
,那么它将被着色。
同样,如果我有<item name="android:textSelectHandle">@drawable/cursor_drawable</item>
这会影响编辑选择(因为我覆盖了默认光标),但它没有着色。
mPaint
值。为什么?除此之外,过滤器在处理句柄时应用得很好,正如您在我的测试视图中所看到的那样。问题在于选择管理器接受可绘制对象但忽略我的过滤器。我在末尾添加了一些源代码链接。 - natariomPaint
进入了setColorFilter
,并使用非空的mColorFilter
退出。但是,光标和测试图像视图仍然是白色的。 - natario