跳至主要內容

Android 中 View 相关知识

JI,XIAOYONG...大约 3 分钟

本文为笔记性质,尚未成文。

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/130fdd755471open in new window
嵌套滑动 https://blog.csdn.net/qq_15807167/article/details/51637678open in new window
https://www.cnblogs.com/dasusu/p/9159904.htmlopen in new window
滑动展示删除按钮 https://www.jianshu.com/p/9bfed6e127ccopen in new window >> 对应的 demo:https://github.com/jixiaoyong/DiyWidget/blob/master/diy-widget/src/main/java/cf/android666/applibrary/SwipeRecyclerView.ktopen in new window

参考资料

View 滑动效果常用属性详解:scroll、translation、LayoutParamsopen in new window

文章标题:《Android 中 View 相关知识》
本文作者: JI,XIAOYONG
发布时间: 2019/03/24 12:43:21 UTC+8
更新时间: 2023/12/30 16:17:02 UTC+8
written by human, not by AI
本文地址: https://jixiaoyong.github.io/blog/posts/1b0362b.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 许可协议。转载请注明出处!
你认为这篇文章怎么样?
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v2.15.8