绘制实心方形按钮并为其添加自定义字体

时间:2012-09-27 22:03:32

标签: android button

我想知道最好的方法是制作一个实心的方形按钮并为其添加一个自定义字体。我正在考虑一个单独的类来处理绘图(某些宽度=高度取决于屏幕的宽度)。我唯一想知道的是:我怎么能把它作为一个带文字的按钮?我在xml中放置一个按钮,是否可以用自绘的按钮方块替换它?

谢谢!

1 个答案:

答案 0 :(得分:1)

如果您想要自定义原始按钮,可以通过android:background将图像添加为按钮背景。关于自定义字体,您可以在活动中获取按钮并设置自定义Typeface。将您的字体放在assets文件夹中。

Button txt = (Button) findViewById(R.id.button);  
Typeface font = Typeface.createFromAsset(getAssets(), "1543Humane_jenson_bold.TTF");  
txt.setTypeface(font);

如果您想多次使用此类按钮,可以创建类似于此

的自定义按钮类

<强>的CustomButton

package com.example;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.Button;

public class CustomButton extends Button {
        private static final String TAG = "TextView";

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

        public CustomButton (Context context, AttributeSet attrs) {
            super(context, attrs);
            setCustomFont(context, attrs);
        }

        public CustomButton (Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            setCustomFont(context, attrs);
        }

        private void setCustomFont(Context ctx, AttributeSet attrs) {
            TypedArray a = ctx.obtainStyledAttributes(attrs, R.styleable.CustomButton);
            String customFont = a.getString(R.styleable.TextViewPlus_customFont);
            setCustomFont(ctx, customFont);
            a.recycle();
        }

        public boolean setCustomFont(Context ctx, String asset) {
            Typeface tf = null;
            try {
            tf = Typeface.createFromAsset(ctx.getAssets(), asset);  
            } catch (Exception e) {
                Log.e(TAG, "Could not get typeface: "+e.getMessage());
                return false;
            }

        setTypeface(tf);  
        return true;
        }

}

attrs.xml:(在res / values中)

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="CustomButton ">
        <attr name="customFont" format="string"/>
    </declare-styleable>
</resources>

<强> main.xml中:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:foo="http://schemas.android.com/apk/res/com.example"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <com.example.CustomButton 
        android:id="@+id/button"
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        android:text="@string/showingOffTheNewTypeface"
        foo:customFont="custom.ttf">
    </com.example.CustomButton >
</LinearLayout>

使用HashMap的字体类可以避免内存问题。使用tf = Typeface.createFromAsset(ctx.getAssets(), asset);

更改setCustomFont中的tf= Typefaces.get(mContext, "cutomefont");
    public class Typefaces{

private static final Hashtable<String, Typeface> cache = new Hashtable<String, Typeface>();

    public static Typeface get(Context c, String name){
        synchronized(cache){
            if(!cache.containsKey(name)){
                Typeface t = Typeface.createFromAsset(
                        c.getAssets(), 
                        String.format("fonts/%s.OTF", name)
                    );
                cache.put(name, t);
            }
            return cache.get(name);
        }
    }

}
互联网

中的

Another tut