Usuń flagę Paint w systemie Android

83

Mój kod wygląda tak:

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

Powoduje to pojawienie się efektu przekreślenia w tekście. Chciałbym jednak wiedzieć, jak usunąć ustawioną flagę i jak wykryć, że flaga jest ustawiona.

Rozumiem, że jest to operacja bitowa, ale wypróbowałem zarówno operatory ~, jak i -, ale żadne z nich nie działa.

James
źródło

Odpowiedzi:

184

Aby usunąć flagę, powinno to działać:

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

Co oznacza ustawienie wszystkich ustawionych flag, z wyjątkiem Paint.STRIKE_THRU_TEXT_FLAG.

Aby sprawdzić, czy flaga jest ustawiona (Edytuj: na chwilę zapomniałem, że to java ...):

if ((task_text.getPaintFlags() & Paint.STRIKE_THRU_TEXT_FLAG) > 0)
MByD
źródło
3
Innym łatwym rozwiązaniem jest po prostu użycie różnych metod dostępnych w programie Paint :)
Romain Guy,
@ Dr.aNdRO Próbowałem i nie działa dla mnie. Czy jest coś jeszcze, co muszę zrobić?
Monica
@Monica Muszę zobaczyć twój kod. Wypróbowałem obie metody i działają świetnie. Czy możesz rozpocząć nowy wątek?
Dr aNdRO
1
@ Dr.aNdRO - Ustawienie 0 usunie WSZYSTKIE flagi, a nie tylko usunie konkretną flagę, rozważ usunięcie komentarza lub aktualizację, aby poprawnie odpowiedzieć na pytanie.
Michael Peterson
1
6 lat później dałem się złapać w twoją pułapkę w aplikacji produkcyjnej. @ Dr.aNdRO. PROSZĘ USUNĄĆ SWÓJ KOMENTARZ. TO BARDZO ZŁA RADA. Twoja wiadomość mówi to remove a, podczas gdy usunie WSZYSTKIE flagi.
Zun
26

Działa to również:

task_text.setPaintFlags(0);
arun-r
źródło
Myślę, że to dziwny przypadek, w którym nieużywanie właściwego jest bardziej poprawne, bo nie ma powodu, aby sprawdzać tutaj warunki, wystarczy 2 skrzynki, ustawić Paint.Flag lub go usunąć, świetne rozwiązanie.
cutiko
2
Nie rób tego. To usuwa WSZYSTKIE flagi, nie tylko jedną konkretną.
Michael Peterson
21

W Kotlinie

task_text.paintFlags = task_text.paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv()
Błażej SLEBODA
źródło
Nie wiem, dlaczego to nie działa dla mnie! tvPhone.autoLinkMask = Linkify.ALL, a tvPhone.text = "1-800-12345"więctvPhone.paintFlags = tvPhone.paintFlags and Paint.UNDERLINE_TEXT_FLAG.inv()
dr Jacky
6

Używać wyłącznego lub operatora ^zamiast |z &(~)kombinacji:

// 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));

Sprawdź, czy flaga jest aktualnie ustawiona:

if((task_text.getPaintFlags() & Paint.STRIKE_THRU_TEXT_FLAG) == Paint.STRIKE_THRU_TEXT_FLAG)
XIII-ty
źródło
Dziękuję @Sergey. To jedyna solidna odpowiedź. 1) Sprawdź, czy flaga, którą chcesz usunąć, jest obecna. 2) Jeśli tak, usuń go za pomocą XOR. Chciałbym, aby użytkownicy przestali głosować za odpowiedziami, które obejmują ustawienie paintFlags na 0 lub użycie XOR przed sprawdzeniem, czy flaga do usunięcia jest obecna.
Michael Peterson
5

| ------------------------------------------------- - |
| <*> | Podkreśl tekstem:
| -------------------------------------------- ------ |

| * | Dodaj podkreślenie:

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

| * | Usuń podkreślenie:

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

| * | Sprawdź Podkreśl:

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

| * | Przełącz podkreślenie:

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);
}
Sujay UN
źródło
4

Moim zdaniem wystarczy ustawić jego domyślną flagę, to lepszy wybór. W przeciwnym razie tekst będzie wyglądał na poszarpany. Domyślna flaga w TextView (EditText rozszerza TextView) to

Paint.ANTI_ALIAS_FLAG

I ustawić nową farbę, która zastąpi poprzednią. Zrobiłem test, aby to zweryfikować. Więc tak po prostu:

task_text.setPaintFlags(Paint.ANTI_ALIAS_FLAG);
sanmianti
źródło