Форум программистов, компьютерный форум CyberForum.ru

TextView закрасить уголок - Android

Восстановить пароль Регистрация
 
Rube
910 / 558 / 87
Регистрация: 13.02.2014
Сообщений: 2,066
06.02.2015, 10:38     TextView закрасить уголок #1
Очень часто делаю списки ListView и приходится для визуального отображения одной строки как-то помечать ее (напр. любимая команда в списке команд КХЛ).
Раньше делал так: в разметке в углу создавал невидимый ImageView, а в адаптере делал ему Vizible.
А как мне программно нарисовать или закрасить левый верхний уголок в TextView?
Если менять background, то как размерность определять его? Или как-то рисовать можно?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.02.2015, 10:38     TextView закрасить уголок
Посмотрите здесь:

TextView // крэш Android
Цвет TextView Android
Android TextView и картинкака
Вывод в TextView Android
Android Вывод в TextView
Html и TextView Android
Android Обратиться к TextView
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Gabberr
 Аватар для Gabberr
101 / 101 / 17
Регистрация: 13.10.2009
Сообщений: 402
06.02.2015, 11:14     TextView закрасить уголок #2
Можно в 9-patch нарисовать бекграунд с отметкой в нужном месте и чтоб растягивался по всякому, но отметка была всегда в одном месте.
Прикрепил пример
Изображения
 
Rube
910 / 558 / 87
Регистрация: 13.02.2014
Сообщений: 2,066
06.02.2015, 11:18  [ТС]     TextView закрасить уголок #3
Gabberr, что за клякса?) А примера нет, я гуглил ничего не нашел?
Gabberr
 Аватар для Gabberr
101 / 101 / 17
Регистрация: 13.10.2009
Сообщений: 402
06.02.2015, 11:21     TextView закрасить уголок #4
Ну вот эту кляксу если вставить в background элементу textview, то она всегда будет в верхнем правом углу, вне зависимости от размера textview
Про ninepatch http://habrahabr.ru/post/113623/
Rube
910 / 558 / 87
Регистрация: 13.02.2014
Сообщений: 2,066
06.02.2015, 11:27  [ТС]     TextView закрасить уголок #5
Gabberr, хорошо, будем изучать. Сейчас пока гуглю про canvas, может получится нарисовать для общего развития.
Gabberr
 Аватар для Gabberr
101 / 101 / 17
Регистрация: 13.10.2009
Сообщений: 402
06.02.2015, 11:56     TextView закрасить уголок #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Работу работать совсем лень, вот наваял примерчик с кастомным TextView, где на канвасе рисуется треугольник в левом верхнем углу
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
public class MyTextView extends TextView
{
    private int dividerColor;
 
    Paint trianglePaint;
 
    Path trianglePath;
 
    public MyTextView(Context context)
    {
        super(context);
        init(context);
    }
 
    public MyTextView(Context context, AttributeSet attrs)
    {
        super(context, attrs);
        init(context);
    }
 
    public MyTextView(Context context, AttributeSet attrs, int defStyle)
    {
        super(context, attrs, defStyle);
        init(context);
    }
 
    private void init(Context context)
    {
        Resources resources = context.getResources();
 
        dividerColor = resources.getColor(android.R.color.black);
 
        trianglePaint = new Paint();
        trianglePaint.setStyle(Paint.Style.FILL);
        trianglePaint.setColor(Color.RED);
        Point point = new Point();
        point.x = 0;
        point.y = 0;
        trianglePath = getTriangle(point, 30);
    }
 
    @Override
    protected void onDraw(Canvas canvas)
    {
        super.onDraw(canvas);
 
        canvas.drawPath(trianglePath, trianglePaint);
    }
 
    private Path getTriangle(Point p1, int width) {
        Point p2 = new Point(p1.x + width, p1.y);
        Point p3 = new Point(0, p1.y + width);
        Path path = new Path();
        path.moveTo(p1.x, p1.y);
        path.lineTo(p2.x, p2.y);
        path.lineTo(p3.x, p3.y);
 
        return path;
    }
 
 
}
Rube
910 / 558 / 87
Регистрация: 13.02.2014
Сообщений: 2,066
06.02.2015, 13:32  [ТС]     TextView закрасить уголок #7
Огромный спс за примерчик, сижу разбираюсь, ибо тяпница. Итак, значит Point это точки с координатами по которым рисовать линии, p1 - первая точка, width - длина линии.
Для треугольника в правом верхнем углу я должен определить p1 = getWidth() и дальше пошел по точкам рисунок рисовать, правильно?
Gabberr
 Аватар для Gabberr
101 / 101 / 17
Регистрация: 13.10.2009
Сообщений: 402
06.02.2015, 14:00     TextView закрасить уголок #8
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Да всё верно, только в текущей реализации getWidth будет возвращать всегда 0, т.к размер ещё не определён.
Нужно немного подправить
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 private void init(Context context)
    {
        Resources resources = context.getResources();
 
        dividerColor = resources.getColor(android.R.color.black);
 
        trianglePaint = new Paint();
        trianglePaint.setStyle(Paint.Style.FILL);
        trianglePaint.setColor(Color.RED);
    }
 
    @Override
    protected void onDraw(Canvas canvas)
    {
        super.onDraw(canvas);
 
        canvas.drawPath(getTriangle(30), trianglePaint);
    }
 
    private Path getTriangle(int width) {
        Point p1 = new Point(getWidth(),0);
        Point p2 = new Point(p1.x - width, p1.y);
        Point p3 = new Point(p1.x, p1.y + width);
        Path path = new Path();
        path.moveTo(p1.x, p1.y);
        path.lineTo(p2.x, p2.y);
        path.lineTo(p3.x, p3.y);
 
        return path;
    }
Rube
910 / 558 / 87
Регистрация: 13.02.2014
Сообщений: 2,066
06.02.2015, 14:54  [ТС]     TextView закрасить уголок #9
Вот теперь все получилось, в getTriangle() отправляю integer из ресурсов, дабы треугольник под все экраны подходил.
Rube
910 / 558 / 87
Регистрация: 13.02.2014
Сообщений: 2,066
09.02.2015, 15:24  [ТС]     TextView закрасить уголок #10
Застрял с отображением этого треугольника в листвью.
Сделал поле boolean myT в MyTextView.
При формировании адаптера (SimpleCursorAdapter) в переопределенном методе bindView() вызываю метод класса MyTextView
Java
1
2
MyTextView mtv = new MyTextView(context);  
mtv.setmyT(true);
и присваиваю true.
Java
1
2
3
public void setmyT(boolean m) {
        this.myT = m;
}
Но в методе init, где я хочу в зависимости от myT делать треугольник прозрачным или нет, myT всегда равен false.
Java
1
2
3
4
5
if (myT){
    trianglePaint.setColor(getResources().getColor(R.color.blue_status_bar));
} else {
    trianglePaint.setColor(getResources().getColor(R.color.transparent));
}
А еще делал вместо myT статическую переменную, которая меняется в адаптере, тогда при листании листвью треугольнички прыгают куда захотят.
Кажется мне надо чисто кастомный адаптер делать вместо переопределения и там поле делать, или как-то еще?

Добавлено через 33 минуты
Чего-то и кастомным адаптером не вышло, какое поле то делать и зачем... менять то надо в самом MyTextView.
Gabberr
 Аватар для Gabberr
101 / 101 / 17
Регистрация: 13.10.2009
Сообщений: 402
09.02.2015, 15:30     TextView закрасить уголок #11
Просто добавьте invalidate
Либо явный вызов:
Java
1
2
3
MyTextView mtv = new MyTextView(context);  
mtv.setmyT(true);
mtv.invalidate();
либо в самой вьюхе:
Java
1
2
3
4
public void setmyT(boolean m) {
    this.myT = m;
    invalidate();
}
Rube
910 / 558 / 87
Регистрация: 13.02.2014
Сообщений: 2,066
09.02.2015, 16:19  [ТС]     TextView закрасить уголок #12
Gabberr, нивкакую не хочет
Вызываю в адаптере явно или по курсору = 2
Java
1
2
3
4
5
6
7
8
9
10
11
    @Override
    public void bindView(View view, Context context, Cursor cursor) {
        MyTextView mtv = new MyTextView(context);
//      mtv.setmyT(true); 
        mtv = (MyTextView) view.findViewById(R.id.tTeam);  
        mtv.setmyT(true); 
//      if (cursor.getPosition() == 2) {
//          mtv.setmyT(true);
//      } else {
//          mtv.setmyT(false);
//      }
Получаю всегда false в 17-й строке
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    public void setmyT(boolean m) {     
        this.myT = m; 
        invalidate();
        Log.d("", "setmyT " + myT);
    }
    
    public boolean getmyT() {
        Log.d("", "getmyT " + myT);
        return this.myT;
    }
 
    private void init(Context context) {        
        Resources resources = context.getResources();        
        dividerColor = resources.getColor(android.R.color.black);
        trianglePaint = new Paint();
        trianglePaint.setStyle(Paint.Style.FILL);
        if (getmyT()) {
            trianglePaint.setColor(getResources().getColor(R.color.blue_status_bar));
        } else {
            trianglePaint.setColor(getResources().getColor(R.color.transparent));
        }
    }
Добавлено через 3 минуты
Вот такой лог
Кликните здесь для просмотра всего текста
getmyT false
getmyT false
setmyT true
getmyT false
getmyT false
setmyT true
getmyT false
getmyT false
setmyT true
Gabberr
 Аватар для Gabberr
101 / 101 / 17
Регистрация: 13.10.2009
Сообщений: 402
09.02.2015, 16:50     TextView закрасить уголок #13
Грешу на bindView, можете показать весь код этого метода?
проверил на списке с arrayadapter'ом работат как надо
адаптер
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
 class MyAdapter extends ArrayAdapter{
 
        boolean[] items;
 
        public MyAdapter(Context context, int resource, boolean[] items) {
            super(context, resource);
            this.items = items;
        }
 
        public View getView(int position, View convertView, ViewGroup parent){
 
            View v = convertView;
 
            if (v == null) {
                LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                v = inflater.inflate(R.layout.mytext, null);
            }
 
            MyTextView mytv = (MyTextView) v.findViewById(R.id.mytv);
            boolean b = items[position];
 
            if(b){
                mytv.setSelected(true);
            }else{
                mytv.setSelected(false);
            }
 
            return v;
 
        }
 
        public int getCount(){
            return items.length;
        }
    }

onCreate
Кликните здесь для просмотра всего текста
Java
1
2
3
boolean[] arr = new boolean[]{true,false,true,true,false};
MyAdapter myAdapter = new MyAdapter(this,R.layout.mytext, arr);
lv.setAdapter(myAdapter);


Добавлено через 5 минут
аа так у вас в другом походу проблема, метод init вызывается один раз при создании объекта.
Нужно либо вынести в отдельный метод это
Java
1
2
3
4
5
 if (getmyT()) {
            trianglePaint.setColor(getResources().getColor(R.color.blue_status_bar));
        } else {
            trianglePaint.setColor(getResources().getColor(R.color.transparent));
        }
либо сделать так
Java
1
2
3
4
5
6
7
@Override
    protected void onDraw(Canvas canvas)
    {
        super.onDraw(canvas);
        if(myT)
            canvas.drawPath(getTriangle(30), trianglePaint);
    }
Rube
910 / 558 / 87
Регистрация: 13.02.2014
Сообщений: 2,066
10.02.2015, 12:41  [ТС]     TextView закрасить уголок #14
Чот никак не получается, я даже вынес в адаптер, но так вообще не срабатывает
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Override
public void bindView(View view, Context context, Cursor cursor) {
    if (cursor.getPosition() == 2)
        myT = true;
    else
        myT = false;
    
    MyTextView mtv = new MyTextView(context) {
        @Override
        protected void onDraw(Canvas canvas) {       
            super.onDraw(canvas);  
            if (myT)
            canvas.drawPath(getTriangle(getResources().getInteger(R.integer.triangle_width)),
                trianglePaint);
        }
Завтра попробую на отдельном примере.

Добавлено через 15 часов 55 минут
Наконец-то получилось, спасибо, надо было только и всего, что вынести trianglePaint.setColor в onDraw.
Java
1
2
3
4
5
6
7
8
    @Override
    protected void onDraw(Canvas canvas) {       
        super.onDraw(canvas);        
        trianglePaint.setColor(getResources().getColor(myT ? 
                R.color.blue_status_bar : R.color.transparent));        
        canvas.drawPath(getTriangle(getResources().getInteger(R.integer.triangle_width)),
                trianglePaint);
    }
А что за поля и методы вот эти, и без них прекрасно работает, они нужны?
Java
1
2
3
Path trianglePath;
Resources resources = context.getResources();        
dividerColor = resources.getColor(android.R.color.black);
Gabberr
 Аватар для Gabberr
101 / 101 / 17
Регистрация: 13.10.2009
Сообщений: 402
10.02.2015, 12:53     TextView закрасить уголок #15
неиспользуемые поля можно выкинуть.
Немного не верно с точки зрения использования ресурсов всегда рисовать в onDraw, у вас если рисовать не нужно, то рисуется прозрачно, а лучше совсем не рисовать
Вот мой итоговый вариант
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
public class MyTextView extends TextView
{
 
    private Paint trianglePaint;
    private boolean isSelected = false;
 
    public MyTextView(Context context)
    {
        super(context);
        init(context);
    }
 
    public MyTextView(Context context, AttributeSet attrs)
    {
        super(context, attrs);
        init(context);
    }
 
    public MyTextView(Context context, AttributeSet attrs, int defStyle)
    {
        super(context, attrs, defStyle);
        init(context);
    }
 
    private void init(Context context){
        trianglePaint = new Paint();
        trianglePaint.setStyle(Paint.Style.FILL);
        trianglePaint.setColor(getResources().getColor(
                R.color.blue_status_bar));
    }
 
    @Override
    protected void onDraw(Canvas canvas)
    {
        super.onDraw(canvas);
        if(isSelected)
            canvas.drawPath(getTriangle(30), trianglePaint);
    }
 
    private Path getTriangle(int width) {
        Point p1 = new Point(getWidth(),0);
        Point p2 = new Point(p1.x - width, p1.y);
        Point p3 = new Point(p1.x, p1.y + width);
        Path path = new Path();
        path.moveTo(p1.x, p1.y);
        path.lineTo(p2.x, p2.y);
        path.lineTo(p3.x, p3.y);
 
        return path;
    }
 
    public void setSelected(boolean isSelected){
        this.isSelected = isSelected;
        invalidate();
    }
 
    public boolean isSelected(){
        return isSelected;
    }
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.02.2015, 14:08     TextView закрасить уголок
Еще ссылки по теме:

Часы в TextView Android
Android Клик по textview
Вылетает TextView Android
TextColor textView Android
Android TextView и Html

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Rube
910 / 558 / 87
Регистрация: 13.02.2014
Сообщений: 2,066
10.02.2015, 14:08  [ТС]     TextView закрасить уголок #16
Да, сделал так, все работает, все дело было в этом, спасибо!
Цитата Сообщение от Gabberr Посмотреть сообщение
аа так у вас в другом походу проблема, метод init вызывается один раз при создании объекта.
Yandex
Объявления
10.02.2015, 14:08     TextView закрасить уголок
Ответ Создать тему
Опции темы

Текущее время: 12:17. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru