android view getwidth 0,Android中View.getWidth()和View.getMeasuredWidth()的区别
一。也許很多童鞋對getWidth()和getMeasuredWidth()的用法有很多的不解,這兩者之間有什麼樣的不同呢,網上也有各種不同的版本,但大多數都大同小異,從這個地方Ctrl+C,到另一個地方Ctrl+V,沒有把問題說透,也有一部分文章誤導了大家對這兩個方法的認識,我也是深受其害。這裡先糾正下面的一個版本的說法,Baidu上一搜一大堆的,可惜這種說法是錯的,所以希望大家就不要再盲目的轉載到你的空間裡:
getWidth得到是某个view的实际尺寸.
getMeasuredWidth是得到某view想要在parent view里面占的大小.
想必你也見過這樣的解釋,聽起來這樣的解釋也似雲裡霧裡,沒有把問題點透。
二。好了,錯誤的版本就不過多說了,下面對這兩個方法做一下正解,首先大家應先知道以下幾點:
1.
在一個類初始化時,即在構造函數當中我們是得不到View的實際大小的。感興趣的朋友可以試一下,getWidth()和getMeasuredWidth()得到的結果都是0.但是我們可以從onDraw()方法裡面得到控件的大小。
2. 這兩個方法所得到的結果的單位是像素即pixel.
對兩個方法做介紹:
getWidth():得到的是view在父Layout中佈局好後的寬度值,如果沒有父佈局,那麼默認的父佈局是整個屏幕。也許不好理解。通過一個例子來說明一下。
例1 :
public class Test extends Activity {
private LinearLayout mBackgroundLayout;
private TextViewTest mTextViewTest;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mBackgroundLayout = new MyLayout(this);
mBackgroundLayout.setLayoutParams(new
LinearLayout.LayoutParams(
LinearLayout.LayoutParams.FILL_PARENT,
LinearLayout.LayoutParams.FILL_PARENT));
mTextViewTest = new TextViewTest(this);
mBackgroundLayout.addView(mTextViewTest);
setContentView(mBackgroundLayout);
}
public class MyLayout extends LinearLayout{
public MyLayout(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int
b) {
// TODO Auto-generated method stub
super.onLayout(changed, l, t, r, b);
Log.i("Tag", "--------------");
View mView=getChildAt(0);
mView.measure(0, 0);
}
}
public class TextViewTest extends TextView {
public TextViewTest(Context context) {
super(context);
// TODO Auto-generated constructor stub
setText("test test ");
}
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
// measure(0, 0);
Log.i("Tag", "width: " + getWidth() + ",height: " +
getHeight());
Log.i("Tag", "MeasuredWidth: " + getMeasuredWidth()
+ ",MeasuredHeight: " + getMeasuredHeight());
}
}
}
這裡是在LinearLayout裡添加一個TextView控件,如果此時要得到對TextView獲取getWidth(),那麼是在TextView添加到Layout後再去獲取值,並不單單的是對TextView本身寬度的獲取。
getMeasuredWidth():先看一下API裡面怎麼說的
The width of this view as measured in the most recent call to
measure(). This should be used during measurement and layout
calculations only.
得到的是在最近一次調用measure()方法測量後得到的view的寬度,它僅僅用在測量和layout的計算中。
所以此方法得到的是view的內容佔據的實際寬度。
你如果想從一個最簡單的例子中的到它們的不同,下面將對上面的例子做一下修改:
public class Test extends Activity {
private TextViewTest mTextViewTest;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mTextViewTest = new TextViewTest(this);
setContentView(mTextViewTest);
}
public class TextViewTest extends TextView {
public TextViewTest(Context context) {
super(context);
// TODO Auto-generated constructor stub
setText("test test ");
}
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
measure(0, 0);
Log.i("Tag", "width: " + getWidth() + ",height: " +
getHeight());
Log.i("Tag", "MeasuredWidth: " + getMeasuredWidth()
+ ",MeasuredHeight: " + getMeasuredHeight());
}
}
}
總結(正解):
getWidth(): View在設定好佈局後整個View的寬度。
getMeasuredWidth():
對View上的內容進行測量後得到的View內容佔據的寬度,前提是你必須在父佈局的onLayout()方法或者此View的onDraw()方法裡調用measure(0,0);(measure
參數的值你可以自己定義),否則你得到的結果和getWidth()得到的結果一樣。也許我組織的不是很好,大家有什麼不清楚的地方再給我留言。關於這兩個方法的區別就是看你有沒有用measure()方法,當然measure()的位置也是很重要的。
android view getwidth 0,Android中View.getWidth()和View.getMeasuredWidth()的区别相关推荐
- android view getx 0,Android动画:解决通过View.getY()获取初始位置为0的问题
问题描述 View.getY()返回为0 问题背景 用ObjectAnimator进行平移动画的时候需要获取控件的初始位置以及结束位置,比如 ObjectAnimator animY = Object ...
- oracle 计划中的view,为何执行计划中会出现个VIEW: VM_NWVW_1 ?
为何执行计划中会出现个VIEW: VM_NWVW_1 ? 数据库中根本没有这个OBJECT. 也不象系统自己产生的! SELECT R.CREATED_OFFICE STOCK_CODE, R.CU ...
- android 模拟器 2.0,Android Studio 2.0 之 新的模拟器
上个星期,Android Studio 2.0 的稳定版终于发布了,于是我马上兴冲冲的升级了. Android Studio 2.0 最突出的主新特性有两个: Instant Run -- 即时运行, ...
- AccountManager getAccount 在Android O 8.0版本中获取为 null ?
问题 AccountManager accountManager = AccountManager.get(this);Account[] accounts = accountManager.getA ...
- 声道切换 android,[RK3288][Android6.0] Audio中的单声道到双声道的转换处理过程
Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 播放音乐是单声道,硬件用的是双声道. AudioFlinger::PlaybackThread:: ...
- android 发送按键 0,android monitor tool (8.0 模拟发送按键及触摸屏事件实现)
首先看下操作界面: 你可以可以远程控制手机,模拟发送触摸屏及按键事件 (应用场合:开发早期触摸屏还没确定及判断问题是驱动层还是framework / app 层) 先讲发送按键事件的实现(如下面是发送 ...
- android 模拟器 2.0,Android模拟神器-Genymotion2.0发布,安卓的x86模拟器
支持 Android 4.3 虚拟设备 Indie or Business license only: new remote control widget which allows you to co ...
- android retrofit 2.0,android – Retrofit 2.0 OnFailure – 原始响应
我正在使用改造来调用Web服务并且改造失败,来自'Throwable`的消息给了我 java.lang.IllegalStateException: Expected BEGIN_OBJECT but ...
- android通过代码设置铃声_Android基础(5)—自定义View
自定义View 基本认知: 虽然Android已经自带来很多强大的UI控件,但是依旧不能满足所有开发人员的需求.通常开发人员需要实现设计师精心设计的视觉效果,这样情况下可能现有的控件就不能满足需求或者 ...
最新文章
- 两大AI技术集于一身,有道词典笔3从0到1的飞跃
- Android系统匿名共享内存(Anonymous Shared Memory)C++调用接口分析(6)
- python中的reduce函数
- android view 渐变动画,Android自定义view渐变圆形动画
- mybatis sql打印输出位置
- linux usb 升级脚本,linux – 使用bash脚本更新CRON
- 数据库之间数据转换最快方法
- 什么叫POE交换机?POE交换机使用方法介绍?
- flask-01-http通信的回顾
- Android输入事件InputReader和InputDispatcher分析
- [Unity3D] DOTween和Curvy插件,以及UI-Extension
- copy的过去式_copy的过去式和用法例句
- shal+php,学习笔记---PHP中几种加密算法(MD5,shal,base64_encode等)
- mysql汉字对应字段_mysql和SqlServer 中取得汉字字段的各汉字首字母
- Matlab渐变颜色图(colormap)生成/编辑器—ColorMap
- Cisco Packet Tracer基础命令操作以及组织网络实验
- 史上最简单的rar压缩包文档解密方法,rar压缩包权限密码如何解开?
- android-设置/去除背景,透明度
- 【Web基础入门】一文搞懂HTML + CSS + JavaScript 简单了解
- 5.12四川汶川等市发生8.0级大震——国难日
热门文章
- 卡方分布分位数_卡方检验和精确概率法及两两比较
- Ollydbg使用教程学习总结(二)
- 数据结构,Java实现递归回溯,寻找出迷宫路线,解决迷宫问题
- android tcp判断服务器是否断开,Android tcp客户端连接,然后从java服务器断开连接...
- atom自动补全html代码,Atom - Emmet插件的使用详解(HTML/CSS代码自动补全)
- 开源GraphView的使用--数据统计
- php imagemagick 文档,调用ImageMagick的PHP函数中文文档
- Angular 个人深究(四)【生命周期钩子】
- WPF 实现水纹效果
- Token注解防止表单的重复提交