自定义View(类似验证码)

来源:互联网 发布:蜀美网络招聘信息 编辑:程序博客网 时间:2024/06/08 02:02


在res/valus目录下新建一个attrs的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>
新建一个类去继承view

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.Log;import android.util.TypedValue;import android.view.View;import java.util.HashSet;import java.util.Random;import java.util.Set;/** * Created by Administrator on 2016/8/9. */public class mView extends View {    /**     * 文本     */    private String mTitleText;    /**     * 文本的颜色     */    private int mTitleTextColor;    /**     * 文本的大小     */    private int mTitleTextSize;    /**     * 绘制时控制文本绘制的范围     */    private Rect mBound;    private Paint mPaint;    public mView(Context context) {        this(context, null);    }    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();    }    public mView(Context context, AttributeSet attrs) {        this(context, attrs, 0);        this.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                mTitleText = randomText();                postInvalidate();            }        });    }    /**     * 获得我自定义的样式属性     *     * @param context     * @param attrs     * @param     */    public mView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        /**         * 获得我们所定义的自定义样式属性         */        TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.CustomTitleView, defStyleAttr, 0);        int n = a.getIndexCount();        Log.d("mView", "n" + n);        for (int i = 0; i < n; i++) {            int attr = a.getIndex(i);            Log.d("mView", "attr:" + attr);            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);    }    @Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        super.onMeasure(widthMeasureSpec, heightMeasureSpec);    }    @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        mPaint.setColor(Color.RED);        canvas.drawRect(0, 0, getMeasuredWidth(), getMeasuredHeight(), mPaint);        mPaint.setColor(Color.GRAY);        canvas.drawText(mTitleText, getWidth() / 2 - mBound.width() / 2, getHeight() / 2 + mBound.height() / 2, mPaint);    }}
直接运用在布局中

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    xmlns:custom="http://schemas.android.com/apk/res-auto"    android:orientation="vertical"    android:layout_width="match_parent"    android:layout_height="match_parent"><com.example.administrator.myview.mView    android:layout_width="200dp"    android:layout_height="100dp"    custom:titleText="3712"    android:padding="10dp"    custom:titleTextColor="#ff0000"    android:layout_gravity="center"    custom:titleTextSize="40sp"    /></LinearLayout>
效果图


0 0
原创粉丝点击