Неправильное масштабирование Ninepatch при прокрутке после применения Colorfilter? - PullRequest
3 голосов
/ 04 мая 2011

сегодня я попытался сделать мой просмотр списка немного более динамичным. Поэтому я создал белое изображение ninepatch и добавил цветовой фильтр методом .setColorFilter. Это не проблема. Но после применения этого, каждый раз, когда я прокручиваю, Изображение масштабируется неправильно (случайным образом), поэтому допустим, что мой элемент имеет высоту 100dp с некоторым текстом. После прокрутки элемент все еще имеет высоту 100 дп, и отображается весь текст, но изображение на заднем плане теперь использует только 50 дп.

Вот мой код:

вот как я установил 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);

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

Ответы [ 2 ]

3 голосов
/ 13 мая 2011

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

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

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

TextView t = (TextView)v.findViewById(R.id.text);
t.getBackground().setColorFilter(0xff00c0ff, Mode.MULTIPLY );
3 голосов
/ 04 мая 2011

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

...