Android 应用颜色过滤器后滚动时Ninepatch缩放错误?

Android 应用颜色过滤器后滚动时Ninepatch缩放错误?,android,listview,scroll,nine-patch,colorfilter,Android,Listview,Scroll,Nine Patch,Colorfilter,今天我试着让我的listview更有活力。因此,我创建了一个白色的ninepatch图像,并使用.setColorFilter方法添加了一个colorfilter。这不是问题所在。 但在应用此功能后,每次我滚动图像时,图像的缩放都是错误的(随机的),所以让我们假设我的项目是100dp高的,带有一些文本。滚动后,项目仍然高达100dp,显示所有文本,但背景中的图像现在仅使用50dp 这是我的密码: 下面是我如何设置颜色过滤器: orgleftbox = context.getResources()

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

这是我的密码:

下面是我如何设置颜色过滤器:

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);

我希望有人能帮助我。因为这个虫子让我讨厌;(

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

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

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

简单的解决方法是,您必须为每个新项目加载并应用颜色过滤器。特别是。在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);
我希望这个答案是有用的

编辑(简单一千倍):

如果您只想将颜色过滤器应用于版面(Textview…),请按此方式执行(谢谢Pasha):


你在orgleftbox中使用什么类?NinePatchDrawable还是simple Drawable?我使用普通的Drawable,这会导致这个问题吗?我不确定,但如果你将Drawable更改为NinePatchDrawable,可能会有帮助。我会尝试,但如何从我的/Drawable文件夹中获得NinePatchDrawable?因此我将我的Drawable转换为NinePatchDrawable,添加了颜色过滤器,但没有更改;(是的,我在上面的解决方案中写了它。如果我将它设置为all,它将不起作用,因此我必须为每个设置它(不是相同的绘图,因此与mem的链接也不相同)。我希望我没有在上面描述得太错?我的主要语言是德语,因此我希望我能够尽可能清楚地描述它
TextView t = (TextView)v.findViewById(R.id.text);
t.getBackground().setColorFilter(0xff00c0ff, Mode.MULTIPLY );