【问题标题】:Ninepatch scaling wrong when scrolling after applying a Colorfilter?应用 Colorfilter 后滚动时 Ninepatch 缩放错误?
【发布时间】:2011-05-04 13:51:21
【问题描述】:

今天我试图让我的列表视图更有活力。所以我创建了一个白色的 Ninepatch 图像并使用 .setColorFilter 方法添加了一个颜色过滤器。那不是问题。 但是在应用这个之后,每次我滚动图像时(随机)缩放错误,所以可以说我的项目是 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);

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

【问题讨论】:

  • orgleftbox 使用什么类? NinePatchDrawable 还是简单的 Drawable?
  • 我用的是普通的 Drawable 会不会导致这个问题?
  • 我不确定,但如果您将 Drawable 更改为 NinePatchDrawable 可能会有帮助。
  • 我会尝试,但是如何从我的 /drawable 文件夹中获取 Ninepatchdrawable?
  • 所以我将我的drawable转换为ninepatchdrawable添加了滤色器但没有改变;(

标签: android listview scroll nine-patch colorfilter


【解决方案1】:

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

【讨论】:

  • 是的,我在上面的解决方案中写了它。如果我将它设置为全部,它将不起作用,所以我必须为每个设置它(不是相同的可绘制对象,因此与内存的链接不同)我希望我没有在上面描述它太错误?我的主要语言是德语,所以我希望我能够尽可能清楚地描述它
【解决方案2】:

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

问题是我在构造函数中加载了一次我的drawable,因为我认为我不必为每个新列表项加载它。但是 android-system 将它们作为相同的内存对象处理。所以每个 listitem-background 都使用相同的内存空间(我希望它没有错,我想是这样)。如果我开始滚动下一个列表项将被声明并根据需要更改其背景的高度和宽度,例如下一项只有 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);

我希望这个答案有用。

编辑(简单千倍):

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

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

【讨论】:

    猜你喜欢
    • 2013-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-31
    • 1970-01-01
    • 2018-12-13
    • 2011-10-11
    • 1970-01-01
    相关资源
    最近更新 更多