ImageSpanクリックイベントの追加

2136 ワード

方法


*方法1:LinkMovementMethod*を書き換える方法2:ImageSpanを設定すると同時に、同じ位置にClickableSpanを設定する

FAQ


画像のクリック選択状態を削除


次のコードを注記します.
 Selection.setSelection(buffer,
 buffer.getSpanStart(imageSpans[0]),
 buffer.getSpanEnd(imageSpans[0]));

2枚連続の画像を仮定し、TextViewの2番目のspanをクリックしますが、実際に応答したのは1番目のspanです。


Android ClickableSpanカーソル選択の問題は、必要な方は参考にしてください.
最近はプロジェクトのニーズでCloudEditTextを使って文字入力を行い、ImageSpanの背景を変更するには、ソフトキーボードの削除キーを使って操作する必要があります
まず原理を説明します.CloudEditTextはSpannablesStringを使用してスタイル付き文字を挿入し、主に3層に分かれています.
1.SpannablesStringには文字列が必要です.そうしないと、後続の挿入ImagesSpanとClickablesSpanでは、文字列の挿入がないため、EditText自体が空になります.
SpannableString spannableString=new SpannableString(getText())
2.ImageSpan drawableを対応する文字列の長さに挿入する区間
spannableString.setSpan(imageSpan,start,end,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
3.ClickableSpan ImageSpanと同じ区間を挿入
spannableString.setSpan(clickSpan,start,end,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
クリックイベントをトリガーしたいsetMovementMethod(LinkMovementMethod.getInstance()という言葉は必須です
この中で出会う穴についてお話しします
1.クリックイベント位置ずれ問題
問題は主にLinkMovementMethodというクラスのOnTouchEventメソッドで、ソースコードにはint off=layoutと書かれています.getOffsetForHorizontal(line,x)では、このメソッドの戻り値が指のタッチ位置に最も近いオフセット量であることを調べると、指が文字の一番前の位置に触れるとカーソルが文字の前に選択され、削除すると必ず前の文字が削除されるという問題が発生します.
もちろん文字に触れるのは、位置区間が小さいので、ユーザーはあまり注目しません.間違っていても、もう一度選んでも構いません.しかし、spanをクリックすると、このような状況は許せません.spanは文字を拡大することに相当します.この時、spanの前の位置をクリックすると、前のspanが選択され、直視できません.
GoogleとStack Overflowを調べたところ、解決策が見つからず、ソースコードを修正する考えで頭がいっぱいになったが、layout.getOffsetForHorizontal(line,x)メソッドでlayoutの他の部分のソースコードを設計し、すべての修正作業量が大きすぎます.仕方なく、まず無理にlayoutのソースコードを見に行って、結果は私に問題を解決する方法を見つけさせました.layout.getPrimaryHorizontal(off)は、位置に応じてx軸の変位を取得するので、指が触れる位置が一定であるため、比較して問題を解決することができます.案は以下の通りです.
float xLeft=layout.getPrimaryHorizontal(off);
if(xLeft

リファレンス

  • ImageSpanクリック可能、画像と設定が異なる
  • クリック可能なImageSpanをカスタマイズし、TextViewに「View」
  • を内蔵
  • Android ClickableSpanカーソル選択問題