Как использовать значок из файла шрифта в качестве рисунка в Android

У меня есть файл шрифта, значки которого я использую в файлах макета через Custom TextView.

Я создал пользовательский класс: класс CustomFontTextView расширяет TextView

скажем, значок есть в файле шрифта Sample.ttf как строковый ресурс:

<string name="icon">&#xe038;</string>

В макетах я могу использовать его как:

<com.sec.mywash.views.CustomFontTextView
custom:custom_typeface="sample_font"
 android:text="@string/icon"/>.

Однако мое требование состоит в том, чтобы изменить кнопку «Домой вверх» на панели действий, которую мы установили в style.xml как элемент:

<item "android:homeAsUpIndicator">@drawable/....</item> 

Как использовать изображение значка из файла шрифта в style.xml, который можно рисовать.


person Surbhi    schedule 27.10.2015    source источник
comment
Вы пытаетесь использовать .ttf для рисования? между проверкой stackoverflow. ком/вопросы/15098468/   -  person Jaiprakash Soni    schedule 27.10.2015
comment
Я пытаюсь использовать значок из .ttf в качестве рисунка вместо пользовательского текстового представления.   -  person Surbhi    schedule 27.10.2015
comment
Создайте отдельный рисунок. Завтра ваши требования могут измениться, и этот шрифт будет удален...   -  person Viktor Yakunin    schedule 27.10.2015
comment
@JaiprakashSoni Да, я хочу нечто подобное, но я не могу использовать для этого какую-либо библиотеку.   -  person Surbhi    schedule 27.10.2015
comment
@ViktorYakunin, вы имеете в виду создать собственный рисунок? Если да, то как сделать пользовательский рисунок из .ttf?   -  person Surbhi    schedule 27.10.2015
comment
не делайте пользовательский рисунок из .ttf . просто создайте нужный значок в формате png и используйте его.   -  person Rahul Tiwari    schedule 27.10.2015
comment
Возможный обходной путь: вы можете нарисовать текст на растровом изображении и использовать это растровое изображение в качестве рисуемого.   -  person Phantômaxx    schedule 27.10.2015
comment
@Surbhi есть много способов сделать это, например, вы можете использовать шрифт для какого-нибудь редактора изображений и создать набор ресурсов изображения. это может быть полезно romannurik.github.io/AndroidAssetStudio/index.html   -  person Viktor Yakunin    schedule 27.10.2015
comment
@ViktorYakunin Причина использования TTF вместо изображения заключается в том, что вам не нужно создавать отдельное изображение для каждого значка и каждого размера. При использовании шрифта размер вашего apk резко уменьшается, особенно если вы используете системный шрифт Android. .   -  person AaA    schedule 24.07.2017


Ответы (2)


Вы можете создать свой собственный класс рисования для этого, что-то вроде этого

/** Embed an icon into a Drawable that can be used as TextView icons, or ActionBar icons.
 *
 * new IconDrawable(context, IconValue.icon_star)
 *           .colorRes(R.color.white)
 *           .actionBarSize();
 * 
 * If you don't set the size of the drawable, it will use the size
 * that is given to him. Note that in an ActionBar, if you don't
 * set the size explicitly it uses 0, so please use actionBarSize().
 */

public class FontIconDrawable extends Drawable {

public static int ANDROID_ACTIONBAR_ICON_SIZE_DP = 24;

private final Context context;

private final String icon;

private TextPaint paint;

private int size = -1;

private int alpha = 255;

/**
 * Create an IconDrawable.
 *
 * @param context Your activity or application context.
 * @param icon    The icon you want this drawable to display.
 */
public FontIconDrawable(Context context, String icon, Typeface typeface) {
    this.context = context;
    this.icon = icon;
    paint = new TextPaint();
    paint.setTypeface(typeface);
    paint.setStyle(Paint.Style.STROKE);
    paint.setTextAlign(Paint.Align.CENTER);
    paint.setUnderlineText(false);
    paint.setColor(Color.WHITE);
    paint.setAntiAlias(true);
}

/**
 * Set the size of this icon to the standard Android ActionBar.
 *
 * @return The current IconDrawable for chaining.
 */
public FontIconDrawable actionBarSize() {
    return sizeDp(ANDROID_ACTIONBAR_ICON_SIZE_DP);
}

/**
 * Set the size of the drawable.
 *
 * @param dimenRes The dimension resource.
 * @return The current IconDrawable for chaining.
 */
public FontIconDrawable sizeRes(int dimenRes) {
    return sizePx(context.getResources().getDimensionPixelSize(dimenRes));
}

/**
 * Set the size of the drawable.
 *
 * @param size The size in density-independent pixels (dp).
 * @return The current IconDrawable for chaining.
 */
public FontIconDrawable sizeDp(int size) {
    return sizePx(dpToPx(context.getResources(), size));
}

/**
 * Dp to px.
 *
 * @param res the res
 * @param dp  the dp
 * @return the int
 */
public static int dpToPx(Resources res, int dp) {
    return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp,
            res.getDisplayMetrics());
}

/**
 * Set the size of the drawable.
 *
 * @param size The size in pixels (px).
 * @return The current IconDrawable for chaining.
 */
public FontIconDrawable sizePx(int size) {
    this.size = size;
    setBounds(0, 0, size, size);
    invalidateSelf();
    return this;
}

/**
 * Set the color of the drawable.
 *
 * @param color The color, usually from android.graphics.Color or 0xFF012345.
 * @return The current IconDrawable for chaining.
 */
public FontIconDrawable color(int color) {
    paint.setColor(color);
    invalidateSelf();
    return this;
}

/**
 * Set the color of the drawable.
 *
 * @param colorRes The color resource, from your R file.
 * @return The current IconDrawable for chaining.
 */
public FontIconDrawable colorRes(int colorRes) {
    paint.setColor(context.getResources().getColor(colorRes));
    invalidateSelf();
    return this;
}

/**
 * Set the alpha of this drawable.
 *
 * @param alpha The alpha, between 0 (transparent) and 255 (opaque).
 * @return The current IconDrawable for chaining.
 */
public FontIconDrawable alpha(int alpha) {
    setAlpha(alpha);
    invalidateSelf();
    return this;
}

@Override
public int getIntrinsicHeight() {
    return size;
}

@Override
public int getIntrinsicWidth() {
    return size;
}

@Override
public void draw(Canvas canvas) {
    paint.setTextSize(getBounds().height());
    Rect textBounds = new Rect();
    String textValue = icon;
    paint.getTextBounds(textValue, 0, 1, textBounds);
    float textBottom = (getBounds().height() - textBounds.height()) / 2f + textBounds.height() - textBounds.bottom;
    canvas.drawText(textValue, getBounds().width() / 2f, textBottom, paint);
}

@Override
public boolean isStateful() {
    return true;
}

@Override
public boolean setState(int[] stateSet) {
    int oldValue = paint.getAlpha();
    int newValue = isEnabled(stateSet) ? alpha : alpha / 2;
    paint.setAlpha(newValue);
    return oldValue != newValue;
}

/**
 * Checks if is enabled.
 *
 * @param stateSet the state set
 * @return true, if is enabled
 */
public static boolean isEnabled(int[] stateSet) {
    for (int state : stateSet)
        if (state == android.R.attr.state_enabled)
            return true;
    return false;
}

@Override
public void setAlpha(int alpha) {
    this.alpha = alpha;
    paint.setAlpha(alpha);
}

@Override
public void setColorFilter(ColorFilter cf) {
    paint.setColorFilter(cf);
}

@Override
public void clearColorFilter() {
    paint.setColorFilter(null);
}

@Override
public int getOpacity() {
    return PixelFormat.OPAQUE;
}

/**
 * Sets paint style.
 *
 * @param style to be applied
 */
public void setStyle(Paint.Style style) {
    paint.setStyle(style);
}
}
person sanket vetkoli    schedule 19.11.2016
comment
Как использовать этот код со значками ящиков или в качестве запроса OP на панели действий? - person AaA; 24.07.2017
comment
Вы можете сделать это так в своем onCreateOptionsMenu() MenuItem profileItem = menu.findItem(R.id.action_profile); Drawable profileDrawable = новый FontIconDrawable(контекст, значок, getFontIconTypeface(контекст)).actionBarSize(); profileItem.setIcon(profileDrawable); общедоступный статический шрифт getFontIconTypeface (контекстный контекст) { return Typeface.createFromAsset (context.getAssets(), icons.ttf); } - person sanket vetkoli; 05.12.2017

Я думаю, что в вашем случае невозможно изменить значок кнопки «Домой вверх» через xml... вы используете iconFont, поэтому ваш значок на самом деле является текстом, и для отображения этих значков вам нужен CustomTextView или любой вид, который расширяет TextView. Android: homeAsUpIndicator требует рисования. Возможным решением может быть: иметь этот специальный значок в папке с возможностью рисования.

person Dima    schedule 27.10.2015