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

    xiaoxiao2021-03-25  86

    如果你打算完全定制一个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>
    转载请注明原文地址: https://ju.6miu.com/read-21343.html

    最新回复(0)