以下に示すようなテキストに輝く効果を適用できますか?
更新:このようなものを作成するために必要なものも教えてください:
これには特別なフォントが必要ですか?
Android:shadowColor
を使用してAndroid:shadowDx
とAndroid:shadowDy
をゼロに設定し、かなり大きなAndroid:shadowRadius
を使用して、textviewに青い影を設定するのはどうですか。
高度なテキスト効果の場合:
AndroidのTextViewに内側の影を追加する方法はありますか?
特に: MagicTextView
HDウィジェットのLEDに使用しました: https://market.Android.com/details?id=cloudtv.hdwidgets
<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サイズの半分を使用しました。
ベンムーは正しい。これは、OpenGLの完全なルートをたどることなく、断然最良の方法です。また、TextViewの各側に水玉パディングが設定されていることを確認する必要があります。そうしないと、Originのテキストの色に一致する大きな半径の影(または明るい影)がTextViewの両側にドロップシャドウクリッピングを表示します。
ドロップシャドウ効果を増やしたり減らしたりしてレイヤー化されたビューグループを作成することで、さらに多くのぼかし効果を実現できる場合もあります(ただし、レンダリングパフォーマンスがどのようなものになるかはわかりません)
要件を満たすための回避策がありましたが、それでも完璧ではありません。
サンプル結果:
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);
}
}