少し検索してきました。TextViewにシャドウレイヤーを追加するメソッドを見ることができますが、テキストのスパンだけをシャドウしたいと思います。私は基本的に、ユーザーがテキスト選択のスタイルを変更できるEditTextを実行しています。それらのスタイルの1つは、選択した色の影です。色、サイズ、書体などのスパンがありますが、影のスパンが見つかりません。
基本的に私は次のようなことをしたいと思います:(注コードはMonoDroidからのものですが、Javaの回答も役立ちます)
var N = new ShadowSpan(color,dx,dy,radius); // no such thing?
int S = txEdit.SelectionStart;
int E = txEdit.SelectionEnd;
Str = new SpannableString(txEdit.TextFormatted);
Str.SetSpan(N,S,E, SpanTypes.InclusiveInclusive);
txEdit.SetText(Str, TextView.BufferType.Spannable);
txEdit.SetSelection(S,E);
任意の支援や提案をいただければ幸いです。android.text.style.CharacterStyleから独自のShadowSpan実装を派生させる方法を理解する必要があるのか(おそらくupdateDrawState()をTextPaintオブジェクトのsetShadowLayerにオーバーライドするのか?)、または単純な答えが欠けているだけなのか疑問に思っています。これをやりたいと思ったのは私だけではないので、何かカスタムを試してみる前に聞いてみようと思いました。
- 編集 -
独自のShadowSpanを作成してみましたが、機能しているようです。誰かがより良い解決策を持っているなら、私はまだ床を開いたままにしておきます。何かがすでに存在しているように見えますが、私はあまり多くのことをする必要はなかったと思います。
これが私がMonoforAndroidに持っているものです
public class ShadowSpan : Android.Text.Style.CharacterStyle
{
public float Dx;
public float Dy;
public float Radius;
public Android.Graphics.Color Color;
public ShadowSpan(float radius, float dx, float dy, Android.Graphics.Color color)
{
Radius = radius; Dx = dx; Dy = dy; Color = color;
}
public override void UpdateDrawState (TextPaint tp)
{
tp.SetShadowLayer(Radius, Dx, Dy, Color);
}
}
そのように使用
void HandleClick (object sender, EventArgs e)
{
var N = new ShadowSpan(1,1,1,Android.Graphics.Color.Red);
int S = txEdit.SelectionStart;
int E = txEdit.SelectionEnd;
Str = new SpannableString(txEdit.TextFormatted);
Str.SetSpan(N,S,E, SpanTypes.InclusiveInclusive);
txEdit.SetText(Str, TextView.BufferType.Spannable);
txEdit.SetSelection(S,E);
}