day54_自定义控件第02天

01_开关_按下关闭时的逻辑

View的行为

  1. OnTouchEvent():
  2. click,longclick
  3. dispatchTouchEvent(): touch分发 是否分发touch事件
  4. onInterceptTouchEvent():touch拦截 是否拦截
  5. setOnTouchListener(): touch

android希望开发人员封装触摸行为给用户提供交换

 

 

View的刷新:

invalidate() --->draw()--->onDraw();

 

invalidate(): // 触发刷新--主线程调用

postInvalidate(): // 触发刷新--子线程调用

 

默认的屏幕事件状态

 

 

在鼠标按下的时在onTouchEvent()中更改状态

实现

 

02_开关_按下打开时的逻辑

 

03_开关_抬起时的逻辑

将down和move合并

up

 

 

04_开关_回调接口的实现

  1. setXXXListener:设置监听的方法,有提供者创造,用来给使用者提供监听回调
  2. 提供者 -- onxxxListener
  3. 提供者 -- 调用接口中的方法
  4. 使用者 -- 实现接口中的方法

 

 

 

 

 

 

提供者:

使用者:

 

 

05_菜单_布局的实现

  1. 分析

    1). 分左右两侧,整体可以滑动

 

06_菜单_layout部分的介绍

 

Android之中的view只研究两个级别:父与子的关系

 

getWidth()和getHeight()

右减左

 

只有view调用了layout()方法,才能有mRight,mLeft等,才能调用getWidth()

 

在没有调用layout()之前,可以调用getMeasuredWidth()和getMeasuredHeight()方法

 

getMeasuredWidth()和getMeasuredHeight()

在setMeasuredDemension()调用之后才能调用,即下调用孩子的measure()方法

 

07_菜单_左侧的layout和测量

widthMeasureSpec:期望值

  1. 组成:

    32位0101组成

     

    1.头2位:模式

            UNSPECIFIED:不确定的,随意

            EXACTLY:精确的

            AT_MOST:最大的

    2.后30位:数值

     

总之就是在调用getMeasuredWidth之前要调用measure(),其中属性获取

通过初始化时获取getLayoutParams()获取属性值

 

最后通过MeasureSpec组装,再进行设置

 

自己就按照期望去设置

 

08_菜单_右侧布局的实现

 

09_菜单_scrollTo和scrollBy

滚动API:移动的都是手机屏幕

scrollTo:标准

 

scrollBy:增量的

 

10_菜单_滑动的实现

正向滑动,屏幕反向移动

 

getScrollX() :屏幕左上角相当于主坐标系的位置

 

 

 

11_菜单_up的操作实现

 

12_菜单_scroller的使用

一个用来模拟数据变化的类

最后加上一个invalidate() --- >这个方法只执行一次

覆盖此方法,本方法也只执行一次,所以递归

 

 

13_Touch的传递机制

 

viewgroup复写了dispatchTouchEvent(由返回值决定是否分发)事件

不分发:返回true

分发:返回false --- > onInterceptTouchEvent() (viewgroup才有,view没有)要不要拦截孩子的touch

                                不拦截:false

                                拦截:true

                        --- > onTouchEvent:是否消费

                                消费:true 实现触摸逻辑

                                不消费:false

也就是,只有一个view或者viewgroup能消费;

 

14_菜单_拦截的处理

 

拦截,不发给textview,自己消费

 

 

在styles裏面添加一個点击事件

 

15_滑动删除_布局的实现

 

  1. 先写content.xml,delete.xml
  2. 创建SweepView类
  3. 在把content.xml和delete.xml添加到main.xml的SweepView中

  4. 完善SweepView类
    1. 创建两个构造方法,和onLayout(先空实现)

      让无参的包含有参的

    2. 实现onFinishiInflate()获取对象 并 初始化一些变量

    3. 实现onMeasure()方法:为了能onLayout能调用getMeasuredWidth()方法

      测量各个部分,在确定并设置自己高度

    4. 实现onLayout():对各个部分设置布局

       

16_ViewDragHelper的使用步骤

用来分析touch事件的一个工具类

使用步骤:

  1. 获取ViewDragHelper实例

    ViewDragHelper.create(ViewGroup, ViewDragHelper.Callback);

  2. touch分析和监听(托管)

  3. 实现自己的callBack

 

 

17_滑动删除_滑动的实现

自己实现callback

  1. down:

    tryCaptureView():是否分析view的touch

  2. move:

    clampViewPositionHorizontal():水平移动的回调

     

3. up

onViewReleased():松开的

 

 

 

18_滑动删除_边距检测

被点击的控件有两种情况

19_滑动删除_up的实现

 

 

20_滑动删除_数据的加载

 

 

21_滑动删除_删除的实现

接口编写:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值