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
또 다른 쉬운 솔루션은 : 페인트에서 제공하는 다양한 방법을 사용하는 것입니다
로맹 가이

@ Dr.aNdRO 시도했지만 작동하지 않습니다. 내가해야 할 다른 일이 있습니까?
모니카

@Monica 나는 이것을 위해 당신의 코드를 봐야합니다. 두 가지 방법을 모두 시도했지만 멋지게 작동합니다. 새 스레드를 시작할 수 있습니까?
박사 안드로

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

Kotlin에서

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()
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);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.