View体系之View的位置与事件

View体系之View的位置与事件

本文原创,转载请注明出处。
欢迎关注我的 简书 ,关注我的专题 Android Class 我会长期坚持为大家收录简书上高质量的 Android 相关博文。

写在前面:
最近完成了开发任务,接下来工作上做一些优化和修修补补的工作就可以了,所以难得有一些完整的时间来巩固知识。我们知道基本上 RecyclerView 每个人都有接触过,但是看过源码或者理解原理的并不多,以前我们用 ListView,包括后来又出现了的 CoordinatorLayout 来完成复杂炫酷的联动效果,ConstraintLayout 来给子 View 之间添加约束。完成这些高大上功能的都是自定义 View,所以真正掌握理解自定义 View,几乎成了 Android 开发者的必备技能。所以我也通过看书和官方文档,来学习巩固这里的知识,整理成系列的文章,方便记忆和交流。

View 的概念

View 是什么?我理解 View 有两层含义。首先 View 是 Android 所有视图中顶层的基类,是一个抽象的概念。其次 View 也可以特指某一个不再可以有子 View 的 View。

如果第一次理解起来可能不太容易,不过我画了一张图,应该好理解多了。

View 树状结构

首先顶层的 View 是一个抽象概念,无论 ViewGroup(视图组,比如 RelativeLayout)还是一个具体的 View(Button TextView),他们都继承自 View。而 ViewGroup 本身可以包含很多个 ViewGroup 和 View。

View 的位置

当一个 View 摆在屏幕上时,你能想到它最基本有哪些属性?对了,就是它自身的大小和位置。

View 本身提供了一些 get set 方法,让我们获得它的成员变量,其中就包括位置的信息。

来写一个 Demo 更好的理解。

布局文件如下,非常简单:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="melo.leja.com.viewdemo.MainActivity">

    <melo.leja.com.viewdemo.DemoRelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginLeft="16dp"
        android:layout_marginTop="16dp">

        <Button
            android:id="@+id/bt_view_demo"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="16dp"
            android:layout_marginTop="16dp"
            android:text="Hello World!" />

    </melo.leja.com.viewdemo.DemoRelativeLayout>
</RelativeLayout>

MainActivity:

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        if (hasFocus) {
            initView();
        }
    }

  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值