912 / 560 / 88
Регистрация: 13.02.2014
Сообщений: 2,081
1

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

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

Author24 — интернет-сервис помощи студентам
Очень часто делаю списки ListView и приходится для визуального отображения одной строки как-то помечать ее (напр. любимая команда в списке команд КХЛ).
Раньше делал так: в разметке в углу создавал невидимый ImageView, а в адаптере делал ему Vizible.
А как мне программно нарисовать или закрасить левый верхний уголок в TextView?
Если менять background, то как размерность определять его? Или как-то рисовать можно?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.02.2015, 10:38
Ответы с готовыми решениями:

Текст из TextView перенести в другой TextView по нажатию Button
Люди, помогите плиз. Недавно начал ковырять программирование под Android. Хотел сделать банальную...

TextView txt = new TextView(this); - ошибка
Возникла проблема с динамическим создание TextView в цыкле, хотя в другом месте создается таким же...

Уголок
я не могу понять, где прописывается уголок. вроди .block-title::after, но где прописывается форма?...

Декоративный уголок
Подумал может кому будет интересно попробовать реализовать такой вот декоративный уголок....

15
105 / 105 / 19
Регистрация: 13.10.2009
Сообщений: 406
06.02.2015, 11:14 2
Можно в 9-patch нарисовать бекграунд с отметкой в нужном месте и чтоб растягивался по всякому, но отметка была всегда в одном месте.
Прикрепил пример
Изображения
 
1
912 / 560 / 88
Регистрация: 13.02.2014
Сообщений: 2,081
06.02.2015, 11:18  [ТС] 3
Gabberr, что за клякса?) А примера нет, я гуглил ничего не нашел?
0
105 / 105 / 19
Регистрация: 13.10.2009
Сообщений: 406
06.02.2015, 11:21 4
Ну вот эту кляксу если вставить в background элементу textview, то она всегда будет в верхнем правом углу, вне зависимости от размера textview
Про ninepatch http://habrahabr.ru/post/113623/
1
912 / 560 / 88
Регистрация: 13.02.2014
Сообщений: 2,081
06.02.2015, 11:27  [ТС] 5
Gabberr, хорошо, будем изучать. Сейчас пока гуглю про canvas, может получится нарисовать для общего развития.
0
105 / 105 / 19
Регистрация: 13.10.2009
Сообщений: 406
06.02.2015, 11:56 6
Лучший ответ Сообщение было отмечено Rube как решение

Решение

Работу работать совсем лень, вот наваял примерчик с кастомным 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;
    }
 
 
}
2
912 / 560 / 88
Регистрация: 13.02.2014
Сообщений: 2,081
06.02.2015, 13:32  [ТС] 7
Огромный спс за примерчик, сижу разбираюсь, ибо тяпница. Итак, значит Point это точки с координатами по которым рисовать линии, p1 - первая точка, width - длина линии.
Для треугольника в правом верхнем углу я должен определить p1 = getWidth() и дальше пошел по точкам рисунок рисовать, правильно?
0
105 / 105 / 19
Регистрация: 13.10.2009
Сообщений: 406
06.02.2015, 14:00 8
Лучший ответ Сообщение было отмечено Rube как решение

Решение

Да всё верно, только в текущей реализации 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;
    }
2
912 / 560 / 88
Регистрация: 13.02.2014
Сообщений: 2,081
06.02.2015, 14:54  [ТС] 9
Вот теперь все получилось, в getTriangle() отправляю integer из ресурсов, дабы треугольник под все экраны подходил.
0
912 / 560 / 88
Регистрация: 13.02.2014
Сообщений: 2,081
09.02.2015, 15:24  [ТС] 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.
0
105 / 105 / 19
Регистрация: 13.10.2009
Сообщений: 406
09.02.2015, 15:30 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();
}
0
912 / 560 / 88
Регистрация: 13.02.2014
Сообщений: 2,081
09.02.2015, 16:19  [ТС] 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
0
105 / 105 / 19
Регистрация: 13.10.2009
Сообщений: 406
09.02.2015, 16:50 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);
    }
1
912 / 560 / 88
Регистрация: 13.02.2014
Сообщений: 2,081
10.02.2015, 12:41  [ТС] 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);
0
105 / 105 / 19
Регистрация: 13.10.2009
Сообщений: 406
10.02.2015, 12:53 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;
    }
}
1
912 / 560 / 88
Регистрация: 13.02.2014
Сообщений: 2,081
10.02.2015, 14:08  [ТС] 16
Да, сделал так, все работает, все дело было в этом, спасибо!
Цитата Сообщение от Gabberr Посмотреть сообщение
аа так у вас в другом походу проблема, метод init вызывается один раз при создании объекта.
0
10.02.2015, 14:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.02.2015, 14:08
Помогаю со студенческими работами здесь

закруглённый уголок
блок хедер. есть градиент от черного к серому общий. между центром и правым боком присутствует...

Прозрачный уголок у блока
привет! помогите разобраться пожалуйста, кто сталкивался. необходимо сделать блок с уголком, при...

Цветной уголок в таблице
Всем привет Подскажите как в таблицу вставить цветной уголок через стили образец снизу (красный...

Сверстать уголок под 45 градусов
подскажите как сверстать такой уголок ?


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru