Android开发之6步教你自定义view

来源:互联网 发布:伦敦金交易数据 编辑:程序博客网 时间:2024/05/16 14:17

如果你打算完全定制一个View,那么你需要实现View类(所有的Android View都实现于这个类),并且实现确定尺寸的onMeasure(…))方法和确认绘图的onDraw(…))方法。

效果图:
这里写图片描述

第一步:继承View,实现构造方法:

public class SmaileView extends View {    private Paint mCirclePaint;  //画圆脸的笔    private Paint mEyeAndMouthPaint;   //画眼睛和嘴巴的笔    private float mCenterX;  //x方向中心    private float mCenterY;  //y方向中心    private float mRadius;   //半径    private RectF mArcBounds = new RectF();    public SmaileView(Context context) {        this(context,null);    }    public SmaileView(Context context, AttributeSet attrs) {        this(context, attrs,0);    }    public SmaileView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        initPaints();    }

第二步:实现画笔Paint类,准备两支画笔:

/**     * 实现画笔     */    private void initPaints() {        mCirclePaint = new Paint(Paint.ANTI_ALIAS_FLAG);        mCirclePaint.setStyle(Paint.Style.FILL);        mCirclePaint.setColor(Color.YELLOW);        mEyeAndMouthPaint = new Paint(Paint.ANTI_ALIAS_FLAG);        mEyeAndMouthPaint.setStyle(Paint.Style.STROKE);        mEyeAndMouthPaint.setStrokeWidth(16*getResources().getDisplayMetrics().density);        mEyeAndMouthPaint.setStrokeCap(Paint.Cap.ROUND);        mEyeAndMouthPaint.setColor(Color.BLACK);    }

第三步:重写onMearsure(…)方法:
以下是一个正方形,确认它的宽和高是一样的。

@Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        //实现这个方法告诉了母容器如何放弃自定义View,可以通过提供的measureSpecs来决定你的View的高和宽        int w = MeasureSpec.getSize(widthMeasureSpec);        int h = MeasureSpec.getSize(heightMeasureSpec);        int size = Math.min(w, h);        setMeasuredDimension(size, size);    }

注意:这个方法需要至少保证一个setMeasuredDimension(..)调用,否则会报IllegalStateException错误。

第四步:重写onSizeChanged(…):

@Override    protected void onSizeChanged(int w, int h, int oldw, int oldh) {        //这个方法是你获取View现在的宽和高. 这里我们计算的是中心和半径。        mCenterX = w / 2f;        mCenterY = h / 2f;        mRadius = Math.min(w,h)/2f;    }

第五步:重写onDraw()方法:
这个方法提供了如何绘制view,它提供的Canvas类可以进行绘制。

@Override    protected void onDraw(Canvas canvas) {        //画脸        canvas.drawCircle(mCenterX,mCenterY,mRadius,mCirclePaint);        //画眼睛        float eyeRadius = mRadius / 5f;        float eyeOffSetX = mRadius / 3f;        float eyeOffSetY = mRadius / 3f;        canvas.drawCircle(mCenterX - eyeOffSetX,mCenterY - eyeOffSetY,eyeRadius,mEyeAndMouthPaint);        canvas.drawCircle(mCenterX + eyeOffSetX,mCenterY - eyeOffSetY,eyeRadius,mEyeAndMouthPaint);        //画嘴巴        float mouthInset = mRadius / 3f;        mArcBounds.set(mouthInset,mouthInset,mRadius*2 - mouthInset,mRadius*2 - mouthInset);        canvas.drawArc(mArcBounds,45f,90f,false,mEyeAndMouthPaint);    }

第六步:添加你的view到布局文件:

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context="com.classical.example_view.MainActivity">    <com.classical.example_view.view.SmaileView        android:layout_width="match_parent"        android:layout_height="match_parent"/></RelativeLayout>
0 0
原创粉丝点击