浅析Android View(一)

本文深入解析了Android中View的位置信息,包括left、top、right、bottom等属性的意义及使用场景,并通过实例演示了如何通过getX()等方法改变View的位置。

Android中的View是Android开发中一个非常重要的知识点,系统提供的基础控件TextView,Button,ListView,ViewGroup等都是基于View。但是很多时候的UI效果,利用系统的提供的基本组件无法满足我们的需求,这时候就需要我们自己自定义组件,然而想要随心所遇的写出满足我们需求的组件,却不是那么容易,但也没大家想象的那么难,只要我们掌握的View的基本原理和相关知识,我们就能随心所欲的写出自己的想要的控件效果。
一、View的位置信息
View就像我们app的衣服(这个比喻或许有些不太恰当,View的作用远不与此),我们首先要搞清楚View的相关位置信息,超人的内裤外穿可不是所有人都能hold住的。我先来看View的四个基本位置信息left、right、top、bottom
这里写图片描述
View提供了分别提供了getLeft()、getRight、getRight()、getBottom()四个方法获取对于的信息。除此之外3.0之后View还提供了四个比较重要的位置参数信息,X、Y、translationX、translationY,和基本位置信息一样,也提供了get/set方法。接下来我们就详细分析一下几个参数的作用。
先来说下left、top、bottom、right,在任玉刚《Android开发艺术探索中》是这样描述的:View的位置信息主要由它的四个顶点来决定(这句话有待分析,下面会再讲到),分别对应于View的四个属性:top、left、right、bottom,其中top和left是View的左上角坐标,right和bottom是右下角坐标。这些坐标都是相对于父容器来说的,因此说它是一种相对坐标。这里图上也标注出来了,应该不难理解。
X、Y也比较好理解,是View左上角在父容器中的坐标(在View没有平移的情况下X=left,Y=top)。
translationX,translationY则是View当前位置相对于初始化位置的偏移量,也就是说,如果你的View创建之后,没有进行过相关平移操作,translationX和translationY的值是始终为0的。
我们说回上面提到的那个问题,“View的位置信息主要由它的四个顶点来决定left、top、bottom、right”,为什么说这句话有问题呢?我们来看一段代码

    private void initViews() {
        tvTest = (TextView) findViewById(R.id.tv_test);
        tvTest.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        print();
        tvTest.setX(100);
        System.out.println("==============");
        print();

    }
    private void print() {
        int width = tvTest.getWidth();
        int height = tvTest.getHeight();
        float translationX = tvTest.getTranslationX();
        float translationY = tvTest.getTranslationY();
        float x = tvTest.getX();
        float y = tvTest.getY();
        int left = tvTest.getLeft();
        int top = tvTest.getTop();
        int bottom = tvTest.getBottom();
        int right = tvTest.getRight();

        System.out.println("width" + width);
        System.out.println("height" + height);
        System.out.println("translationX" + translationX);
        System.out.println("translationY" + translationY);
        System.out.println("x" + x);
        System.out.println("y" + y);
        System.out.println("left" + left);
        System.out.println("top" + top);
        System.out.println("bottom" + bottom);
        System.out.println("right" + right);
    }

布局文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:id="@+id/tv_test"
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:layout_marginLeft="100dp"
        android:layout_marginTop="100dp"
        android:background="#00ff00"
        android:text="@string/hello_world" />

</RelativeLayout>

代码很简单,实例化一个View控件,添加一个点击事件,打印出初始化时的位置坐标信息,修改View的X值,再次打印View的位置信息,打印结果如下:
这里写图片描述
运行结果View位置发生了改变,然而top、left、right、bottom的值并未发生改变,仅仅只是translationX和X的值发生了变化。
总结:对于初学者个人建议,可以简单理解这几个参数,top、left、right、bottom主要负责View大小的控制,通过源码可以看到

     public final int getWidth() {
        return mRight - mLeft;
    }
     public final int getHeight() {
        return mBottom - mTop;
    }

View的宽高是有top、left、right、bottom参数决定的
而X,Y和translationX,和translationY则负责View位置的改变。

本书是Android进阶类书籍,采用理论、源码和实践相结合的方式来阐述高水准的Android应用开发要点。本书从三个方面来组织内容。第,介绍Android开发者不容易掌握的些知识点;第二,结合Android源代码和应用层开发过程,融会贯通,介绍些比较深入的知识点;第三,介绍些核心技术和Android的性能优化思想。 第1章 Activity的生命周期和启动模式 1 1.1 Activity的生命周期全面分析 1 1.1.1 典型情况下的生命周期分析 2 1.1.2 异常情况下的生命周期分析 8 1.2 Activity的启动模式 16 1.2.1 Activity的LaunchMode 16 1.2.2 Activity的Flags 27 1.3 IntentFilter的匹配规则 28 第2章 IPC机制 35 2.1 Android IPC简介 35 2.2 Android中的多进程模式 36 2.2.1 开启多进程模式 36 2.2.2 多进程模式的运行机制 39 2.3 IPC基础概念介绍 42 2.3.1 Serializable接口 42 2.3.2 Parcelable接口 45 2.3.3 Binder 47 2.4 Android中的IPC方式 61 2.4.1 使用Bundle 61 2.4.2 使用文件共享 62 2.4.3 使用Messenger 65 2.4.4 使用AIDL 71 2.4.5 使用ContentProvider 91 2.4.6 使用Socket 103 2.5 Binder连接池 112 2.6 选用合适的IPC方式 121 第3章 View的事件体系 122 3.1 View基础知识 122 3.1.1 什么是View 123 3.1.2 View的位置参数 123 3.1.3 MotionEvent和TouchSlop 125 3.1.4 VelocityTracker、GestureDetector和Scroller 126 3.2 View的滑动 129 3.2.1 使用scrollTo/scrollBy 129 3.2.2 使用动画 131 3.2.3 改变布局参数 133 3.2.4 各种滑动方式的对比 133 3.3 弹性滑动 135 3.3.1 使用Scroller 136 3.3.2 通过动画 138 3.3.3 使用延时策略 139 3.4 View的事件分发机制 140 3.4.1 点击事件的传递规则 140 3.4.2 事件分发的源码解析 144 3.5 View的滑动冲突 154 3.5.1 常见的滑动冲突场景 155 3.5.2 滑动冲突的处理规则 156 3.5.3 滑动冲突的解决方式 157 第4章 View的工作原理 174 4.1 初识ViewRoot和DecorView 174 4.2 理解MeasureSpec 177 4.2.1 MeasureSpec 177 4.2.2 MeasureSpec和LayoutParams的对应关系 178 4.3 View的工作流程 183 4.3.1 measure过程 183 4.3.2 layout过程 193 4.3.3 draw过程 197 4.4 自定义View 199 4.4.1 自定义View的分类 200 4.4.2 自定义View须知 201 4.4.3 自定义View示例 202 4.4.4 自定义View的思想 217 第5章 理解RemoteViews 218 5.1 RemoteViews的应用 218 5.1.1 RemoteViews在通知栏上的应用 219 5.1.2 RemoteViews在桌面小部件上的应用 221 5.1.3 PendingIntent概述 228 5.2 RemoteViews的内部机制 230 5.3 RemoteViews的意义 239 第6章 Android的Drawable 243 6.1 Drawable简介 243 6.2 Drawable的分类 244 6.2.1 BitmapDrawable 244 6.2.2 ShapeDrawable 247 6.2.3 LayerDrawable 251 6.2.4 StateListDrawable 253 6.2.5 LevelListDrawable 255 6.2.6 TransitionDrawable 256 6.2.7 Ins
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值