Android 中 View 相关知识
本文为笔记性质,尚未成文。
View 的坐标
Android 中的坐标,以屏幕左上角顶点为原点 (0,0),以横轴为 x 轴,竖轴为 y 轴,数值依次递增。
View 的坐标信息有以下几种,其坐标都是以父 View 的左上角顶点为原点:
x,y 是 View 的左上角坐标。
translationX,translationY 是 View 左上角顶点与父容器左上角顶点的偏移量,默认为 0。
left,top 是分别是 View 左上角顶点的 x 轴,y 轴坐标。
right,bottom 分别是 View 右下角顶点的 x 轴,y 轴坐标。
注意
x = translationX + left;
y = translationY + top;
改变 translationX/Y 的值便可以更改View 的位置。当 View 平移的时候,代表原始位置信息的 left,right,top,bottom 的值并不会变化。
在 OnTouch 事件中,我们可以从 event 得到两种值:
event.rawX,event.rawY 代表 相对于手机屏幕原点的坐标
event.X,event.Y 代表 相对于当前 View 左上角的坐标
TouchSlop 则代表认为滑动开始的最小距离
ViewConfiguration.get(this).scaledTouchSlop
滑动
mScroller.startScroll() 方法可以实现平滑的滑动
scrollX,scrollY 表示的是view 的 X,Y 坐标减去 view 内容的 X,Y 坐标。
所以 scrollX>0,则表示 view 内容向左移动,scrollX<0 表示 view 内容向右移动。类似于窗户 (view) 位置不变,景色 (view 内容) 的 scrollX>0 即景色向右移动,则在窗户中看到的效果是景色向窗户左边移动。
private val mScroller = Scroller(context)
fun smoothScrollBy(destX: Int, destY: Int) {
mScroller.startScroll(scrollX, scrollY, destX, destY, 1000)//destX, destY 的值如果是正的话,会向左,上方移动
invalidate()
}
override fun computeScroll() {
if (mScroller.computeScrollOffset()) {
scrollTo(mScroller.currX, mScroller.currY)
postInvalidate()
}
}
Scroller 不能使 View 滑动,而只能配合 View 的 computeScroll() 方法实现是View 的内容滑动的效果。
- mScroller.startScroll() 记录下要滑动的数据,而 invalidate() 通知 View 重绘;
- 每次重绘都会调用 computeScroll() 方法,利用 mScroller 计算出接下来要 scrollTo() 的具体值并执行,再次 postInvalidate() 通知 View 重绘;
- 如此反复直到绘制滑动完毕。
上述无论是 translationX 还是 scrollX 等引起的 view 变化,都不能改变 View 的定位(left,right,top,bottom 值),而如果更改 margin 的值,则可以更改 View 的定位。
Window 和 WindowManager
WindowManager.LayoutParams.flags 有三个常用选项:
- WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL // 只处理 Window 区域内的点击事件,之外的交给其他 Window 处理
- WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE // 不接受输入事件,不获取焦点,同时会开启 FLAG_NOT_TOUCH_MODAL,最终事件会传递给下层具有焦点的 Window
- WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED // 让 Window 显示在锁屏界面上
WindowManager.LayoutParams.type 代表 Window 的类型 (三个):
- 应用 Window 对应一个 Activity。
z-ordered
:1~99 - 子 Window 不能单独存在,附属在特定的父 Window 中,如 Dialog。
z-ordered
:1000~1999 - 系统 Window 需要系统权限,如 Toast,状态栏等。
z-ordered
:2000~2999
z-ordered
值大的 Window 会覆盖掉低值的 Window。
TODO
recycleview 滑动
ItemTouchHelper 源码分析 https://www.jianshu.com/p/130fdd755471
嵌套滑动 https://blog.csdn.net/qq_15807167/article/details/51637678
https://www.cnblogs.com/dasusu/p/9159904.html滑动展示删除按钮 https://www.jianshu.com/p/9bfed6e127cc >> 对应的 demo:https://github.com/jixiaoyong/DiyWidget/blob/master/diy-widget/src/main/java/cf/android666/applibrary/SwipeRecyclerView.kt