Видаліть прапор Paint в Android


83

Мій код виглядає так:

    TextView task_text = (TextView) view.findViewById(R.id.task_text);
    task_text.setPaintFlags( task_text.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);

Це призводить до того, що в тексті з’являється ефект накреслення. Однак я хотів би знати, як видалити прапор після встановлення, і як виявити, що прапор встановлено.

Я розумію, що це побітова операція, але я спробував оператори ~ і -, жоден з них не працює.

Відповіді:


184

Щоб видалити прапор, це має працювати:

task_text.setPaintFlags( task_text.getPaintFlags() & (~ Paint.STRIKE_THRU_TEXT_FLAG));

Що означає встановити всі встановлені прапори, крім Paint.STRIKE_THRU_TEXT_FLAG.

Щоб перевірити, чи встановлений прапор (Редагувати: на мить я забув, що це Java ...):

if ((task_text.getPaintFlags() & Paint.STRIKE_THRU_TEXT_FLAG) > 0)

3
Іншим простим рішенням є просто використання різних методів, наданих у програмі Paint :)
Ромен Гай,

@ Dr.aNdRO Я спробував, і у мене це не працює. Чи потрібно щось ще робити?
Моніка

@Monica Мені потрібно побачити ваш код для цього. Я спробував обидва методи, і вони працюють круто. Чи можете ви розпочати нову тему?
Доктор aNdRO

1
@ Dr.aNdRO - Якщо встановити значення 0, буде вилучено ВСІ прапори, а не лише певний прапор. Будь ласка, видаліть свій коментар або оновіть, щоб правильно відповісти на запитання.
Michael Peterson

1
Через 6 років я потрапив у вашу пастку у виробничому додатку. @ Dr.aNdRO. ВИДАЛІТЬ ВАШ КОМЕНТАР. ДУЖЕ ПОГОЛО ПОРАДУЮ. Ваше повідомлення говорить to remove a, тоді як воно видалить ВСІ прапори.
Zun,

26

Це також працює:

task_text.setPaintFlags(0);

Я думаю, що це дивний випадок, коли не використання правильної є більшою мірою, оскільки немає причин перевіряти умови тут, ви просто хочете 2 випадки, встановіть Paint.Flag або видаліть його, відмінне рішення.
cutiko

2
Не роби цього. Це видаляє ВСІ прапори, а не лише окремий.
Michael Peterson

21

У Котліні

task_text.paintFlags = task_text.paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv()

Не знаю, чому у мене це не працює! tvPhone.autoLinkMask = Linkify.ALL, потім tvPhone.text = "1-800-12345", потімtvPhone.paintFlags = tvPhone.paintFlags and Paint.UNDERLINE_TEXT_FLAG.inv()
Dr.jacky

6

Використовуйте виключає АБО оператор ^замість |з &(~)комбінацією:

// setup STRIKE_THRU_TEXT_FLAG flag if current flags not contains it
task_text.setPaintFlags(task_text.getPaintFlags() ^ Paint.STRIKE_THRU_TEXT_FLAG));

// second call will remove STRIKE_THRU_TEXT_FLAG
task_text.setPaintFlags(task_text.getPaintFlags() ^ Paint.STRIKE_THRU_TEXT_FLAG));

Перевірте, чи встановлений прапор на даний момент:

if((task_text.getPaintFlags() & Paint.STRIKE_THRU_TEXT_FLAG) == Paint.STRIKE_THRU_TEXT_FLAG)

Дякую @Sergey Це єдина вагома відповідь тут. 1) Перевірте, чи присутній прапор, який ви хочете видалити. 2) Якщо це так, видаліть його за допомогою XOR. Я хотів би, щоб користувачі припинили голосувати за відповіді, які передбачають встановлення paintFlags на 0 або використання XOR перед тим, як перевірити, чи присутній прапор для видалення.
Michael Peterson

5

| ------------------------------------------------- - |
| <*> | Підкресліть textView:
| -------------------------------------------- ------ |

| * | Додати підкреслення:

 txtVyuVar.setPaintFlags(txtVyuVar.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);

| * | Видалити підкреслення:

txtVyuVar.setPaintFlags(txtVyuVar.getPaintFlags() ^ Paint.UNDERLINE_TEXT_FLAG);

| * | Перевірте підкреслення:

if((txtVyuVar.getPaintFlags() & Paint.UNDERLINE_TEXT_FLAG) == Paint.UNDERLINE_TEXT_FLAG)
{
    // Codo Todo
}

| * | Перемкнути підкреслення:

if((txtVyuVar.getPaintFlags() & Paint.UNDERLINE_TEXT_FLAG) == Paint.UNDERLINE_TEXT_FLAG)
{
    txtVyuVar.setPaintFlags(txtVyuVar.getPaintFlags() ^ Paint.UNDERLINE_TEXT_FLAG);
}
else
{
    txtVyuVar.setPaintFlags(txtVyuVar.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
}

4

На мій погляд, кращий вибір - просто встановити прапорець за замовчуванням. В іншому випадку текст буде виглядати зазубреним. Прапором за замовчуванням у TextView (EditText розширює TextView) є

Paint.ANTI_ALIAS_FLAG

І встановити новий малярський флаг замінить попередній. Я зробив тест, щоб перевірити це. Отже, саме так:

task_text.setPaintFlags(Paint.ANTI_ALIAS_FLAG);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.