三杆火枪干掉自定义View

从源码角度结合项目实例深入学习自定义View

三杆火枪干掉自定义View
1071人加入学习
(16人评价)
价格 ¥49.00
会员免费学 购买课程

当Canvas进行剪裁操作后,Canvas进行的绘制操作只会在剪裁区域内显示。

[展开全文]

getMeasureWidth()和getWidth()的区别:

1、获取的时机不同

一个是在measure结束后获取到的;一个是在layout结束后获取到的。

2、计算的方式不一样

一个是由setMeasuredDimension计算得到;一个是由右边坐标减去左边坐标得到。

 

[展开全文]

MeasureSpec(测量规格)

1、MeasureSpec封装了父布局传递给子View的布局要求

2、MeasureSpec可以表示宽和高

3、MeasureSpec由size和mode组成

 

MeasureSpec是一个32位的int数据. 
其中高2位代表SpecMode即某种测量模式,低30位为SpecSize代表在该模式下的规格大小.

获取SpecSize:

int specSize = MeasureSpec.getSize(measureSpec);

获取SpecMode:

int specMode = MeasureSpec.getMode(measureSpec);

由SpecSize和SpecMode可以生成新的MeasureSpec:

int measureSpec=MeasureSpec.makeMeasureSpec(size, mode);

 

SpecMode有三种模式:

1、MeasureSpec.EXACTLY

父容器已经检测出子View所需要的精确大小。 

在该模式下,View的测量大小即为SpecSize。

2、MeasureSpec.AT_MOST

父容器未能检测出子View所需要的精确大小,但是指定了一个可用大小即specSize。
在该模式下,View的测量大小不能超过SpecSize。

3、MeasureSpec.UNSPECIFIED

这种模式一般用作Android系统内部,或者ListView和ScrollView等滑动控件

 

核心思想:

子View的MeasureSpec由其父容器的MeasureSpec和该子View本身的布局参数LayoutParams共同决定。 


在此经过测量得出的子View的MeasureSpec是系统给出的一个期望值(参考值),我们也可摒弃系统的这个测量流程,直接调用setMeasuredDimension( )设置子View的宽和高的测量值。

根据父View的specMode的不同来决定子View的specMode和specSize。

 

 

 

 

[展开全文]

view的measureSpec是由父view的mode(EXACTLY/AT_MOST/UNSPECIFIED)和子view的布局参数(确定值/MATCH_PARENT/WARP_CONTENT)共同确定得到的

[展开全文]

scrollTo/scrollBy滑动的只是内容

[展开全文]

自定义View显示过程:onMeasure--->onLayout--->onDraw

自定义用户交互过程:dispatchTouchEvent--->onInterceptTouchEvent--->onTouchEvent

[展开全文]

SET 表示执行位移缩放

SET 表示清空队列将自己放入中间

preScale 表示放入列队的对头操作(顶端)

postScale 表示放入列表的对尾操作(底端)

[展开全文]

1.save后锁定画板之后的操作对它有影响

2.在执行后save后系统会生成一个新的layer图层

3.我们所绘制的图形会展示在layer上它不会影响到原来的

4.我们在layer上画完之后会把原来的图层覆盖到原来的画板上也就是执行地了restore

5.我们可以在原来的基础上继续画。

最好是对等的执行save 和restore 否则可能会报错

[展开全文]

派发down时候没有找到一个子view去处理事件,那么直接自己去处理事件。

[展开全文]

translate移动的是坐标系,而不是内容

[展开全文]

viewgroup的layout方法是为了确定其自身在父view中的位置,而viewgroup的onlayout方法是为了确定子view的位置

[展开全文]

子view的measureSpec是由父view的measureSpec和子view的布局参数共同决定的

[展开全文]

Scroller滑动时只是滑动了view的内容

[展开全文]

1、measure

最难。但又是第一步

2、layout

3、draw

[展开全文]

圆角的图片:

PorterDuffXfermode

 

两个图形,各种规则,显示不同的部分。

[展开全文]

canvas

translate 平移  操作是移动坐标系

rotate 旋转  操作是旋转坐标系

clipRect 剪裁  剪裁后绘制的只会在剪裁后的区域显示(有效绘图空间)。。。如果想要在剪裁前的区域绘图,那么我们可以在剪裁前使用canvas.save()方法,剪裁完后再调用canvas.restore(),再绘图(此时的绘图就在剪裁前的区域)

sava()  锁定 

原理:save后面的操作没有影响到原来的图层,原因是因为save之后系统会生成一个透明的layer,之后的操作都在layer上,此时调用restore,就会将绘制的内容覆盖到原来的图层上。

save和restore是配对出现的。一一对应的。

 

[展开全文]

draw的步骤

1.绘制View的背景

2.如果有必要的话,绘制View滑动时边框的渐变效果。

3.绘制View的内容

4.绘制子View

5.如果有必要的话,绘制子View滑动时边框的渐变效果。

6.绘制滚动条,滑动条之类的东西

 

通常情况下是不需要对第2和第5步。

 

 

Canvas

1.绘图工具(笔):Paint

2.在哪画图呢? bitmap  图形会在Bitmap上展示出来。

3.画什么:Rect,Path,text,Bitmap.

4.怎么画? 就是Canvas

 

onDraw(Canvas canvas)

系统会将SKBitmap和canvas绑定在一起,

Skia  是底层google绘图的东西

[展开全文]