自定义View(一)

简介: 一、初探大家都知道自定义view需要重写onMeasure和onDraw两个方法,这里我们在讲这两个方法前首先看看什么时候走这两个方法,这里只是大致讲讲方便理解,详细的之后会说。

<h4>一、初探</h4>
<p>大家都知道自定义view需要重写onMeasure和onDraw两个方法,这里我们在讲这两个方法前首先看看什么时候走这两个方法,这里只是大致讲讲方便理解,详细的之后会说。</p>

img_c9cfdc733134f4476d1cb506105e2f39.png
image.png

看看我在生命周期中加的打印的结果,我们发现onMeasure和onDraw在activity生命周期先走之后在去走,并且onMeasure方法调用了4次,为什么会这样呢,这属于深入的内容,以后再讲,先记住View的测量和绘制在组件的生命周期之后就行。
</br>
<h4>二、onMeasure和onDraw</h4>
这里简单讲讲这两个方法的用法,先不去探究源码。
<h6>1、onMeasure</h6>
<p>onMeasure发生在onDraw前,测量的意思,我这里先不说很详细,网上有些文章说一大堆,什么测量父布局传递的宽高什么的,一开始就讲这些给初学者我觉得很绕,先会用,在去理解比较好。</p>
<p>(1)先看看onMeasure中传递的两个参数,先记住他们不是宽高。
widthMeasureSpec = 模式+宽;heightMeasureSpec = 模式+高
要获取到宽高需要这样写:</p>
<pre>
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
// Log.v("yet","onMeasure");
int heighMode = MeasureSpec.getMode(heightMeasureSpec);
int heigh = MeasureSpec.getSize(heightMeasureSpec);
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int width = MeasureSpec.getSize(widthMeasureSpec);
setMeasuredDimension(width,heigh);
}
</pre>
这样就是最简单的,就是说你告诉系统,你要画出的这个view的宽高,直接为你xml中所写的宽高。
</br>
<p>(2)模式
上边说了一个属性,那么它有什么作用呢?在这里我们加一段switch的代码,然后去改布局的宽,看看能打印出什么结果。</p>
<pre>
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
// Log.v("yet","onMeasure");
int heighMode = MeasureSpec.getMode(heightMeasureSpec);
int heigh = MeasureSpec.getSize(heightMeasureSpec);
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int width = MeasureSpec.getSize(widthMeasureSpec);

    switch (widthMode) {
        case MeasureSpec.UNSPECIFIED: {
            Log.v("yet","UNSPECIFIED");
            break;
        }
        case MeasureSpec.AT_MOST: {
            Log.v("yet","AT_MOST");
            break;
        }
        case MeasureSpec.EXACTLY: {
            Log.v("yet","EXACTLY");
            break;
        }
    }
    setMeasuredDimension(width,heigh);
}

</pre>

结果:
<ul>
<li>当布局是match_parent时,打印EXACTLY</li>
<li>当布局是固定尺寸(例如100dp)时,打印EXACTLY</li>
<li>当布局是wrap_content时,打印AT_MOST</li>
</ul>
让我们来看看结论:

img_cd4eb135509dc1fe4bb6f06825b7d2b0.png
image.png

<h6>其实读这张表的时候可能刚开始会觉得有点懵逼,不过不要紧,你先记住哪种情况对应哪种模式,之后熟练了,就理解这个表所说的含义了。</h6>
<h6>2、onDraw</h6>
onDraw就是绘制该View,其实这个的知识很多,这篇不详细去讲,也感觉说不完,别人自定义中画得好的那种都是几百行代码。但是虽然内容多,但是套路都一样,都是弄个画笔,然后设置画笔,最后绘画。
(1)创建画笔
Paint p = new Paint();
(2)设置画笔
设置颜色什么之类的,假如paint.setColor(Color.GREEN)将画笔颜色设置成绿色,当然是选择原谅她。
(3)画图
画图的方法也很多,画圆画方之类的,这些方法在网上也很容易找到,用起来也简单,比如画圆canvas.drawCircle(centerX, centerY, r, paint)。反正每个画图一般基本都是:画布.画什么(...,画笔),都是套路。
</br>
<h6>很多朋友第一次接触或者接触不多会觉得自定义View很难,这两个方法里面写什么看不懂,其实不难,认真看自己动手去做你就会发现自定义View不难,对我来说,我反而觉得比较难的是什么时候系统会调用什么方法和一些条件下的重绘之类的。</h6>
</br>
<h6>总结:这篇主要简单的讲了什么时候走onMeasure和onDraw方法和这两个方法的简单用法。</h6>

目录
相关文章
|
XML Android开发 数据格式
自定义View入门
自定义View入门
|
Android开发
Android进阶之绘制-自定义View完全掌握(一)
Android进阶之绘制-自定义View完全掌握(一)
113 0
Android进阶之绘制-自定义View完全掌握(一)
|
XML 前端开发 Android开发
Android自定义View-入门(明白自定义View和自定义ViewGroup)
为什么要自定义View? 主要是Andorid系统内置的View 无法实现我们的 需求,我们需要针对我们的业务需求定制我们想要的 View.
130 0
Android自定义View-入门(明白自定义View和自定义ViewGroup)
|
编解码 Android开发
Android进阶之绘制-自定义View完全掌握(三)
Android进阶之绘制-自定义View完全掌握(三)
156 0
Android进阶之绘制-自定义View完全掌握(三)
|
容器
自定义View
自定义View 画一个实心圆 效果图 创建attrs.xml文件 初始化样式属性 支持Padding属性 支持wrap_content属性 布局文件中的应用 画一个带外圆环的圆 效果图 创建attrs.xml文件 初始化样式属性 内圆与外圆环的绘制 布局文件中的应用 画一个外圆环可根据数值变动的圆 效果图 创建attrs.xml文件 初始化样式属性 绘制View 提供方法修改样式 布局文件中的应用
105 0
自定义View
|
前端开发
自定义View -简单的 SwitchView
前言 实现一个简单的滑动开发,效果图如下: switchView完整版本 分析 平分整个View为两份 平分VIew 测量字体的高度和宽度,确定左右View的文字的位置并进行绘制 确定字体的位置和绘制 绘制...
1029 0
|
XML Android开发 数据格式
3.6 自定义View (3.6.2)
本文对应项目的码云地址:https://gitee.com/wanchuanxy/AndroidHeroesTest/tree/master/3/SystemWidget 3.6.2 创建复合控件 创建复合控件可以很好地创建出具有重用功能的控件集合。
658 0
|
前端开发 Android开发
3.6 自定义View (3.6.1)
本文对应项目的码云地址:https://gitee.com/wanchuanxy/AndroidHeroesTest/tree/master/3/SystemWidget Android给我们提供了丰富的组件库来创建丰富的UI效果,同时也提供了非常方便的拓展方法。
735 0
|
Android开发
自定义View解决滑动冲突
最近在读Android开发艺术探索,本文作为自己对view的滑动冲突的理解和实践记录 而滑动冲突,需要了解Android的事件分发机制,如果这个还有些疑惑的地方,请参考这篇文章,以及其中的参考文章 还需要View的Measure和Layout的相关知识View的Measure流程总结 自定义view注意 1.
1083 0