常规 & 高级 UI 编程(2) | 青训营笔记

166 阅读4分钟

这是我参与「第四届青训营 」笔记创作活动的第4天

交互

交互分为两个部分:

  1. 获取View实例
  2. 添加相应监听器

获取View实例-findVicwByld

常用交互事件监听器

回调方法事件监听器
onClick()View.OnClickListener 当用户轻触项目(在触摸模式下),或者使用导航键或轨迹球聚焦于项目,然后按适用的Enter键或按下轨迹球时,系统会调用此方法。
onLongClick()View.OnLongClickListener 当用户轻触并按住项目(在触摸模式下)时,或者使用导航键或轨迹球聚焦于项目,然后按住适用的"Enter”键或按住轨迹球(持续一秒钟)时,系统会调用此方法。
onFocusChange()View.OnFocusChangeListener 当用户使用导航键或轨迹球转到或离开项目时,系统会调用此方法。
onKey()View.OnFocusChangeListener 当用户聚焦于项目并按下或释放设备上的硬件按键时,系统会调用此方法。
onTouch()View.OnTouchListener 当用户执行可视为触摸事件的操作时,包括按下、释放或屏幕上的任何移动手势(在项目边界内),系统会调用此方法。

屏幕触摸事件

image.png

所有的交互事件都来自于对屏幕触摸信号的处理,View.OnClickListener()等常用点击事件是对交互事件的二次封装

触摸事件-MotionEvent

image.png

当用户触摸屏幕时,系统将建立一系列的MotionEvent对象,MotionEvent包含关于发生触摸的位置和时间等细节信息,MotionEvent对象被传递到相应的捕获函数中,例如onTouchEvent()。

捕获触摸事件

  1. Activity和View都有onTouchEvent(),用于处理触摸事件。
  2. 当用户触摸屏幕时,会回调触摸视图上的onTouchEvent()。对于最终被识别为手势的每个轻触事件序列,onTouchEvent()都会多次被触发。

触摸事件分发

顺序:Activity ——> ViewGroup ——> View

核心方法

  • dispatchTouchEvent (事件分发)
  • onInterceptTouchEvent (事件拦截)
  • onTouchEvent (事件响应)

View的事件响应

  1. 在onTouchEvent()的ACTION_DOWIN设置了一个延时Runnable,用于处理onLongClickListener。
  2. 在onTouchEvent()的ACTION_UP中,判断onLongClick是否执行,未执行则移除,然后执行onClickListener

动画

常见动画类型

  • 帧动画
  • 补间动画
  • 属性动画

帧动画

image.png

补间动画

image.png

插值器

Interpolator:是一个接口。设置属性值从初始值过渡到结束值的变化规律

image.png

View动画小结

image.png

属性动画

image.png

动画总结

image.png

两类动画的根本区别在于:是否改变动画本身的属性

  • 视图动画:不改变动画的属性,在动画过程中仅对图像进行变换来达到动画效果。无论动画结果在哪,该View的位置和响应区域都是在原地,不会根据结果而移动;
  • 属性动画:改变了动画属性 因属性动画在动画过程中对动态改变了对象属性,从而达到了动画效果

自定义View

创建View

构造器应用场景
1个参数Java代码中创建View
2个参数通过XML声明创建View
3个参数通过XML声明创建View + Style
4个参数通过XML声明创建View + Style + Theme

处理View布局

复写方法应用场景
onMeasure一般需要复写宽高设置为wrap_content场景、以及组件宽高有比例限制
onLayout继承自ViewGroup时必须复写,继承自View时一般不用
onSizeChanged视图大小发生改变时调用

绘制View

核心类:Paint && Canvas

处理用户交互

交互事件操作逻辑
ACTION DOWN设置操作状态
ACTION MOVE处理拖拽,触发UI更新
ACTION UP处理开关状态,播放动画
ACTION CANCEL复位操作状态

处理动画

  1. 设置属性动画,同时添加监听器
  2. 在动画监听器中,根据属性值更新UI状态值,并触发UI绘制

自定义View小结

image.png

后记

课程中我学习了交互、动画、自定义View的相关内容。整体课程体量有一定难度,课后需要借助课程复习,更好地吸收课程内容,之后通过练习来掌握常规 & 高级 UI 编程。