Android进阶笔记18:Android 获取Button的高度、宽度、坐标值
1. 问题
如何获取一个控件的长和高,相信很多朋友第一眼看见这个问题都会觉得很简单,直接在onCreate里面调用getWidth、getMeasuredWidth不就可以获得了吗,但是,事实上是并没有简单的,不信的话,你可以去试一下,在onCreate里面,你是无法获得长宽值的,始终为0。
package com.himi.test; import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.ViewTreeObserver;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.widget.Button; public class MainActivity extends Activity { private Button button; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); button = (Button) findViewById(R.id.button);
Log.e("Test", "getWidth宽度:" + button.getWidth());
Log.e("Test", "getHeight高度:" + button.getMeasuredWidth());
} }
程序运行结果如下:

2. 原因
这是为什么呢,其实熟悉view绘制流程的朋友应该一眼就看出来了,在onCreate中,我们的控件其实还并没有画好,换句话说,等onCreate方法执行完了,我们定义的控件才会被度量(measure),所以我们在onCreate方法里面通过view.getHeight()获取控件的高度或者宽度肯定是0。
3. 获取Button的高度、宽度、坐标值:
(1)利用延时(保证onCreate先完成):
package com.himi.test; import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.ViewTreeObserver;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.widget.Button; public class MainActivity extends Activity { private Button button; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); button = (Button) findViewById(R.id.button);
Log.e("Test", "getWidth宽度:" + button.getWidth());
Log.e("Test", "getHeight高度:" + button.getMeasuredWidth()); new Thread() { @Override
public void run() {
synchronized (this) {
try {
wait(1000);// 1秒
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} Log.e("Test", "高度:" + button.getHeight());
Log.e("Test", "宽度:" + button.getWidth()); Log.e("Test", "左上角坐标x:" + button.getLeft());
Log.e("Test", "左上角坐标y:" + button.getTop()); Log.e("Test", "右下角坐标x:" + button.getRight());
Log.e("Test", "右下角坐标y:" + button.getBottom()); }
}.start(); } }
运行程序如下:

(2)自己使用API测量:
package com.himi.test; import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button; public class MainActivity extends Activity { private Button button; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); button = (Button) findViewById(R.id.button); int w = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
int h = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
button.measure(w, h); int height = button.getMeasuredHeight();
int width = button.getMeasuredWidth(); Log.e("Test", "宽度:" + width);
Log.e("Test", "高度:" + height); Log.e("Test", "左上角坐标x:" + button.getLeft());
Log.e("Test", "左上角坐标x:" + button.getTop()); Log.e("Test", "左上角坐标x:" + button.getRight());
Log.e("Test", "左上角坐标x:" + button.getBottom()); } }
运行程序如下:
(3)我们需要注册一个ViewTreeObserver的监听回调,这个监听回调OnGlobalLayoutListener,就是全局的布局改变监听器,所以是最推荐使用的:
ViewTreeObserver:这是一个注册监听视图树的观察者(observer),在视图树种全局事件改变时得到通知。这个全局事件不仅还包括整个树的布局,从绘画过程开始,触摸模式的改变等。ViewTreeObserver不能够被应用程序实例化,因为它是由视图提供,参照getViewTreeObserver()以查看更多信息。
package com.himi.test; import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.ViewTreeObserver;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.widget.Button; public class MainActivity extends Activity { private Button button; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); button = (Button) findViewById(R.id.button); final ViewTreeObserver vto = button.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
button.getViewTreeObserver().removeGlobalOnLayoutListener(this);
int height = button.getMeasuredHeight();
int width = button.getMeasuredWidth(); Log.e("Test", "高度:" + height);
Log.e("Test", "宽度:" + width); Log.e("Test", "左上角坐标x:" + button.getLeft());
Log.e("Test", "左上角坐标y:" + button.getTop()); Log.e("Test", "右下角坐标x:" + button.getRight());
Log.e("Test", "右下角坐标y:" + button.getBottom()); }
});
} }
部署程序到手机上,如下:

Android进阶笔记18:Android 获取Button的高度、宽度、坐标值的更多相关文章
- Android进阶笔记18:选用合适的IPC方式
1. 相信大家都知道Android进程间通信方式很多,比如AIDL.Messenger等等,接下来我就总结一下这些IPC方式优缺点. 2. IPC方式的优缺点和适用场景 3. 附加:使用Intent实 ...
- Android进阶笔记:Messenger源码详解
Messenger可以理解为一个是用于发送消息的一个类用法也很多,这里主要分析一下再跨进程的情况下Messenger的实现流程与源码分析.相信结合前面两篇关于aidl解析文章能够更好的对aidl有一个 ...
- Android进阶笔记:AIDL内部实现详解 (二)
接着上一篇分析的aidl的流程解析.知道了aidl主要就是利用Ibinder来实现跨进程通信的.既然是通过对Binder各种方法的封装,那也可以不使用aidl自己通过Binder来实现跨进程通讯.那么 ...
- 我的Android进阶之旅------>如何获取系统中定义了那些权限
在Window控制台中输入如下命令可以看到Android系统中列出的所有权限(如果自定义权限注册成功,在这里也会找到这些自定义的权限) adb shell pm list permissions C: ...
- 我的Android进阶之旅------>Android疯狂连连看游戏的实现之加载界面图片和实现游戏Activity(四)
正如在<我的Android进阶之旅------>Android疯狂连连看游戏的实现之状态数据模型(三)>一文中看到的,在AbstractBoard的代码中,当程序需要创建N个Piec ...
- 我的Android进阶之旅------>Android疯狂连连看游戏的实现之开发游戏界面(二)
连连看的游戏界面十分简单,大致可以分为两个区域: 游戏主界面区 控制按钮和数据显示区 1.开发界面布局 本程序使用一个RelativeLayout作为整体的界面布局元素,界面布局上面是一个自定义组件, ...
- 我的Android进阶之旅------>Android颜色值(#AARRGGBB)透明度百分比和十六进制对应关系以及计算方法
我的Android进阶之旅-->Android颜色值(RGB)所支持的四种常见形式 透明度百分比和十六进制对应关系表格 透明度 十六进制 100% FF 99% FC 98% FA 97% F7 ...
- 我的Android进阶之旅------>Android利用温度传感器实现带动画效果的电子温度计
要想实现带动画效果的电子温度计,需要以下几个知识点: 1.温度传感器相关知识. 2.ScaleAnimation动画相关知识,来进行水印刻度的缩放效果. 3.android:layout_weight ...
- 我的Android进阶之旅------>Android实现用Android手机控制PC端的关机和重启的功能(三)Android客户端功能实现
我的Android进阶之旅------>Android实现用Android手机控制PC端的关机和重启的功能(一)PC服务器端(地址:http://blog.csdn.net/ouyang_pen ...
随机推荐
- css3如何实现圆角边框
圆角边框是css3新增属性,在圆角边框出现之前,前端开发有的采用整块的圆角图片作为背景,有的采用小的圆角图片分别放在元素的四角,非常麻烦,灵活性差,也达到降低了网站的整体性能,而圆角边的出现则降低了开 ...
- 鼓捣phantomjs,做ajax网站的信息采集
版权所有:http://www.cnblogs.com/zeusro/ 引用不给稿费的,切你jj 准备工作: 1phantomjs的安装 2 phantomjs环境变量的配置 需求: 采集手机淘宝某店 ...
- IDEA 导出maven项目所有的依赖包到指定的目录
问题产生: 需要把一个maven工程调整结构,部署到一个新环境中,需要把依赖的jar包,单独打到一个目录中. 解决方案: 需要两步便可以copy到指定的目录中. 第一步: 找到maven projec ...
- MySQL 中文未正常显示
关于MySQL中文乱码问题 最近发现,在MySQL的dos客户端输出窗口中查询表中的数据时,表中的中文数据都显示成乱码: 之所以会显示乱码,就是因为MySQL客户端输出窗口显示中文时使用的字符编码不对 ...
- jquery appaend元素中id绑定事件失效问题
1. 在jquery中append元素,如果该元素中有id值并且绑定事件,那么该id事件会失效,必须刷新一下才能使用. 2.解决办法: 举例:如果在一个<div class="titl ...
- css3 3d正反面翻转
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- opencv3.2.0图像处理之中值滤波medianBlur API函数
/*中值滤波:medianBlur函数是非线性滤波 函数原型:void medianBlur(inputArray src,OutputArray dst,int ksize) 参数详解: input ...
- GridView视图(BaseAdapter)
效果图:
- idea 忽略显示文件
最后填写的时候,参考原有参数,1.在末尾加分号2.形式为*.xxx
- Eclipse 校验取消
eclipse Multiple annotations found at this line错误,eclipse开发过程中,一些XML配置文件会报错,但是这些其实不是错,飘红的原因是因为eclips ...