我尝试创建自定义类以将文本实现为可绘制但我无法将Typeface
设置为Paint
。
以下是自定义类的代码实现(即TextDrawable
)。
在这里,我想获取Application的上下文来调用方法getAssets()
,但在这里我无法调用方法getContext()
。
public class TextDrawable extends Drawable {
private final String text;
private final Paint paint;
public TextDrawable(String text) {
this.text = text;
this.paint = new Paint();
paint.setColor(Color.GRAY);
paint.setTextSize(35f);
//paint.setTypeface(Typeface.createFromAsset(**getContext().getAssets()**, "fonts/Montserrat-Regular.otf"));
paint.setAntiAlias(true);
paint.setTextAlign(Paint.Align.RIGHT);
}
@Override
public void draw(Canvas canvas) {
canvas.drawText(text, 0, 10, paint);
}
@Override
public void setAlpha(int alpha) {
paint.setAlpha(alpha);
}
@Override
public void setColorFilter(ColorFilter cf) {
paint.setColorFilter(cf);
}
@Override
public int getOpacity() {
return PixelFormat.TRANSLUCENT;
}
}
答案 0 :(得分:3)
我无法在此类中获取getContext()。getAssets()。
您必须将Context
对象作为参数传递给您的班级构造函数:
public class TextDrawable extends Drawable {
...
public TextDrawable(Context context, String text) {
paint.setTypeface(Typeface.createFromAsset(context.getAssets(), "fonts/Montserrat-Regular.otf"));
...
}
...
}
答案 1 :(得分:2)
Drawable对象没有Context。因此,正如@azizbekian和@Mike M所建议的那样,您有两个选择。
public TextDrawable(Context context, String text) {
paint.setTypeface(Typeface.createFromAsset(context.getAssets(), "fonts/Montserrat-Regular.otf"));
...
}
注意这种方法每次使用此Drawable时都会创建一个新的Typeface实例,这通常是一种不好的做法,也会直接影响性能。
public TextDrawable(String text, Typeface typeface) {
paint.setTypeface(typeface);
...
}
这种方法更好,因为您可以为多个对象使用单个字体实例,与此Drawable相关或无关。
扩展后一种方法,您可以创建一个Static TypefaceProvider,如下所示。这样可以确保您始终只有 One Instance 字体。
public class TypefaceProvider
{
private static Map<String, Typeface> TYPEFACE_MAP = new HashMap<>();
public static Typeface getTypeFaceForFont(Context context, String fontFile)
{
if (fontFile.length() <= 0) throw new InvalidParameterException("Font filename cannot be null or empty");
if (!TYPEFACE_MAP.containsKey(fontFile))
{
try
{
Typeface typeface = Typeface.createFromAsset(context.getAssets(), "fonts/"+fontFile);
TYPEFACE_MAP.put(fontFile, typeface);
}
catch (Exception e)
{
throw new RuntimeException(String.format("Font file not found.\nMake sure that %s exists under \"assets/fonts/\" folder", fontFile));
}
}
return TYPEFACE_MAP.get(fontFile);
}
}