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
もう1つの簡単な解決策は、Paintで提供されているさまざまな方法を使用することです:)
Romain Guy

@ Dr.aNdRO試しましたが、うまくいきません。他に何かする必要がありますか?
モニカ

@モニカ私はこれのためにあなたのコードを見る必要があります。私は両方の方法を試しましたが、それらはうまく機能しています。新しいスレッドを開始できますか?
Dr. aNdRO 2014年

1
@ Dr.aNdRO-0に設定すると、特定のフラグを削除するだけでなく、すべてのフラグが削除されます。質問に正しく回答するには、コメントを削除するか、更新することを検討してください。
マイケルピーターソン

1
6年後、私は本番アプリであなたの罠に陥りました。@ Dr.aNdRO。コメントを削除してください。それは非常に悪いアドバイスです。メッセージにはto remove a、が表示されますが、すべてのフラグが削除されます。
ズン

26

これも機能します:

task_text.setPaintFlags(0);

これは、正しいものを使用しない方が正しいという奇妙なケースだと思います。ここで条件を確認する理由がないため、2つのケースが必要で、Paint.Flagを設定するか、削除するだけで、すばらしい解決策になります。
cutiko 2015

2
これをしないでください。これにより、特定のフラグだけでなく、すべてのフラグが削除されます。
マイケルピーターソン

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()
Dr.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を使用したりすることを含む回答への賛成をユーザーがやめたいと思います。
マイケルピーターソン

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.