Android 自定义View(自定义控件)

一、创建一个控件类间接或者直接继承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

你可能感兴趣的:(android)