假设我们有自定义 ListView
,它通过在其中绘制一些矩形来扩展 onDraw()
方法 .
class Listpicker extends ListView {
//..Some other methods here..//
@Override
protected void onDraw(android.graphics.Canvas canvas) {
super.onDraw(canvas);
canvas.drawBitmap(glassPickerBitmap, null, glassRect, semiTransparrentPaint);
}
}
绘制的位图代表某种玻璃,它是矩形,宽度等于listview的宽度和一些高度 . 我想要的是当列表项滚动到此矩形时,用于绘制文本的颜色(不是所有带背景的项目等)将被更改为另一种颜色 . 因此,例如,当列表项适合使得只有一半高度的文本适合 glassPickerBitmap
时,列表项的外部部分应保持其序数颜色,而 glassPickerBitmap
内的部分应更改其文本颜色 . 列表项是没有任何背景的简单TextView .
怎么能实现这个目标?也许任何 ColorFilter
分配给 Paint
?但是哪里?当 ListView
滚动时,甚至不会调用 onDraw()
Listview
的方法...可以在自定义视图中完成此操作,例如,这将是 ListView
的项目吗?或者可能是某些Color / Shader /不知道这里可以使用哪些叠加,但 where ?
EDIT (added image examples):
这是来自现实应用程序的一些作物的示例 . 有2个 ListView
s:一个在左侧,另一个在右侧 . 玻璃是灰色矩形 . 现在,左侧列表已选择 "United States Dollar" 货币 . 而且我正在以这种方式向右滚动,选择介于美元和阿富汗阿富汗之间 . 现在,我想要的是,左边的 ListView
中的美元货币将以红色绘制(现在确切的颜色无关紧要,我稍后会将其改为有意义的东西)并且,同时,"United States Dollar"的底部和顶部右侧ListView中"Afghan Afghani"的一部分也将以相同的红色绘制 .
此颜色更改应以动态方式完成 - 仅在滚动列表期间,应仅更改玻璃矩形下文本部分的颜色 .
*好的,欧元和美元这里是使用非标准青色绘制的特殊货币 . 问题是至少有白色文字 . 但如果能够改变青色也会很棒 .
2 回答
你可以在他们的实现中告诉他们使用并更新
ListAdapter
中的固定位置,然后他们更新相应匹配的View
,这对我来说是最容易和最简单的方法,但是你没有得到半个半彩色文字,我觉得你还想要:)所以这可能是我给出的最糟糕的答案之一,对不起,我可能会重新审视这个或者希望有人能指出你更好的解决方案
您可以在以下位置看到模糊的演示:
http://telly.com/Y98DS5
肮脏的方式:
使用正确的
ColorMatrixColorFilter
创建一个Paint
,为了回答这个问题,我必须找出_x56219_的5x4矩阵,以获得您想要的青色 . 在下面绘制时,您还需要一些Rect
来定义source和dest .创建一个关闭
Bitmap
和Canvas
,你_1252224_在onSizeChanged
完成,所以我们有适当的视图布局值,在这里你可以开始注意到肮脏,因为你必须分配一个Bitmap
大到你的ListView
所以你可能得到OutOfMemoryException
.覆盖
draw
以使用您的屏幕Canvas
并让ListView
绘制到它,然后您可以将Bitmap
绘制到将照常绘制列表的给定Canvas
,然后绘制Bitmap
的一部分,将使用Paint
进行不同的绘制我们之前定义过,你会得到那些像素的透支 .最后画出预制的玻璃
Bitmap
,我会推荐一个n-patch(9-patch),所以它在屏幕和密度上缩放并看起来很清晰,然后你会得到更多的那些像素透支 .整个蛋糕看起来像:
所以说,我希望你最终得到一个更清洁的解决方案,即使你没有得到那半半性感:)
首先,保留一个备用位图和画布:
确保它的大小合适:
当我们来绘制列表时: