继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

深入理解Android View(一)

Coley_5
关注TA
已关注
手记 86
粉丝 8548
获赞 6550

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位置的改变。
本文出自慕课网,转载请注明出处,侵权必究。
打开App,阅读手记
14人推荐
发表评论
随时随地看视频慕课网APP

热门评论

我看了源码是final呀

看源码,发现getWidth和getHeight都是final,所以mRight、mLeft、mBottom、mTop绝对是final类型,也就是说这四个参数保存初始化的view位置,X、Y、translationX、translationY保存即时view的即时位置。

查看全部评论