三杆火枪干掉自定义View 扫二维码继续学习 二维码时效为半小时

从源码角度结合项目实例深入学习自定义View
(13 评论)

49.00元

1. setMeasuredDimension()设置View的宽和高。

2. getDefaultSize() 获得View的宽高。

3. getSuggestedMinimumWidth() 获得View的款或高的最小值。

[展开全文]

1. MeasureSpec 测量规格

32位 高2位表示模式,底30位表示大小。

2. 三种模式

EXACTLY:父View已经检测出子View的大小,这时子View的大小就是传入的size。

AT_MOST:父容器没有检测出子View的大小,子View不能超过这个size

UNSPECIFIED:父容器不对子View的大小做限制,用于Android系统内部。

 

[展开全文]

dispatchTouchEvent 事件的分发

[展开全文]

总结:

1.获取View的测量大小measuredWidth和measuredHeith的时机?

我们可以在onLaytou中获取上一个测量过的大小

2.getMeasuredWidth()和getWidth()的区别?

a.获取的时机不同,getMeasuredWidth()在measure之后就可以获取大小,getWidth()要在laytou()之后才能去获取。

b.计算方式不同,,getMeasuredWidth()是由ViewGropz中的set```(不记得了),getWidth()是由控件的右坐标减去左坐标(Right-left)

3.view.getLeft/Right()/top/buttom()等坐标问题.

[展开全文]

view.laytou()这个方法确定了自己在父View中的位置

ViewGroup.onLaytou()确定了子View的位置 。

[展开全文]

onMeasure()的源码流程

a.(最外层)调用了setMeasuredDimension()设置了View的宽和高

b.在setMeasuredDimension()中调用了getDefaultSize()获取View的宽和高。

c.getDefaultSize()中调用了getSuggestedMinimumWidth()获取宽的最小值或者getSuggestedMinimumheidth()获取高的最小值。

 

 

[展开全文]

mFirstTouchTarget

 

==null:需要ViewGroup自己处理Touch事件或者是没有找到子View消费

!=null:表示ViweGroup没有拦截Touch事件,并找到子View处理Touch事件并消费

 

[展开全文]

1984年发布定义了图片合成规则标准的两个工程师,为了纪念他们贡献,用他们的名字定义了图片合成模式的类名:PorterDuffXfermode

这个类定义了十多种图片合成的效果模式,在canvas合成图片时可以使用这些模式达到合成效果。

Src 原图  

Dst 想要的效果图形  (注意canvas画图的次序)

以下的规则看的老师的博客:

  1. PorterDuff.Mode.CLEAR 
    绘制不会提交到画布上
  2. PorterDuff.Mode.SRC 
    只显示绘制源图像
  3. PorterDuff.Mode.DST 
    只显示目标图像,即已在画布上的初始图像
  4. PorterDuff.Mode.SRC_OVER 
    正常绘制显示,即后绘制的叠加在原来绘制的图上
  5. PorterDuff.Mode.DST_OVER 
    上下两层都显示但是下层(DST)居上显示
  6. PorterDuff.Mode.SRC_IN 
    取两层绘制的交集且只显示上层(SRC)
  7. PorterDuff.Mode.DST_IN 
    取两层绘制的交集且只显示下层(DST)
  8. PorterDuff.Mode.SRC_OUT 
    取两层绘制的不相交的部分且只显示上层(SRC)
  9. PorterDuff.Mode.DST_OUT 
    取两层绘制的不相交的部分且只显示下层(DST)
  10. PorterDuff.Mode.SRC_ATOP 
    两层相交,取下层(DST)的非相交部分和上层(SRC)的相交部分
  11. PorterDuff.Mode.DST_ATOP 
    两层相交,取上层(SRC)的非相交部分和下层(DST)的相交部分
  12. PorterDuff.Mode.XOR 
    挖去两图层相交的部分
  13. PorterDuff.Mode.DARKEN 
    显示两图层全部区域且加深交集部分的颜色
  14. PorterDuff.Mode.LIGHTEN 
    显示两图层全部区域且点亮交集部分的颜色
  15. PorterDuff.Mode.MULTIPLY 
    显示两图层相交部分且加深该部分的颜色
  16. PorterDuff.Mode.SCREEN 
    显示两图层全部区域且将该部分颜色变为透明色

-----------我是分割线哈哈哈----------

矩阵对图片操作的动作是在队列里依次调用

矩阵对图片操作的三种方法以及次序:

1.setXXX()  不管队列中有多少动作,清空,都给老子干掉,然后把当前动作加进去。

2.preXXX()   不管队列中有多少动作,老子就要排第一,插到队头,逢调必插。

3.postXXX()  不管队列中有多少动作,我就喜欢当小弟,排队尾。

[展开全文]

canvas.translate(int x, int y),不是移动已经画了的内容,调用前已经画的内容不会变,而是移动的是坐标原点,整个坐标系移动了,在以新的坐标原点开始画。

canvas.clipRect(rect),裁剪后只能在新区域画,不可逆。那么在裁剪之前,借助canva.save()先保存一次画板,就是创建了一个新的层layer在画板之上,之后再裁剪,实际上就是对这个新的层layer进行裁剪,之后再调用canvas.restore(),就把在新层中绘制的区域覆盖到原来的画板上,达到叠加效果,此时整个原来的canvas区域都依然是可以画的。新的layer层就起到了中间媒介的作用。

canva.save()和canvas.restore()成对出现

[展开全文]

onDraw()方法的参数canvas,在底层谷歌已经把SkBitmap和它联系在一起,绘制内容四要素并没有缺少bitmap

[展开全文]

两个方法绝大多数情况结果一样,但

调用时机不同:

getMeasureWidth()是在measure结束之后调用,

getWidth()是在layout结束之后调用

计算方式不同:

getMeasureWidth()是由setMeasureDimension决定的

getWidth()是由空间的右坐标减去左坐标得到的。

[展开全文]

有个表格很重要  关于孩子的大小和模式 对应上父亲的三个模式时 一一对应有确定到 有个坑就是当父亲的测量模式是exactly或者almost的时候 同时孩子又是包裹内容的时候 孩子的大小最多只能是父容器剩下的空间,孩子模式也赋值了almost,这样孩子就无法根据自己包裹的内容大小是多少来显示,此时会出现显示不全或者其他吧,这个时候只能重写孩子的onMeasure方法,判断此时孩子的高宽的模式,结合业务逻辑来给孩子的设置测量尺寸方法传参。

[展开全文]

firsttouchTarget 为null时 ViewGroup消费此事件。 

[展开全文]

相关课程