在Android中删除油漆标志


83

我的代码如下所示:

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

这将导致删除线效果出现在文本上。但是,我想知道如何在设置标志后删除该标志,以及如何检测已设置标志。

我知道这是个按位操作,但是我尝试了〜和-运算符,但都没有用。

Answers:


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上提供的各种方法:)
Romain Guy

我尝试了@ Dr.aNdRO,它对我不起作用。还有什么我需要做的吗?
莫妮卡

@Monica我需要查看您的代码。我已经尝试了这两种方法,它们都工作得很酷。您可以启动一个新线程吗?
2014年

1
@ Dr.aNdRO-设置为0将删除所有标志,而不仅仅是删除特定标志,请考虑删除您的注释或更新以正确回答问题。
迈克尔·彼得森

1
6年后,我迷上了您在生产应用程序中的陷阱。@ Dr.aNdRO 请删除您的评论。非常不好的建议。您的消息显示为to remove a,而它将删除所有标志。

26

这也适用:

task_text.setPaintFlags(0);

我认为这是一个奇怪的情况,其中使用不正确的方法更正确,因为这里没有理由检查条件,您只需要2种情况,设置Paint.Flag或将其删除,这是很好的解决方案。
Cutiko 2015年

2
不要这样 这将删除所有标志,而不仅仅是一个标志。
迈克尔·彼得森

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()
杰克博士

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的答案,然后再检查是否存在要删除的标志。
迈克尔·彼得森

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

并设置一个新的paintflag将替代先前的。我已经进行了测试以进行验证。因此,就像这样:

task_text.setPaintFlags(Paint.ANTI_ALIAS_FLAG);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.