一、View

1.1、View 概述

视图 (View) 是一个容器,专门负责布局。表现为显示在屏幕上的各种视图,如 TextView、LinearLayout 等。

1.2、View 分类

View 主要分为两类,具体如下表格所示:类别示例特点单一视图即一个 View,如 TextView、EditText不包含子View

视图组即多个 View 组成的 ViewGroup,如 RelativeLayout包含子View

1.3、View 类简介View 类是 Android 中各种组件的基类;

View 的构造函数有四个,具体如下所示:public View(Context context) {

}

public View(Context context, @Nullable AttributeSet attrs) {

this(context, attrs, 0);

}

public View(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {

this(context, attrs, defStyleAttr, 0);

}

public View(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {

}

源码中 View 的构造函数

通过源码的注释我们可以看出:如果 View 是在 Java 代码里面 new 的,则调用第一个构造函数-->View(Context);

如果 View 是在 xml 里声明的,则调用第二个构造函数-->View(Context, AttributeSet)。

二、Android 坐标系

Android 坐标系和数学上的坐标系是不一样的,定义如下:屏幕的左上角为坐标原点。

向右为 x 轴增大方向。

向下为 y 轴增大方向。

具体如下图所示:

三、View 的位置

View 的位置是相对于父控件而言的,由 4 个顶点确定,如下图 A、B、C、D 所示:

确定 View 的位置有四个参数,分别是 Top、Bottom、Left、Right:Top:子 View 左上角距父 View 顶部的距离。

Left:子 View 左上角距父 View 左侧的距离。

Bottom:子 View 右下角距父 View 顶部的距离。

Right:子 View 右下角距父 View 左侧的距离

具体如下图所示:

四、获取 View 位置的方式

View 的位置是通过 getTop()、getLeft()、getBottom()、getRight() 函数进行获取的。

这里我写了一个小例子来演示这四个方法,如下所示:(获取内部子 View 的位置)

因为是为了演示 View 的位置,所有我这里用绝对布局,并且大小的单位都是用 px,具体布局如下所示:<?xml version="1.0" encoding="utf-8"?>

xmlns:app="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

tools:context=".MainActivity">

android:id="@+id/rl_1"

android:layout_width="600px"

android:layout_height="600px"

android:layout_x="200px"

android:layout_y="200px"

android:background="@color/colorPrimaryDark">

android:id="@+id/view"

android:layout_width="300px"

android:layout_height="300px"

android:layout_centerInParent="true"

android:background="@color/colorAccent" />

我们现在用四个方法来获取一下 View 的位置,具体代码如下所示:public class CoordinateActivity extends AppCompatActivity {

private View mView;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_coordinate);

rl1 = findViewById(R.id.rl_1);

mView = findViewById(R.id.view);

}

@Override

protected void onResume() {

super.onResume();

new Handler().postDelayed(new Runnable() {

@Override

public void run() {

MyLogUtils.i(mView.getTop() + "--Top --mView");

MyLogUtils.i(mView.getBottom() + "--Bottom --mView");

MyLogUtils.i(mView.getLeft() + "--Left --mView");

MyLogUtils.i(mView.getRight() + "--Right --mView");

MyLogUtils.i(mView.getX() + "--X --mView");

MyLogUtils.i(mView.getY() + "--Y --mView");

}

}, 200);

}

}

打印结果如下所示:

最外层紫色的 View 的坐标是(200,200),大小是 600px,在它内部,有一个大小为 300px 的子 View 位于其中心位置,所以上述打印结果是完全正确的。

注意:我这里调用 getTop() 等方法是在 onResume() 里面,并且延时了 200ms,是因为如果不延迟直接调用,会出现 View 还没有绘制完,所以获取到的位置都是 0,所以就用最简单的延迟处理了一下(这里的处理方法有很多,比如 View.post() 等);

getX() 和 getY() 的意思是获取子 View 相对父容器的坐标,所以这里结果都是 150。

android view取坐标点,Android 获取子 View 的位置及坐标的方式相关推荐

  1. android 添加子view,Android基于Window.ID_ANDROID_CONTENT给定id添加子View

    Android基于Window.ID_ANDROID_CONTENT给定id添加子View 这一技术特点在一些视频播放器中比较有用. 例如代码: package zhangphil.demo; imp ...

  2. ViewPager的使用及获取子view控件的操作(inflate)

    Step 1: 布局文件中添加viewpager和切换页面button <span style="font-size:18px;"><RelativeLayout ...

  3. 爬取的网页,获取子元素内容的方法

    今天练习网络爬虫,爬取豆瓣电影Top 250,其中每部电影有排名.评分.电影名.导演等信息,分布在不同的标签下面,而每部电影的所有信息都在一个大的<div>标签下,因此需要获取子元素的内容 ...

  4. 【原转】使用获取subview获取子view

    通常我们在view层级里面对subView的操作可以通过两种方式:1.保留一个subview的引用,然后在类中通过该引用对该subview 进行操作,但是要注意在适当的位置添加内存维护的代码,退出前手 ...

  5. 获取鼠标点击位置的坐标

    获取点击的坐标有三种情况 获取在可视区域的坐标 获取在文档页面的坐标 获取在电脑屏幕的坐标 一:获取在可视区域的坐标 e.clientX  : 获取距离页面左边的距离 e.clientY :距离页面可 ...

  6. Android 图片设置坐标点

    plugins {id 'com.android.application'id 'kotlin-android'id 'kotlin-android-extensions'//添加扩展 } class ...

  7. Android Activity使用OnGesture事件以后与子View的Click事件冲突解决办法

    在实现多个图片的切换功能时,使用到了手势事件功能,但同时需要给图片增加一个单击事件去执行其它功能.增加单击事件后,图片会截取到touchdown并不再往下传递,导致手势事件失效,这里给出了其解决办法, ...

  8. Android ViewGroup代码里addView时,子View显示异常

    LinearLayout.LayoutParams lp= new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,View ...

  9. android爬取视频播放地址,Android 视频中抓取图像 - MediaMetadataRetriever

    最近在side project中遇到了需要从视频中抓取多张图片的需求.安卓已经提供了从视频获取预览图片的ThumbnailUtils, 但此类不能根据timestamp获取bitmap. 以下记录自己 ...

最新文章

  1. ios mysql 修改数据,iOS数据库FMDB--增删改查(模糊查询)实写记录
  2. 李春平:钱不是奥黛莉赫本给的
  3. PHP系统编程--01.多进程与多线程
  4. Python面试题大全(四):数据库篇
  5. 高效的半同步/半异步模式的实现
  6. 微软服务器虚拟化-Hyper-v详解
  7. [存档]获取通讯录信息并写到SD卡上
  8. leetcode二叉树 找路径_LeetCode0257: 二叉树的所有路径
  9. android对象关系映射框架ormlite之一对多(OneToMany)
  10. Linux内核邮件列表发送和回复格式研究
  11. 大数据的可视化:bigvis包的简单尝试
  12. storm的优化以及雪崩问题
  13. 为什么DNN的SectionHead Control图片无法显示,也无法折叠
  14. AOSP>设计>测试>(第三节)兼容性测试套件CTS
  15. 实现网络IPv6平滑演进的DS-Lite CGN技术
  16. 3.关于运动控制芯片
  17. Java 金额转换 阿拉伯数字金额转换成汉字大写金额
  18. 不要在本该奋斗的年纪选择了安逸
  19. 大数据系列之知识点总结和企业级游戏行业架构设计
  20. TM4C KEIL模板建立

热门文章

  1. 买淘宝特价版,产业升级的证明
  2. 基于链表的快速排序C语言,双向链表的快速排序算法,编译通过,程序会崩溃,求助一下各位...
  3. 怎么判断前轮左右的位置_汽车上主要传感器的安装位置,你知道多少?
  4. addonsmaker怎么制作_addonsmaker
  5. mysql 给字段添加索引_怎么给mysql表的字段添加索引和查询索引呢
  6. NatApp 内网穿透工具简单使用介绍说明
  7. 【Python教程】 print 和return 的区别
  8. Python中self的用法
  9. Python使用正则表达式分割字符串
  10. Python 函数式编程指北,不只是面向对象哦