【问题标题】:Remove a Paint Flag in Android在 Android 中删除绘画标志
【发布时间】:2023-03-08 15:59:01
【问题描述】:

我的代码如下所示:

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

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

我知道这是按位运算,但我尝试了 ~ 和 - 运算符,都不起作用。

【问题讨论】:

    标签: android bitwise-operators


    【解决方案1】:

    要删除标志,这应该可以:

    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)
    

    【讨论】:

    • 另一个简单的解决方案是简单地使用 Paint 上提供的各种方法:)
    【解决方案2】:

    这也有效:

    task_text.setPaintFlags(0);
    

    【讨论】:

    • 我认为这是一个奇怪的情况,不使用正确的更正确,因为没有理由在这里检查条件,你只需要 2 个情况,设置 Paint.Flag 或删除它,很好的解决方案。
    • 不要这样做。这会删除所有标志,而不仅仅是一个特定的。
    【解决方案3】:

    使用异或运算符^ 代替|&(~) 组合:

    // 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 的答案。
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      在我看来, 只需设置其默认标志是更好的选择。否则,文本将看起来参差不齐。 TextView(EditText 扩展 TextView)中的默认标志是

      Paint.ANTI_ALIAS_FLAG
      

      并设置一个新的paintflag 将替换以前的。我做了一个测试来验证它。所以,就像这样:

      task_text.setPaintFlags(Paint.ANTI_ALIAS_FLAG);
      

      【讨论】:

        【解决方案6】:

        在 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()
        【解决方案7】:

        TextView details_actual_price; //并从你的xml文件中找到id

        details_actual_price.setPaintFlags(details_actual_price.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);

        【讨论】:

        • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
        【解决方案8】:

        //用于适配器类

        文本视图 details_actual_price; // 并找到 id holder.actulPrice.setPaintFlags(holder.actulPrice.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);

        【讨论】:

        • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
        【解决方案9】:

        我尝试使用 kotlin 位运算符在 kotlin 中使用上述方法,但结果很奇怪......

        所以要删除我刚刚做的标志

        view.paintflags = 0x00
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-08-25
          • 1970-01-01
          • 2014-05-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-06
          • 1970-01-01
          相关资源
          最近更新 更多