美文网首页
是Android的自定义View-基础知识-坐标系

是Android的自定义View-基础知识-坐标系

作者: redrain39 | 来源:发表于2020-12-23 13:16 被阅读0次

    坐标系

    屏幕坐标系与数学坐标系的区别

    由于移动设备一般定义屏幕左上角为坐标原点,向右为x轴增大方向,向下为y轴增大方向, 所以在手机屏幕上的坐标系与数学中常见的向右为x轴增大方向,向上为y轴增大方向的坐标系是稍微有点差别的,详情如下:
    (PS:其中的∠a 是对应的,注意y轴方向!)

    坐标系对比

    右边的是手机屏幕上实际的坐标系。

    Android中的坐标系统

    在android中,屏幕、ViewGroup、View都有各自的参考坐标系,它们的坐标系和上文中所述一样是x轴向右,y轴向下来指导相关绘制。

    View的位置描述

    了解了Android系统的屏幕坐标系组成,接下来就可以来看看控件在坐标系中是如何被定位的:

    首先一个控件在坐标中肯定是可以通过x、y来进行定义的,那么对于一个控件来说必然会处在一个参考坐标系里,这个参考坐标系就是它的父控件,确定了参考坐标系,那么就可以对控件进行位置定义,但是控件是一个方形区域,怎么来定义这个区域呢?

    Android中通过对控件的左上角作为控件的参考点进行控件的位置定义,具体提供了如下的方法来进行描述:

    view.width              // View的宽度
    view.height             // View的高度
    
    view.x                  // View左上角相对于ViewGroup左上角的X坐标位置
    view.y                  // View左上角相对于ViewGroup左上角的Y坐标位置
    view.z                  // 相对于屏幕的Z位置
    
    view.left               // View左边相对于ViewGroup左边的距离
    view.top                // View上边相对于VIewGroup上边的距离
    view.right              // View右边相对于ViewGroup左边的距离
    view.bottom             // View底边相对于ViewGroup上边的距离
    view.elevation          // View的高度
    
    view.translationX       // 在滑动过程中,View当前位置的最左边和这个View原始位置的最左边的距离
    view.translationY       // 在滑动过程中,View当前位置的最上边和这个View原始位置的最上边的距离
    view.translationZ       // 在动画过程中,View当前位置的Z轴高度和这个View原始Z轴高度的距离
    

    可以发现View的位置描述是相对于其在的ViewGroup的,下面通过一张图来更加直观地感受一下这些位置描述的属性:

    相对位置描述

    因为translation的相关属性不是很好表示,这里先给出实际在view进行动画时的计算公式:

    x = left + translationX;
    y = top + translationY;
    z = elevation + translationZ;
    

    具体的内容,我们会在动画相关的章节详细介绍,这里先做一个了解。

    触摸点的位置描述

    Android程序员知道触摸需要重写onTouch方法,在onTouch方法中包含有一个MotionEvent,它提供了对于触摸点的位置描述:

    event.x         // 触摸点相对于View的X坐标位置
    event.y         // 触摸点相对于View的Y坐标位置
    event.rawX      // 触摸点相对于屏幕最左侧的距离
    event.rawY      // 触摸点相对于屏幕最上侧的距离
    

    通过图例来更加直观地感受一下:


    触摸点相对位置

    View相对屏幕的距离

    下面介绍三种获取View距离屏幕距离的方法,具体实现方法如下:

    getLocationInWindow

    val position = IntArray(2)
    viewGroup.getLocationInWindow(position)
    Log.d("coordinate-screen", "x: " + position[0])
    Log.d("coordinate-screen", "y: " + position[1])
    

    getLocationOnScreen

    val position = IntArray(2)
    viewGroup.getLocationOnScreen(position)
    Log.d("coordinate-screen", "x: " + position[0])
    Log.d("coordinate-screen", "y: " + position[1])
    

    getGlobalVisibleRect

    val rect = Rect()
    viewGroup.getGlobalVisibleRect(rect)
    Log.d("coordinate-screen", "x: " + rect.left.toString())
    Log.d("coordinate-screen", "y: " + rect.top.toString())
    

    总结

    以上就是关于坐标系和View在坐标系中的位置描述方式,如果有什么讲解错误之处或是有什么疑问,欢迎留言讨论。

    相关文章

      网友评论

          本文标题:是Android的自定义View-基础知识-坐标系

          本文链接:https://www.haomeiwen.com/subject/ckbynktx.html