zoukankan      html  css  js  c++  java
  • 【Android

      View是Android中所有控件的基类,不管是简单的Button和TextView,还是复杂的RelativeLayout和ListView,其基类都是View类;ViewGroup也继承了View类,这意味着View本身就可以代表简单的和复杂的所有控件和布局,通过这种关系,就形成了View树的结构。

      在操作View的时候,尤其是在处理自定义View的一些事件的时候,我们往往需要获取到目标View的这样或那样的参数。下面就来简单介绍一下View的各种参数及其用法。

      View有这样的一些属性:x、y、z、left、right、top、bottom、elevation、translationX、translationY、translationZ、rawX、rawY等等,下面一一介绍这些参数的意义及如何获取这些参数。

      这里需要注意一点:以下方法,如果直接在Activity的onCreate()方法中调用,则可能会返回0,这是因为在程序刚刚启动,刚刚开始绘制这个View的时候,我们就要获取这个View的各个位置参数,当然会返回0。解决方法是:在Activity的 onWindowFocusChanged() 方法中获取;或者可以新建一个线程,先 Thread.sleep() 一段时间之后,再获取这些参数。

    left、right、top、bottom、elevation

      这五个参数代表的是View的原始位置相对于其父控件边缘的距离:

    • left:目标View的最左边和这个View所在父控件的最左边的距离,通过view.getLeft()方法获取;
    • right:目标View的最右边和这个View所在父控件的最左边的距离,通过view.getRight()方法获取;
    • top:目标View的最上边和这个View所在父控件的最上边的距离,通过view.getTop()方法获取;
    • bottom:目标View的最下边和这个View所在父控件的最上边的距离,通过view.getBottom()方法获取;
    • elevation:目标View的Z轴高度和这个View所在的父控件所在的Z轴高度的距离,通过view.getElevation()方法获取(这个属性是Android 5.0之后添加的新属性)。

      left、right、top和bottom四个属性的关系如下图所示:

      注意:View的这五个属性值代表的是View的原始位置坐标值,无论这个View被移动到了什么位置,或者被缩放、旋转了多少,这五个值都是永久不变的。

    translationX、translationY、translationZ

      这三个参数代表的是在动画或者滑动View的时候,View的当前位置相对于其原始位置平移的距离:

    • translationX:在滑动过程中,View当前位置的最左边和这个View原始位置的最左边的距离,通过view.getTranslationX()方法获取;
    • translationY:在滑动过程中,View当前位置的最上边和这个View原始位置的最上边的距离,通过view.getTranslationY()方法获取;
    • translationZ:在动画过程中,View当前位置的Z轴高度和这个View原始Z轴高度的距离,通过view.getTranslationZ()方法获取(这个方法是Android 5.0之后添加的新方法)。

    x、y、z

      这三个参数代表的是View的当前位置相对于其父控件的距离:

    • x:目标View的当前位置的最左边和这个View所在父布局的最左边的距离,通过view.getX()方法获取;
    • y:目标View的当前位置的最上边和这个View所在父布局的最上边的距离,通过view.getY()方法获取;
    • z:目标View的当前位置的Z轴位置和这个View所在父布局的Z轴位置的距离,通过view.getZ()方法获取(这个方法是Android 5.0之后添加的新方法)。

      这三个参数和前面的几个参数的关系公式如下:

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

    MotionEvent相关

      MotionEvent是我们用来操作View的触摸事件的类,当我们对屏幕进行一次操作的时候,就会触发MotionEvent中的几个触摸事件:

    • ACTION_DOWN:手指刚刚触摸到屏幕时触发的事件;
    • ACTION_MOVE:手指在屏幕上移动的时候触发的事件;
    • ACTION_UP:手指从屏幕上抬起的一瞬间触发的事件。

      因此,对于我们常常做的一些操作,相应的事件触发顺序如下:

    • 点击屏幕后立刻抬起手指:DOWN -> UP
    • 滑动屏幕:DOWN -> MOVE -> ... -> MOVE -> UP

      使用MotionEvent类,我们还可以获取到触摸屏幕时View的一些位置参数:

    • x:当前触摸的位置相对于目标View的X轴坐标,通过getX()方法获取;
    • y:当前触摸的位置相对于目标View的Y轴坐标,通过getY()方法获取;
    • rawX:当前触摸的位置相对于屏幕最左边的X轴坐标,通过getRawX()方法获取;
    • rawY:当前触摸的位置相对于屏幕最上边的Y轴坐标,通过getRawY()方法获取。

    View相对屏幕的距离

      这里说的View相对屏幕的距离,是指View的左上角相对于手机屏幕左上角的坐标。可以使用以下几个方法获取:

    getLocationInWindow()

      这个方法的用法代码如下:

    int[] position = new int[2];
    view.getLocationInWindow(position);
    System.out.println("(" + position[0] + "," + position[1] + ")");

      如果当前Activity是普通的Activity,则用这个方法得到的position数组中的第二个参数(Y坐标值)表示可见的状态栏的高度 + 可见的标题栏的高度 + View上端到标题栏下端的距离

      如果当前Activity是对话框式的Activity,则Y坐标值表示可见的标题栏的高度 + View上端到标题栏下端的距离

      注意:这里的“可见”表示的是能看到的,如果一个Activity中的状态栏或标题栏被隐藏了,则其高度用0表示。

    getLocationOnScreen()

      这个方法的用法代码如下:

    int[] position = new int[2];
    view.getLocationOnScreen(position);
    System.out.println("(" + position[0] + "," + position[1] + ")");

      这个方法对Y坐标的要求和上面的方法相同。

    getGlobalVisibleRect()

      这个方法的用法代码如下:

    Rect rect = new Rect();
    view.getGlobalVisibleRect(rect);
    System.out.println("(" + rect.left + "," + rect.top + ")");

      Rect在这里的作用是“套住”这个View,其对Y坐标的要求和上面的方法相同。

  • 相关阅读:
    PCI-DSS-术语小结
    Visio快捷键-小结(Microsoft Visio绘图工具)
    vs2019快捷键-小结(C#开发工具Visio studio 2019)
    消息及时推送技术websocket
    requests爬虫get请求三部曲(快速编码)-小结
    cnblogs_client博客园客户端——雏形
    重庆购房资料
    比较2个时刻日期字串的时间差:距离现在的时间距离(不同时间格式)
    比较2个时刻日期字串的时间差
    时间戳转为日期字串
  • 原文地址:https://www.cnblogs.com/itgungnir/p/6703109.html
Copyright © 2011-2022 走看看