自定义控件

【Android 开发】自定义View(上)——方法介绍

2019-11-01  本文已影响0人  榆野铃爱

内容简概

一、onDraw方法介绍
二、onMeasure方法介绍
三、onSizeChanged方法介绍
四、其他问题

具体内容

一、onDraw方法介绍

(一)Paint
  1. Paint在Android开发中充当画笔的功能,在绘图中发挥了重要的作用。一般只有当系统提供的方法不能满足需求时,才用onDraw方法自绘。下面展示一些常用的方法。
方法 作用
setColor(int color) 设置绘制的颜色,使用颜色值来表示,该颜色值包括透明度和RGB颜色。
setAntiAlias(boolean aa) 设置是否使用抗锯齿功能,会消耗较大资源,绘制图形速度会变慢。
setStyle(Paint.Style style) 设置画笔的样式,为FILL,FILL_OR_STROKE,或STROKE Style.FILL: 实心 STROKE:空心 FILL_OR_STROKE:同时实心与空心。
setStrokeWidth(float width) 当画笔样式为STROKE或FILL_OR_STROKE时,设置笔刷的粗细度。
setTextSize(float textSize) 设置绘制文字的字号大小
  1. 拓展文章:android 绘图之Paint的效果研究
(二)Path
  1. Path是绘图的路径,可以用来绘制直线、圆、贝塞尔曲线等。下面主要介绍绘制贝塞尔曲线的方法。
方法 作用
moveTo(x1,y1) 移动画笔
quadTo(x1,y1,x2,y2) 绘制贝塞尔曲线
cubicTo(x1,y1,x2,y2,x3,y3) 绘制贝塞尔曲线

那么quadTo和cubicTo有什么不同呢?cubicTo其实就多了一个控制点。看一个例子,绘制同样的贝塞尔曲线:

用quadTo:

mPath.moveTo(100, 500);
mPath.quadTo(300, 100, 600, 500);
canvas.drawPath(mPath, mPaint);

用cubicTo:

mPath.moveTo(100, 500);
mPath.cubicTo(100, 500, 300, 100, 600, 500);
canvas.drawPath(mPath, mPaint);

如果cubicTo的例子中不加moveTo呢?那么cubicTo则以(0,0)为起点,(100,500)和(300,100)为控制点绘制贝塞尔曲线:


(三)Canvas
  1. 翻译过来就是画布,用来对画布进行一些操作,下面是一些常用方法。
方法 作用
drawColor、drawRGB、drawARGB 给画布绘制颜色
drawPoint、drawLine、drawCircle、drawArc 画点、线、圆、圆弧
drawBitmap、drawPicture 绘制图片
drawText 绘制文字
drawPath 绘制路径
  1. 拓展文章:自定义控件之绘图篇(四):canvas变换与操作

二、onMeasure方法介绍

onMeasure 方法简单的理解就是是用于测量视图的大小,主要是用来测量自己和内容的来确定宽度和高度。下面是使用的例子。

    /**
     * 当继承于ViewGroup的时候
     * @param widthMeasureSpec 父控件预测的这个控件的最大宽度
     * @param heightMeasureSpec 父控件预测的这个控件的最大高度
     */
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        //固定的尺寸 - 自己设定宽高
        //setMeasuredDimension(100,100);
    }
onMeasure 作用

(1)一般情况重写onMeasure()方法作用是为了自定义View尺寸的规则,如果你的自定义View的尺寸是根据父控件行为一致,就不需要重写onMeasure()方法 。
(2)如果不重写onMeasure方法,那么自定义view的尺寸默认就和父控件一样大小,当然也可以在布局文件里面写死宽高,而重写该方法可以根据自己的需求设置自定义view大小。如果这个方法被重写,它的子类要保证测量高度和宽度至少是view的最小高宽,否则子类将无法在界面展示出来!!!

目前为止,写的小动画都可以直接用父视图,根本不需要用这个方法,显得这个方法有点鸡肋,不过也许以后会用到吧。为什么要用onMeasure?

三、onSizeChanged方法介绍

这个方法是在视图的大小发生改变后的回调,使用这个方法可以让形状“动起来”,制成简易的动画。

@Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
    }

四、其他问题

(一)Paint.ANTI_ALIAS_FLAG是使位图抗锯齿的标志。

用法: Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
参考文章:Paint效果相关

(二)drawArc变量详解

drawArc有两种写法,法一是通过 RectF 来确定弧线的位置和大小,第二种是直接设置(第二种需要 API 21)。

// 法一
canvas.drawArc(RectF oval, float startAngle,   float sweepAngle, boolean useCenter, Paint paint) 
// 法二
canvas.drawArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean useCenter, Paint paint)  

先用一张图让你了解它各个参数的定义。



具体使用如下:

// 法一
RectF frame = new RectF(50,100,50,50);
canvas.drawArc(frame,120,300,false,mPaint);

// 法二
canvas.drawArc(50,100,50,50, 120, 300, false, Paint paint) 
(三)在使用drawArc时,有可能会遇到以下问题:

提示API过低,这时候只需要在Gradle里修改版本即可,最后不要忘了sync Now。





结语:

方法就介绍到这,具体的使用请见下一篇文章。

上一篇下一篇

猜你喜欢

热点阅读