Oldukça eski bir soru ama yine de tam bir cevap göremiyorum. Bu yüzden, bu sorunla mücadele eden birinin yararlı bulabileceğini umarak bu çözümü gönderiyorum. En basit ve en etkili çözüm, TextView sınıfının onDraw yöntemini geçersiz kılmaktır. Gördüğüm uygulamaların çoğu, konturu çizmek için drawText yöntemini kullanıyor, ancak bu yaklaşım, içeri giren tüm biçimlendirme hizalamasını ve metin kaydırmayı hesaba katmıyor. Ve sonuç olarak, genellikle kontur ve metin farklı yerlerde sona eriyor. Aşağıdaki yaklaşım, metnin hem konturunu hem de dolgu kısımlarını çizmek için super.onDraw'ı kullanır, böylece diğer şeylerle uğraşmanıza gerek kalmaz. İşte adımlar
- TextView sınıfını genişletin
- OnDraw yöntemini geçersiz kıl
- Boya stilini DOLGU olarak ayarla
- Doldurma modunda metin oluşturmak için Draw'da ebeveyn sınıfı çağırın.
- mevcut metin rengini kaydedin.
- Mevcut metin rengini kontur renginize ayarlayın
- Boya stilini Kontur olarak ayarla
- Kontur genişliğini ayarla
Konturu önceden oluşturulmuş metnin üzerine çizmek için onDraw üst sınıfını yeniden çağırın.
package com.example.widgets;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.widget.Button;
public class StrokedTextView extends Button {
private static final int DEFAULT_STROKE_WIDTH = 0;
private int _strokeColor;
private float _strokeWidth;
public StrokedTextView(Context context) {
this(context, null, 0);
}
public StrokedTextView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public StrokedTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
if(attrs != null) {
TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.StrokedTextAttrs);
_strokeColor = a.getColor(R.styleable.StrokedTextAttrs_textStrokeColor,
getCurrentTextColor());
_strokeWidth = a.getFloat(R.styleable.StrokedTextAttrs_textStrokeWidth,
DEFAULT_STROKE_WIDTH);
a.recycle();
}
else {
_strokeColor = getCurrentTextColor();
_strokeWidth = DEFAULT_STROKE_WIDTH;
}
_strokeWidth = dpToPx(context, _strokeWidth);
}
public void setStrokeColor(int color) {
_strokeColor = color;
}
public void setStrokeWidth(int width) {
_strokeWidth = width;
}
@Override
protected void onDraw(Canvas canvas) {
if(_strokeWidth > 0) {
Paint p = getPaint();
p.setStyle(Paint.Style.FILL);
super.onDraw(canvas);
int currentTextColor = getCurrentTextColor();
p.setStyle(Paint.Style.STROKE);
p.setStrokeWidth(_strokeWidth);
setTextColor(_strokeColor);
super.onDraw(canvas);
setTextColor(currentTextColor);
} else {
super.onDraw(canvas);
}
}
public static int dpToPx(Context context, float dp)
{
final float scale= context.getResources().getDisplayMetrics().density;
return (int) (dp * scale + 0.5f);
}
}
Hepsi bu. Bu sınıf, XML mizanpaj dosyalarından kontur rengini ve genişliğini belirtmeyi etkinleştirmek için özel XML nitelikleri kullanır. Bu nedenle, bu öznitelikleri attr.xml dosyanıza 'res' klasörü altındaki 'değerler' alt klasörüne eklemeniz gerekir. Aşağıdakileri kopyalayıp attr.xml dosyanıza yapıştırın.
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="StrokedTextAttrs">
<attr name="textStrokeColor" format="color"/>
<attr name="textStrokeWidth" format="float"/>
</declare-styleable>
</resources>
Bunu yaptıktan sonra, XML mizanpaj dosyalarınızda özel StrokedTextView sınıfını kullanabilir ve kontur rengini ve genişliğini de belirtebilirsiniz. İşte bir örnek
<com.example.widgets.StrokedTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Stroked text sample"
android:textColor="@android:color/white"
android:textSize="25sp"
strokeAttrs:textStrokeColor="@android:color/black"
strokeAttrs:textStrokeWidth="1.7" />
Paket adını, projenizin paket adıyla değiştirmeyi unutmayın. Ayrıca, özel XML niteliklerini kullanmak için xmlns ad alanını düzen dosyasına ekleyin. Düzen dosyanızın kök düğümüne aşağıdaki satırı ekleyebilirsiniz.
xmlns:strokeAttrs="http://schemas.android.com/apk/res-auto"