您的位置:首页 > 移动开发 > Android开发

浅析Android View(一)

2016-01-07 16:37 786 查看
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位置的改变。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: