2011-07-22 27 views
61

Mã của tôi trông như thế này:Hủy bỏ một Cờ Sơn trong Android

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

Điều này gây ra một cuộc tấn công thông qua hiệu ứng xuất hiện trên văn bản. Tuy nhiên, tôi muốn biết cách xóa cờ khi đã đặt và cách phát hiện cờ được đặt.

Tôi hiểu đây là thao tác bitwise, nhưng tôi đã thử cả toán tử ~ và -, không hoạt động.

Trả lời

150

Để loại bỏ một lá cờ, điều này sẽ làm việc:

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

có nghĩa là đặt tất cả những lá cờ quy định, trừ các Paint.STRIKE_THRU_TEXT_FLAG.

Để kiểm tra xem một lá cờ được thiết lập (Edit: trong một khoảnh khắc tôi quên nó là java ...):

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

Một giải pháp dễ dàng khác đơn giản là sử dụng các phương pháp khác nhau được cung cấp trên Paint :) –

+5

để xóa cờ làm điều này: textView.setPaintFlags (0); ..: p –

+0

@ Dr.aNdRO Tôi đã thử và nó không hoạt động cho tôi. Tôi có cần làm gì khác không? – Monica

14

này cũng hoạt động:

task_text.setPaintFlags(0); 
+0

Tôi nghĩ đây là một trường hợp lạ khi không sử dụng đúng là corret nhiều hơn, không có lý do gì để kiểm tra điều kiện ở đây, bạn chỉ muốn 2 trường hợp, đặt Paint.Flag hoặc xóa nó, giải pháp tuyệt vời. – cutiko

+1

Đừng làm điều này. Điều này loại bỏ TẤT CẢ cờ, không chỉ là một lá cờ cụ thể. –

3

Sử dụng exclusive OR toán tử ^ thay vì | với &(~) kết hợp:

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

Kiểm tra xem cờ hiện có được thiết lập không:

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

Cảm ơn bạn @Sergey Đây là câu trả lời duy nhất mạnh mẽ ở đây. 1) Kiểm tra xem cờ bạn muốn xóa có xuất hiện không. 2) Nếu có, hãy xóa nó bằng XOR. Tôi muốn người dùng sẽ ngừng upvoting câu trả lời có liên quan đến việc thiết lập paintFlags 0 hoặc sử dụng XOR trước khi kiểm tra xem lá cờ để loại bỏ là hiện tại. –

0

| --------------------------------- ----------------- |
| < *> | Gạch chân với một textView:
| ------------------------------------------ -------- |

| * | Thêm Gạch chân:

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

| * | Di Gạch chân:

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

| * | Kiểm tra Gạch chân:

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

| * | Chuyển đổi gạch chân:

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); 
} 
0

Theo ý kiến ​​của tôi, chỉ đặt cờ mặc định là lựa chọn tốt hơn. Nếu không, văn bản sẽ bị lởm chởm. Cờ mặc định trong TextView (EditText mở rộng TextView) là

Paint.ANTI_ALIAS_FLAG 

Và đặt một paintflag mới sẽ thay thế hình trước đó. Tôi đã thực hiện một thử nghiệm để xác minh nó. Vì vậy, giống như thế này:

task_text.setPaintFlags(Paint.ANTI_ALIAS_FLAG); 
Các vấn đề liên quan