- 浏览: 265504 次
- 性别:
- 来自: 济南
文章分类
最新评论
一。
也許
很多童鞋對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; /** Called when the activity is first created. */ @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; /** Called when the activity is first created. */ @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()的位置也是很重要的。
三.請尊重原創,轉載請註明這是http://hi.baidu.com/ljlkings/home
的空間。
发表评论
-
android 动态时钟 附源码
2013-09-24 12:03 1216自定义View实践 例子代码 自定义动态时钟 ... -
android Dialog 背景问题
2013-08-14 11:22 1177我们在使用自定义的Dialog的时候,喜欢自己 ... -
ScrollView scrollTo 的使用 动画效果
2013-08-05 17:43 4509今天用到了ScrollView scrollTo方法 ... -
Android中View绘制优化之一---- 优化布局层次
2012-09-04 23:00 980... -
Android中View绘制优化二一---- 使用<include />标签复用布局文件
2012-09-08 13:54 976... -
Android中文件选择器的实现
2012-11-30 08:59 1087... -
【OpenCV】角点检测:Harris角点及Shi-Tomasi角点检测
2012-07-31 13:25 1496角点 特征检测与匹配 ... -
【OpenCV】边缘检测:Sobel、拉普拉斯算子
2012-08-04 13:41 1470边缘 边缘(edge)是指图像局部强度变化最显著的部分。主要 ... -
【OpenCV】Canny 边缘检测
2012-08-08 10:17 1942Canny 边缘检测算法 1986 ... -
【UML】案例分析:新型超市购物自助系统
2012-08-19 01:13 126308年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大 ... -
【数据结构】二叉树、AVL树
2012-08-21 00:30 104708年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大 ... -
【计算机图形学】基本图形元素:直线的生成算法
2012-08-23 14:02 101608年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大 ... -
【计算机图形学】基本图形元素:圆的生成算法
2012-08-27 23:06 116908年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大 ... -
【Error】远程连接凭据不工作
2012-09-02 19:51 986凭据无法工作 近来远程连接实验室的电脑,总是提示“之前用于连 ... -
【Web开发技术】德优教育管理系统
2012-09-07 23:00 90308年9月入学,12年7月毕 ... -
Android onMeasure onLayout
2012-12-20 10:21 1777开始之前不得不说到view的绘制流程,,,请参考:绘制流 ... -
Android VelocityTracker
2012-12-20 09:40 1291转自: http://blog.chinaunix.net/u ...
相关推荐
主要介绍了浅析Android中getWidth()和getMeasuredWidth()的区别 ,getMeasuredWidth()获取的是view原始的大小,getWidth()获取的是这个view最终显示的大小,具体区别介绍大家参考下本
将pdf文件转换成图片并显示在界面, 先要引用AndroidPDFViewerLibrary-master ... Bitmap image = page.getImage((int)(page.getWidth() * scale), (int)(page.getHeight() * scale), null, true, true);
mRadius = Math.max(getWidth(), getHeight()); final int count = getChildCount(); // Log.e("TAG", count + ""); int childSize = (int) (mRadius * mMaxChildDimesionRadio); int childMode = ...
canvas.drawLine(getWidth(), 0, getWidth() - 1, getWidth() - YSpac, paint);// 右边Y float yoffset = getHeight() / ylist.size(); float xoffset = (getWidth() - XSpac) / xlist.size(); // 画字 ...
主要介绍了Android 将view 转换为Bitmap出现空指针问题解决办法的相关资料,这里提供实例并提供解决办法,需要的朋友可以参考下
主要介绍了解决Bitmap通过getWidth和getHeight获取尺寸不符的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
import android.content.Context; import android.graphics.Camera; import android.graphics.Matrix; import android.util.AttributeSet; import android.view.View; import android.view.animation.Transformation...
lp.width = (int)(display.getWidth()); //设置宽度 dialog.getWindow().setAttributes(lp); 2,如何获取通知栏的高度? public int getStatusBarHeight() { int result = 0; int resourceId = getResources()....
> 很久之前写过一篇完全不同于其他长截屏方案的的博客,不过很仓促,现在重新整理一下 android长截屏beta1 miui自动滚动长截屏效果 画 给滚动控件外面嵌套一个FrameLayout(LinearLayout等也可以) 手动调用...
android Bitmap用法总结 Bitmap用法总结 1、Drawable → Bitmap public static Bitmap drawableToBitmap(Drawable drawable) { Bitmap bitmap = Bitmap .createBitmap( drawable.getIntrinsicWidth(), drawable....
android.os.Process.killProcess(android.os.Process.myPid()); } public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE);...
当我们在 onCreate() 方法中获取某个 View 组件的宽度和高度,直接调用 getWidth()、getHeight()、getMeasuredWidth()、getMeasuredHeight() 方法只会得到 0。这是什么原因呢?下面来一起看看吧 实现
本文实例讲述了Android开发实现图片平移、缩放、倒影及旋转功能的方法。分享给大家供大家参考,具体如下: 解析: 1)根据原来的图片创建新的图片 Bitmap modBm = Bitmap.createBitmap(bm.getWidth()+20, bm....
int width = this.getWidth(); int height = this.getHeight(); width = (width > height) ? height : width; height = (width > height) ? height : width; paint.setAntiAlias(true); // 设置画笔为抗...
arc_x = this.getWidth() / 2 - 25; arc_y = this.getHeight() / 2 - 25; th.start(); } public void draw() { try { canvas = sfh.lockCanvas(); if (canvas != null) { canvas.drawColor(Color.BLACK); ...
Picasso – Android系统的图片下载和缓存类库 Picasso 是Square开源的一个用于Android系统下载和缓存图片的项目。该项目和其他一些下载图片项目的主要区别之一是:使用4.0+系统上的HTTP缓存来代替磁盘缓存。 ...
import android.app.Dialog; import android.content.Context; import android.graphics.drawable.AnimationDrawable; import android.view.Gravity; import android.widget.ImageView; import android.widget....
android中图像在画布上放大缩小时,图像的边框大小没有改变! 原图如下: 放大后:原来图片的边框没有改变,位置依旧! 所以如果要放置图片的位置的话,就需要做相应的位置移动才可以! 采用如下代码(全屏放置...
057 * @param map 需要的数据,虽然key是double,但是只用于排序和显示,与横向距离无关 058 * @param totalvalue Y轴的最大值 059 * @param pjvalue Y平均值 060 * @param xstr X轴的单位 061 * @param...