Неправильное масштабирование Ninepatch при прокрутке после применения Colorfilter?

#android #listview #scroll #nine-patch #colorfilter

#Android #listview #прокрутка #девятикратное исправление #colorfilter

Вопрос:

сегодня я попытался сделать свой listview немного более динамичным. Итак, я создал белое ninepatch-изображение и добавил colorfilter с помощью метода .setColorFilter. Проблема не в этом. Но после применения этого каждый раз, когда я прокручиваю изображение, оно неправильно масштабируется (случайным образом), поэтому допустим, что мой элемент имеет высоту 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);
  

Я надеюсь, что кто-нибудь может мне помочь. Потому что эта ошибка меня раздражает; (

Комментарии:

1. Какой класс вы используете для orgleftbox? NinePatchDrawable или простой Drawable?

2. Я использую обычный Drawable, может ли это вызвать эту проблему?

3. Я не уверен, но, возможно, если вы измените Drawable на NinePatchDrawable, это поможет.

4. я попробую, но как я могу получить ninepatchdrawable из моей папки / drawable?

5. итак, я преобразовал свой drawable в ninepatchdrawable, добавил colorfilter, но без изменений; (

Ответ №1:

Ваша интерпретация верна, вы не можете использовать Drawable в нескольких представлениях. Размер отрисовываемого объекта определяется его видом, поэтому, если вы прикрепите его к нескольким видам одновременно, он не будет работать должным образом, если виды не имеют точно такого же размера.

Комментарии:

1. да, я написал это выше в своем решении. если я установлю для него значение all, это не сработает, поэтому я должен установить его для каждого (не тот, который можно нарисовать, поэтому не та же ссылка на mem), надеюсь, я не слишком неправильно описал это выше? мой основной язык — немецкий, поэтому я надеюсь, что смог описать это как можно более ясно

Ответ №2:

я смог решить свою проблему самостоятельно. Итак, я отвечаю на это за всех остальных ;).

Проблема заключалась в том, что я загрузил свой drawable один раз в конструктор, потому что я думал, что мне не придется загружать его для каждого нового элемента списка. Но Android-система обрабатывает их как один и тот же объект памяти. таким образом, каждый listitem-background использует одно и то же пространство памяти (я надеюсь, что это не неправильно, я так думаю). Если я начну прокручивать, будет объявлен следующий listitem, который изменит высоту и ширину фона в соответствии с его потребностями, например, следующий элемент имеет высоту всего 50dp, это изменит сохраненное значение на это. Теперь любой другой фон списка также изменится более или менее на эту высоту.

Простое исправление заключается в том, что вы должны загружать и применять colorfilter для каждого нового элемента. espec. в методе 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 …), сделайте это таким образом (спасибо, Паша):

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