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

View的行为

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

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

 

 

View的刷新:

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

 

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

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

 

默认的屏幕事件状态

 

day54_自定义控件第02天

day54_自定义控件第02天

 

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

day54_自定义控件第02天

实现

day54_自定义控件第02天

 

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

day54_自定义控件第02天

 

03_开关_抬起时的逻辑

将down和move合并

day54_自定义控件第02天

up

day54_自定义控件第02天

day54_自定义控件第02天

 

 

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

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

 

 

 

 

 

 

提供者:

day54_自定义控件第02天

使用者:

 

day54_自定义控件第02天

 

05_菜单_布局的实现

  1. 分析

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

 

06_菜单_layout部分的介绍

 

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

 

getWidth()和getHeight()

day54_自定义控件第02天

右减左

 

只有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(),其中属性获取

day54_自定义控件第02天

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

 

day54_自定义控件第02天

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

 

day54_自定义控件第02天

自己就按照期望去设置

 

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

day54_自定义控件第02天

 

day54_自定义控件第02天

09_菜单_scrollTo和scrollBy

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

scrollTo:标准

 

scrollBy:增量的

 

day54_自定义控件第02天

10_菜单_滑动的实现

正向滑动,屏幕反向移动

 

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

 

day54_自定义控件第02天

 

 

11_菜单_up的操作实现

 

day54_自定义控件第02天

day54_自定义控件第02天

day54_自定义控件第02天

12_菜单_scroller的使用

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

day54_自定义控件第02天day54_自定义控件第02天

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

day54_自定义控件第02天

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

 

 

13_Touch的传递机制

 

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

不分发:返回true

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

                                不拦截:false

                                拦截:true

                        --- > onTouchEvent:是否消费

                                消费:true 实现触摸逻辑

                                不消费:false

day54_自定义控件第02天

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

 

14_菜单_拦截的处理

 

day54_自定义控件第02天

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

 

 

day54_自定义控件第02天

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

day54_自定义控件第02天

 

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

 

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

    day54_自定义控件第02天

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

      让无参的包含有参的

      day54_自定义控件第02天

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

      day54_自定义控件第02天

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

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

      day54_自定义控件第02天

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

      day54_自定义控件第02天

       

16_ViewDragHelper的使用步骤

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

使用步骤:

  1. 获取ViewDragHelper实例

    ViewDragHelper.create(ViewGroup, ViewDragHelper.Callback);

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

    day54_自定义控件第02天

  3. 实现自己的callBack

    day54_自定义控件第02天

 

day54_自定义控件第02天

 

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

自己实现callback

  1. down:

    tryCaptureView():是否分析view的touch

  2. move:

    clampViewPositionHorizontal():水平移动的回调

     

3. up

onViewReleased():松开的

day54_自定义控件第02天

 

day54_自定义控件第02天

 

 

18_滑动删除_边距检测

day54_自定义控件第02天

day54_自定义控件第02天

被点击的控件有两种情况

19_滑动删除_up的实现

 

day54_自定义控件第02天

day54_自定义控件第02天

day54_自定义控件第02天

 

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

 

day54_自定义控件第02天

day54_自定义控件第02天

 

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

接口编写:

day54_自定义控件第02天

相关文章:

  • 2021-11-04
  • 2021-10-10
  • 2021-09-25
  • 2022-12-23
  • 2022-12-23
  • 2022-02-26
  • 2021-12-15
  • 2022-12-23
猜你喜欢
  • 2022-02-11
  • 2021-11-01
  • 2022-02-03
  • 2022-01-05
  • 2021-06-19
  • 2021-11-23
  • 2021-12-18
相关资源
相似解决方案