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

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

49.00元

1.继承自View

需处理 onMeasure wrap_content

2.继承系统已有的View:TextView

3.继承ViewGroup

onMeasure onLayout

4.继承系统已经有的ViewGroup

 

[展开全文]

measure layout draw

 

[展开全文]
ouer1994 · 16天前 · 课程介绍 0

6个常用的工具类:

1Configuration(配置)

2ViewConfiguration(视图配置)

   提供了自定义控件用到的标准常量

3GestureDetector(手势识别)

4VelocityTracker(速度跟踪器)

5Scroller

6ViewDragHelper

[展开全文]

 

color-themes.com/?view=index

MeasureSpec

·封装了父布局对子布局的要求

·32位,高2位mode,低30位size

EXACTLY-精确模式,父View已经检测出了子View所占大小

AT_MOST -未检测出,最大不能超过其size

1. parent-EXACTLY child>=0

 mode = EXACTLY;

 size = childDimension;

2. parent-EXACTLY child-match_parent

 mode = EXACTLY;

 size = Math.max(0, specSize-padding);

3. parent-EXACTLY child-wrap_content

 mode = AT_MOST;

 size = Math.max(0, specSize-padding);

[展开全文]

MeasureSpec 

 封装了父布局对子布局的要求

 封装了模式和大小( )

 

[展开全文]

1.初始化

2.判断是否拦截

3.判断是否取消

4.处理Down事件

[展开全文]

Maxtrix

set-清空队列,执行

post-队列的最末尾

pre-队列的最前面

[展开全文]

辅助工具类

Configuration:

描述设备的配置和信息。

 

ViewConfiguration:

自定义控件看到的标准常量,UI超时、尺寸大小、滑动距离等;

 

GestureDetector:

简化Touch操作

 

Velocity Tracker:

跟踪触摸屏事件的速率 

 

Scroller:

滑动时滑动的是View的内容

 

ViewDragHelper:

简化View的拖拽相关操作

 

Vysor

[展开全文]

1. measure、layout、draw、touch

[展开全文]
戚继光 · 20天前 · 课程介绍 0

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()成对出现

[展开全文]

相关课程