8

私がしたいこと?(青は白に変わります) ここに画像の説明を入力

私がしたこと?
私が望むものに非常に近いテキストビューを概説できる TextView を拡張するクラスを見つけました。問題は、ストロークの色をどの色にも変更できなかったことです。常に黒として描画されます。境界線の色を白に設定するには?

私の出力は何ですか:
ここに画像の説明を入力

コードはどこにありますか?

public class TypeFaceTextView extends TextView {

private static Paint getWhiteBorderPaint(){
    Paint p = new Paint(Color.WHITE);
    return p;
}

private static final Paint BLACK_BORDER_PAINT = getWhiteBorderPaint();

static {
    BLACK_BORDER_PAINT.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));
}

@Override
public void setText(CharSequence text, BufferType type) {

    super.setText(String.format(text.toString()), type);
}

private static final int BORDER_WIDTH = 1;

private Typeface typeface;

public TypeFaceTextView(Context context) {
    super(context);
}

public TypeFaceTextView(Context context, AttributeSet attrs) {
    super(context, attrs);

    setDrawingCacheEnabled(false);

    setTypeface(attrs);
}

private void setTypeface(AttributeSet attrs) {
    final String typefaceFileName = attrs.getAttributeValue(null, "typeface");
    if (typefaceFileName != null) {
        typeface = Typeface.createFromAsset(getContext().getAssets(), typefaceFileName);
    }

    setTypeface(typeface);
}

public TypeFaceTextView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);

    setTypeface(attrs);
}

@Override
public void draw(Canvas aCanvas) {
    aCanvas.saveLayer(null, BLACK_BORDER_PAINT, Canvas.HAS_ALPHA_LAYER_SAVE_FLAG
            | Canvas.FULL_COLOR_LAYER_SAVE_FLAG | Canvas.MATRIX_SAVE_FLAG);

    drawBackground(aCanvas, -BORDER_WIDTH, -BORDER_WIDTH);
    drawBackground(aCanvas, BORDER_WIDTH + BORDER_WIDTH, 0);
    drawBackground(aCanvas, 0, BORDER_WIDTH + BORDER_WIDTH);
    drawBackground(aCanvas, -BORDER_WIDTH - BORDER_WIDTH, 0);

    aCanvas.restore();
    super.draw(aCanvas);

}

private void drawBackground(Canvas aCanvas, int aDX, int aDY) {
    aCanvas.translate(aDX, aDY);
    super.draw(aCanvas);
}
}
4

7 に答える 7

2

1) textview オブジェクトを作成して TextView を拡張します

public class YourTextView extends TextView { .........

2) draw メソッドでこれを行う

@Override
public void draw(Canvas canvas) {
        for (int i = 0; i < 5; i++) {
        super.draw(canvas);
    }
}

3) textview の xml 側を以下のように設定します

android:shadowColor="@color/white"
android:shadowRadius="5"
于 2013-03-05T13:51:10.847 に答える
0

getWhiteBorderPaint() メソッドを次のように変更する必要があります。

private static Paint getWhiteBorderPaint(){
    Paint p = new Paint();
    p.setColor(Color.WHITE);
    return p;
}

Paint コンストラクターは、ビットマスク フラグのみを受け取り、任意の int をパラメーターとしてサポートしません。

于 2013-02-28T09:31:28.660 に答える
0

これはできませんでしたが、試してみてください: PorterDuff.Mode

http://developer.android.com/reference/android/graphics/PorterDuff.Mode.html

「ADD」または「CLEAR」に変更してみてください。これが役立つことを願っています。

于 2013-02-26T15:28:38.490 に答える
0

この質問で述べられている元の問題を調査しました。解決策を見つけました。

まず、DST_OUT を DARKEN に変更します

static {
    BLACK_BORDER_PAINT.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DARKEN));
}

次に、元のテキストの色を保存し、目的のアウトラインの色を上に置き、アウトラインを描画してから元のテキストの色に戻します。

@Override
public void draw(Canvas aCanvas) {
    int originalColor = this.getCurrentTextColor();
    this.setTextColor(0xff000000); //set it to white.

    aCanvas.saveLayer(null, borderPaint, Canvas.HAS_ALPHA_LAYER_SAVE_FLAG
            | Canvas.FULL_COLOR_LAYER_SAVE_FLAG | Canvas.MATRIX_SAVE_FLAG);

        drawBackground(aCanvas, -BORDER_WIDTH, -BORDER_WIDTH);
        drawBackground(aCanvas, BORDER_WIDTH + BORDER_WIDTH, 0);
        drawBackground(aCanvas, 0, BORDER_WIDTH + BORDER_WIDTH);
        drawBackground(aCanvas, -BORDER_WIDTH - BORDER_WIDTH, 0);

    this.setTextColor(originalColor);
    aCanvas.restore();
    super.draw(aCanvas);
}
于 2015-05-02T12:39:13.957 に答える
0

背景が透明なテキストのアウトライン

これは、背景色なしでそれを行う1つの方法です

public class CustomTextView extends androidx.appcompat.widget.AppCompatTextView {

float mStroke;

public CustomTextView(Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
    TypedArray a = context.obtainStyledAttributes(attrs,
            R.styleable.CustomTextView);
    mStroke=a.getFloat(R.styleable.CustomTextView_stroke,1.0f);
    a.recycle();
}

@Override
protected void onDraw(Canvas canvas) {
    TextPaint paint = this.getPaint();
    paint.setStyle(Paint.Style.STROKE);
    paint.setStrokeWidth(mStroke);
    
    super.onDraw(canvas);
}
}

次に、attrs.xml ファイルに以下を追加するだけです。

<declare-styleable name="CustomTextView">
    <attr name="stroke" format="float"/>
</declare-styleable>

app:strokeこれで、TextView の他のすべての望ましいプロパティを保持しながら、ストローク幅を設定できるようになります。私の解決策は、塗りつぶしなしでストロークを描画するだけです。これにより、他のものよりも少し簡単になります。暗い背景でカスタム フォントを customtextview に設定しているときに、スクリーン キャプチャの結果を表示します。

ここに画像の説明を入力

于 2021-01-05T10:54:08.747 に答える