web-dev-qa-db-ja.com

テキストを光らせる方法は?

以下に示すようなテキストに輝く効果を適用できますか?

enter image description here

更新:このようなものを作成するために必要なものも教えてください:enter image description here

これには特別なフォントが必要ですか?

78
Farhan

Android:shadowColorを使用してAndroid:shadowDxAndroid:shadowDyをゼロに設定し、かなり大きなAndroid:shadowRadiusを使用して、textviewに青い影を設定するのはどうですか。

114
Bemmu

高度なテキスト効果の場合:

AndroidのTextViewに内側の影を追加する方法はありますか?

特に: MagicTextView

HDウィジェットのLEDに使用しました: https://market.Android.com/details?id=cloudtv.hdwidgets

6
radley
<TextView
    Android:id="@+id/glowingText"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:padding="5dp"
    Android:shadowColor="#cf1d1d"
    Android:shadowDx="0.0"
    Android:shadowDy="0.0"
    Android:shadowRadius="8"
    Android:text="Radioactive"
    Android:textColor="#cf1d1d"
    Android:textSize="20sp" />

シャドー/グロー効果により必要なスペースが増えるため、パディングを追加することをお勧めします。

カスタムフォントの場合、アセットフォルダーに「fonts」という名前のフォルダーを作成します。次に、.ttfファイルをその中に配置します。 .otfファイルはオンラインで変換できます。多くのWebサイトがあります。

これをクラスに入れて

Typeface myFont = Typeface.createFromAsset(getAssets(), "fonts/yourCustomFont.ttf");

これがテキストビューにフォントを設定する方法です

yourTextView.setTypeface(myFont);

グロー効果をテストしましたが、カスタムフォントでも動作します。カスタムフォントは何らかの理由で大きくなるため、テキストのサイズを小さくする必要がある場合があることに注意してください。私が通常使用するspサイズの半分を使用しました。

6
ORY

ベンムーは正しい。これは、OpenGLの完全なルートをたどることなく、断然最良の方法です。また、TextViewの各側に水玉パディングが設定されていることを確認する必要があります。そうしないと、Originのテキストの色に一致する大きな半径の影(または明るい影)がTextViewの両側にドロップシャドウクリッピングを表示します。

ドロップシャドウ効果を増やしたり減らしたりしてレイヤー化されたビューグループを作成することで、さらに多くのぼかし効果を実現できる場合もあります(ただし、レンダリングパフォーマンスがどのようなものになるかはわかりません)

2
MrSewerPickle

要件を満たすための回避策がありましたが、それでも完璧ではありません。

サンプル結果:

https://cloud.githubusercontent.com/assets/5714437/3962552/d5c29fee-276c-11e4-9ea3-d1b31d8c54ac.png

キーポイント:*ペイントを与え、TextViewからonDraw()に8回描画します*

public class ShadowTextView extends TextView {
private final Paint mStrokePaint = new Paint();
private final Rect mTextBounds = new Rect();
public ShadowTextView(Context context) {
    super(context);
    setupPaint();
}

public ShadowTextView(Context context, AttributeSet attrs) {
    super(context, attrs);
    setupPaint();
}

public ShadowTextView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    setupPaint();
}

protected void onDraw(Canvas canvas) {
    // Get the text to print
    final String text = super.getText().toString();
    // Figure out the drawing coordinates
    super.getPaint().getTextBounds(text, 0, text.length(), mTextBounds);
    float radius = (float) Math.hypot(3, 3);
    // draw everything
    drawShadow(canvas, text, 0, 3);
    drawShadow(canvas, text, 0, -3);
    drawShadow(canvas, text, 3, 0);
    drawShadow(canvas, text, -3, 0);

    drawShadow(canvas, text, radius, radius);
    drawShadow(canvas, text, -radius, radius);
    drawShadow(canvas, text, radius, -radius);
    drawShadow(canvas, text, -radius, radius);

    super.onDraw(canvas);
}

private void drawShadow (Canvas canvas, String text, float dx, float dy) {
    mStrokePaint.setShadowLayer(3, dx, dy, Color.BLACK);
    mStrokePaint.setXfermode(new PorterDuffXfermode(Mode.SRC_ATOP));
    canvas.drawText(text,
            0.0f + this.getPaddingLeft() * 1.0f , (super.getHeight() + mTextBounds.height()) * 0.5f,
            mStrokePaint);
}

private final void setupPaint() {
    mStrokePaint.setAntiAlias(true);
    mStrokePaint.setStyle(Paint.Style.FILL);
    // setup stroke
    mStrokePaint.setColor(0x75000000);
    mStrokePaint.setStrokeWidth(5);
    mStrokePaint.setTextSize(super.getTextSize());
    mStrokePaint.setFlags(super.getPaintFlags());
    mStrokePaint.setTypeface(super.getTypeface());
    mStrokePaint.setStrokeCap(Cap.ROUND);
    mStrokePaint.setStrokeJoin(Join.ROUND);
}

}
1
Hsiao-Ting