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

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,070
#1

TextView закрасить уголок - Программирование Android

06.02.2015, 10:38. Просмотров 576. Ответов 15
Метки нет (Все метки)

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

Часы в TextView - Программирование Android
Доброго времени суток. Делаю часы в textview, время ставлю через два NumberPicker. Все работает(если число минут меньше 10, то вперед...

Прыжок к TextView - Программирование Android
На лаяуте имеется множество textView. интересует прыжок к выбранному textView через актионбар (три точки в верхнем правом углу). ...

TextView question - Программирование Android
Всем привет и хорошего дня. А можно ли в коде задавать TextView и присваивать текст из ресурсов strings? Или, если уж в xml всё это...

Обратиться к TextView - Программирование Android
Можно из просто класса public class MyClass { } из статического метода получить доступ к TextView? пробую так, но не...

Calendar textView - Программирование Android
Прошу прощение за название темы! Хотел назвать "Операции с датой + вывод в textView", но тут увидел автопоиск, ищущий по введённому...

TextView и Html - Программирование Android
Здравствуйте уважаемые форумчане! Мне нужно сделать вывод текста в TextView с разметкой Html, но все мои усилия тщетны, использую данную...

TextView // крэш - Программирование Android
Здравствуйте! С Новым Годом! И вопрос: почему он крашится? Если удалить/закомментировать строку TextView txt =...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Gabberr
102 / 102 / 17
Регистрация: 13.10.2009
Сообщений: 402
06.02.2015, 11:14     TextView закрасить уголок #2
Можно в 9-patch нарисовать бекграунд с отметкой в нужном месте и чтоб растягивался по всякому, но отметка была всегда в одном месте.
Прикрепил пример
Изображения
 
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,070
06.02.2015, 11:18  [ТС]     TextView закрасить уголок #3
Gabberr, что за клякса?) А примера нет, я гуглил ничего не нашел?
Gabberr
102 / 102 / 17
Регистрация: 13.10.2009
Сообщений: 402
06.02.2015, 11:21     TextView закрасить уголок #4
Ну вот эту кляксу если вставить в background элементу textview, то она всегда будет в верхнем правом углу, вне зависимости от размера textview
Про ninepatch http://habrahabr.ru/post/113623/
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,070
06.02.2015, 11:27  [ТС]     TextView закрасить уголок #5
Gabberr, хорошо, будем изучать. Сейчас пока гуглю про canvas, может получится нарисовать для общего развития.
Gabberr
102 / 102 / 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
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,070
06.02.2015, 13:32  [ТС]     TextView закрасить уголок #7
Огромный спс за примерчик, сижу разбираюсь, ибо тяпница. Итак, значит Point это точки с координатами по которым рисовать линии, p1 - первая точка, width - длина линии.
Для треугольника в правом верхнем углу я должен определить p1 = getWidth() и дальше пошел по точкам рисунок рисовать, правильно?
Gabberr
102 / 102 / 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
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,070
06.02.2015, 14:54  [ТС]     TextView закрасить уголок #9
Вот теперь все получилось, в getTriangle() отправляю integer из ресурсов, дабы треугольник под все экраны подходил.
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,070
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
102 / 102 / 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
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,070
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
102 / 102 / 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
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,070
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
102 / 102 / 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
Доброго времени суток! Подскажите пожалуйста, как сделать так чтобы background у textview был двумя цветами именно 2мя. Чтобы часть была...

Клик по textview - Программирование Android
Есть listView внутри него textview В который вставляется ссылка '<a href="http://yandex.ru'>ыыыы</a>', таким вот образом ...

TextView in ProgressBar - Программирование Android
Доброго времени суток! Нашел статью на хабрахабре http://habrahabr.ru/post/124708/, где парень рассказывает о помещении текст вью в...

Вывод в textView из БД - Программирование Android
У меня есть БД public void onCreate(SQLiteDatabase db) { // создаем таблицу с полями db.execSQL("create table mystudent ("...

TextView и картинкака - Программирование Android
Доброго времени. есть вот такой код: <LinearLayout android:layout_width="match_parent" ...


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

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

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