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位置的改变。

更多相关文章

  1. android 安全讲座第一层 Android(安卓)APK 签名比对,防止软件被破
  2. android 对话框弹出位置和透明度的设置
  3. Android(安卓)可拖动的悬浮按钮
  4. 对Android(安卓)canvas的一点粗浅理解
  5. Android(安卓)联系人数据库表详解
  6. Android(安卓)断点续传下载
  7. 调用Android系统设置
  8. android 查看电量情况,手机信息,电池历史记录,使用情况统计 ,wifi 使
  9. android animator 动画

随机推荐

  1. Android(安卓)用户界面---拖放(Drag and D
  2. 雷军:小米做Pad没难度 不做因Android市场
  3. 关于在Android上编写《热血传奇》的妄想
  4. 线程池.(Executors,ThreadPoolExecutor,B
  5. 超越iPhone和Android:开发者的5个新兴平台
  6. Android设计模式2--工厂方法模式
  7. android高级应用课程大纲
  8. android 系统隐藏和显示虚拟按键的几种方
  9. Android(安卓)驱动和系统开发 2. 解析模
  10. [翻译]Android单手指缩放-第一部分(Androi