一、创建一个控件类间接或者直接继承View类

二、创建自定义的样式属性放在attr.xml文件里面,如

<?xml version="1.0" encoding="utf-8"?><resources>    <attr name="titleText" format="string" />    <attr name="titleTextColor" format="color" />    <attr name="titleTextSize" format="dimension" />    <declare-styleable name="CustomTitleView">        <attr name="titleText" />        <attr name="titleTextColor" />        <attr name="titleTextSize" />    </declare-styleable></resources>

三、在控件类里面实现相关的逻辑

1、重载三个构造方法

public CustomTitleView(Context context, AttributeSet attrs)

public CustomTitleView(Context context)

public CustomTitleView(Context context, AttributeSet attrs, int defStyle)

2、在构造方面里面获取样式属性,类似WP里面的控件样式

TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.CustomTitleView, defStyle, 0);

在构造方面里面可以做一些初始化的操作

3、重载onMeasure方法来测量控件,跟wp的逻辑一模一样

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)

4、重载onDraw方法绘制屏幕

protected void onDraw(Canvas canvas)

canvas是控件的画布对象,在这里你可以在canvas上面绘制或者添加你需要在控件上面显示的内容或者其他的控件。

四、在layout上面使用

1、使用属性的时候需要添加空间的引用

xmlns:custom="http://schemas.android.com/apk/res/com.example.asdlon.customviewdemo"

2、添加控件

    <com.example.asdlon.customviewdemo.CustomTitleView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        custom:titleText="3712"        android:padding="10dp"        custom:titleTextColor="#ff0000"        android:layout_centerInParent="true"        custom:titleTextSize="40sp" />

import java.util.HashSet;import java.util.Random;import java.util.Set;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Rect;import android.util.AttributeSet;import android.util.TypedValue;import android.view.View;public class CustomTitleView extends View{    /**     * 文本     */    private String mTitleText;    /**     * 文本的颜色     */    private int mTitleTextColor;    /**     * 文本的大小     */    private int mTitleTextSize;    /**     * 绘制时控制文本绘制的范围     */    private Rect mBound;    private Paint mPaint;    public CustomTitleView(Context context, AttributeSet attrs)    {        this(context, attrs, 0);    }    public CustomTitleView(Context context)    {        this(context, null);    }    /**     * 获得我自定义的样式属性     *     * @param context     * @param attrs     * @param defStyle     */    public CustomTitleView(Context context, AttributeSet attrs, int defStyle)    {        super(context, attrs, defStyle);        /**         * 获得我们所定义的自定义样式属性         */        TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.CustomTitleView, defStyle, 0);        int n = a.getIndexCount();        for (int i = 0; i < n; i++)        {            int attr = a.getIndex(i);            switch (attr)            {                case R.styleable.CustomTitleView_titleText:                    mTitleText = a.getString(attr);                    break;                case R.styleable.CustomTitleView_titleTextColor:                    // 默认颜色设置为黑色                    mTitleTextColor = a.getColor(attr, Color.BLACK);                    break;                case R.styleable.CustomTitleView_titleTextSize:                    // 默认设置为16sp,TypeValue也可以把sp转化为px                    mTitleTextSize = a.getDimensionPixelSize(attr, (int) TypedValue.applyDimension(                            TypedValue.COMPLEX_UNIT_SP, 16, getResources().getDisplayMetrics()));                    break;            }        }        a.recycle();        /**         * 获得绘制文本的宽和高         */        mPaint = new Paint();        mPaint.setTextSize(mTitleTextSize);        // mPaint.setColor(mTitleTextColor);        mBound = new Rect();        mPaint.getTextBounds(mTitleText, 0, mTitleText.length(), mBound);        this.setOnClickListener(new OnClickListener()        {            @Override            public void onClick(View v)            {                mTitleText = randomText();                postInvalidate();            }        });    }    private String randomText()    {        Random random = new Random();        Set<Integer> set = new HashSet<Integer>();        while (set.size() < 4)        {            int randomInt = random.nextInt(10);            set.add(randomInt);        }        StringBuffer sb = new StringBuffer();        for (Integer i : set)        {            sb.append("" + i);        }        return sb.toString();    }    @Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)    {        // super.onMeasure(widthMeasureSpec, heightMeasureSpec);        int width = 0;        int height = 0;        /**         * 设置宽度         */        int specMode = MeasureSpec.getMode(widthMeasureSpec);        int specSize = MeasureSpec.getSize(widthMeasureSpec);        switch (specMode)        {            case MeasureSpec.EXACTLY:// 明确指定了                width = getPaddingLeft() + getPaddingRight() + specSize;                break;            case MeasureSpec.AT_MOST:// 一般为WARP_CONTENT                width = getPaddingLeft() + getPaddingRight() + mBound.width();                break;        }        /**         * 设置高度         */        specMode = MeasureSpec.getMode(heightMeasureSpec);        specSize = MeasureSpec.getSize(heightMeasureSpec);        switch (specMode)        {            case MeasureSpec.EXACTLY:// 明确指定了                height = getPaddingTop() + getPaddingBottom() + specSize;                break;            case MeasureSpec.AT_MOST:// 一般为WARP_CONTENT                height = getPaddingTop() + getPaddingBottom() + mBound.height();                break;        }        setMeasuredDimension(width, height);    }    @Override    protected void onDraw(Canvas canvas)    {        mPaint.setColor(Color.YELLOW);        canvas.drawRect(0, 0, getMeasuredWidth(), getMeasuredHeight(), mPaint);        mPaint.setColor(mTitleTextColor);        canvas.drawText(mTitleText, getWidth() / 2 - mBound.width() / 2, getHeight() / 2 + mBound.height() / 2, mPaint);    }}

参考:http://blog.csdn.net/lmj623565791/article/details/24252901

更多相关文章

  1. 自定义时间控件
  2. Android(安卓)RecyclerView聊天界面控件布局居底
  3. Android(安卓)Provider权限
  4. Android(安卓)控件开发之ToggleButton
  5. Android(安卓)studio cmake报错
  6. Android(安卓)Banner图片轮播控件+ViewPagerIndicator+ViewPager
  7. Android培训班(12)
  8. android 常用 INTENT
  9. android中通过代码启动应用程序

随机推荐

  1. 定位与定位元素
  2. 表格、表单
  3. 意派Epub360丨“就地过年”创意H5,让春节
  4. 开源知识付费阅读系统源码(知识付费小程序
  5. 网站建设系统:如何防止我们的网站被ping?
  6. Docker重要容器命令
  7. CSS 响应式布局及定位的使用方法学习
  8. vue axios同步请求解决方案
  9. 群体的种类
  10. 壬寅学制与癸卯学制