应用Colorfilter后滚动时Ninepatch缩放错误?

时间:2011-05-04 13:51:21

标签: android listview scroll nine-patch colorfilter

今天我试着让我的listview更有活力。所以我创建了一个白色的ninepatch-image并添加了一个带有.setColorFilter方法的colorfilter。那不是问题。 但是在应用了这个之后,每次我滚动图像都是错误的缩放(随机)所以让我说我的项目是100dp高的一些文本。滚动后,项目仍然是100dp高,所有文本都显示,但背景中的图像现在只使用50dp。

这是我的代码:

这里我如何设置Colorfilter:

orgleftbox = context.getResources().getDrawable(R.drawable.list_bubble);
orgleftbox.setColorFilter( 0xff00c0ff, Mode.MULTIPLY );

以及我如何在我的适配器中添加它

v = inflater.inflate(R.layout.list_view_item, null);            
TextView t = (TextView)v.findViewById(R.id.text);
t.setBackgroundDrawable(orgrightbox);

我希望有人可以帮助我。因为这个bug让我讨厌;(

2 个答案:

答案 0 :(得分:3)

您的解释是正确的,您不能在几个视图上使用Drawable。 Drawable的大小由其视图设置,因此如果您同时将其附加到多个视图,除非视图具有完全相同的维度,否则它将无法正常工作。

答案 1 :(得分:3)

我能够自己解决问题。所以我为其他人回答这个问题;)。

问题是我在构造函数中加载了一次drawable,因为我认为我不需要为每个listitem new加载它。但是android系统将它们作为相同的内存对象处理。所以每个listitem-background使用相同的mem空间(我希望它没有错,我想是这样)。如果我开始滚动,则会声明下一个listitem并将其背景的高度和宽度更改为其需要,例如,下一个项目只有50dp高,它将保存的值更改为此值。现在列表的每个其他背景也会或多或少地改变到这个高度。

简单的解决方法是,您必须为每个新项加载并应用colorfilter。爱斯佩克。在getView方法中。

@Override
public View getView(int pos, View convertView, ViewGroup parent) {
    View v = null;
    leftbox = (NinePatchDrawable) r.getDrawable(R.drawable.bubble_green);
    leftbox.setColorFilter( 0xff00c0ff, Mode.MULTIPLY );

    v = inflater.inflate(R.layout.list_view_item_right, null);
    TextView t = (TextView)v.findViewById(R.id.text);
    t.setBackgroundDrawable(leftbox);

我希望这个答案很有用。

编辑(简单一千倍):

如果您只想将colorFilter应用于布局(Textview ...),请这样做(感谢Pasha):

TextView t = (TextView)v.findViewById(R.id.text);
t.getBackground().setColorFilter(0xff00c0ff, Mode.MULTIPLY );