4

少し検索してきました。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);
    }
4

3 に答える 3

8

もっと考えてみると、CharacterStyleから派生してカスタムスパンを実装するのはかなり簡単なようです。Googleは、1回限りのSpanクラスの束でAPIを肥大化させたくなかったと思います。質問を作成する過程で、私はそれに答えることになりました。まあ、うまくいけば、これはいつか誰か他の人を助けるでしょう。提案を投稿してくれたすべての人に感謝します。

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);
    }
}
于 2012-05-18T12:13:17.110 に答える
4

私はJavaを除いて、基本的にあなたがしたことをしました、そしてそれは私のために働きます。

private static class ShadowStyleSpan extends ClickableSpan {
    private int radius;
    private int dx;
    private int dy;
    private int color;

    public ShadowStyleSpan(int radius, int dx, int dy, int color) {
        super();
        this.radius = radius;
        this.dx = dx;
        this.dy = dy;
        this.color = color;
    }

    @Override
    public void updateDrawState(TextPaint ds) {
        super.updateDrawState(ds);
        ds.setShadowLayer(radius, dx, dy, color);
    }
}
于 2012-06-05T23:57:29.983 に答える
0

おそらく、android:shadowColor、android:shadowDx、android:shadowDy、android:shadowRadiusの使用を検討するでしょう。または、 setShadowLayer ()

テキストをカスタマイズするための例が含まれているリンクを確認してください([テキストシャドウ]セクションまでスクロールダウンしてください)

こちらもご覧ください

于 2012-05-17T20:41:07.230 に答える