① android导航栏高度是多少
屏幕高度都是包括了状态栏和导航栏的高度的
2.获取控件尺寸
如果我们在onCreate()方法里直接调用getWidth()、getMeasuredWidth()获得的尺寸为0,这是由于在onCreate()中,我们的控件还没有画好,等onCreate()执行完了,我们的控件才被测量出来,我们可以注册一个监听器,用来监听测量结果
ViewTreeObserver vto = mButton.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override
public void onGlobalLayout() { //移除上一次监听,避免重复监听
mButton.getViewTreeObserver().removeGlobalOnLayoutListener(this); //在这里调用getHeight()获得控件的高度
buttonHeight = mButton.getHeight();
}
});1234567891011
3.获得状态栏/通知栏的高度
public static int getStatusBarHeight(Context context){
Class<?> c = null;
Object obj = null;
Field field = null; int x = 0, statusBarHeight = 0; try {
c = Class.forName("com.android.internal.R$dimen");
obj = c.newInstance();
field = c.getField("status_bar_height");
x = Integer.parseInt(field.get(obj).toString());
statusBarHeight = context.getResources().getDimensionPixelSize(x);
} catch (Exception e1) {
e1.printStackTrace();
} return statusBarHeight;
}12345678910111213141516
4.获得导航栏高度
public int getNavigationBarHeight(Activity activity) {
Resources resources = activity.getResources(); int resourceId = resources.getIdentifier("navigation_bar_height","dimen", "android"); //获取NavigationBar的高度
int height = resources.getDimensionPixelSize(resourceId); return height;
② android 代码里怎么设置控件的宽度
在对应的控件中使用android:layout_width标签即可。
android:layout_width标签中可以使用match_parent常量使控件尺寸与其上级组件尺寸相同
可以使用wrap_content使控件尺寸刚好包裹住内容
也可以使用px(像素)、pt(磅)、dp(密度)、sp(可伸缩像素)作为单位,从而设置控件的宽度:
例如:
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="one"
android:layout_gravity="right"/>
③ 如何正确获取Android控件的高度
Android动态改变View控件大小的方法: 1、声明控件参数获取对象 LayoutParams lp; 2、获取控件参数: lp = 控件id.getLayoutParams(); 3、设置控件参数:如高度。 lp.height -= 10; 4:、使设置生效:控件id.setLayoutParams(lp); 例如如要把Imageview下移200px: ImageView.setPadding( ImageView.getPaddingLeft(), ImageView.getPaddingTop()+200, ImageView.getPaddingRight(), ImageView.getPaddingBottom());
④ android 在onCreate中获得控件的大小
这个方法并不是适合所有场景,这个方法获取的宽度是minWidth参数设置的大小和background指定背景宽度,这两个宽度的最大值,高也是如此,也就是说如果View的xml中没有两个参数中的其中一项,那么这个方法测量的宽高也是为0的,这个方法测量的并不是获取xml中设置的android:layout_height android:layout_width的值,为什么这么说了,看源码:
imageView.measure(w, h); -->调用View的measure方法-->onMeasure()方法,onMeasure源码:
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(getDefaultSize(getSuggestedMinimumWidth(),widthMeasureSpec),
getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec));
}
onMeasure->setMeasuredDimension()->getDefaultSize()>getSuggestedMinimumHeight()
这个是源码onMeasure中方法调用过程,逆向分析方法源码:
getSuggestedMinimumHeight():
protected int getSuggestedMinimumHeight() {
return (mBackground == null) ? mMinHeight : max(mMinHeight,mBackground.getMinimumHeight());
}
如果背景为空,那么就取mMinHeight的值,如果背景不为空就取max(mMinHeight,mBackground.getMinimumHeight())背景高度和mMinHeight最大值
接下来获取建议值完毕后查看getDefaultSize的源码:
//第一个参数是getSuggestedMinimumHeight方法获取的建议值 第二个参数是系统计算得出的宽高规格是MeasureSpec值,也就是measure(w,h)中的w或者h,
public static int getDefaultSize(int size, int measureSpec) {
int result = size;
//int w = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);
//规格模式不就是上面的:View.MeasureSpec.UNSPECIFIED
int specMode = MeasureSpec.getMode(measureSpec);
//规格模式不就是上面的 0
int specSize = MeasureSpec.getSize(measureSpec);
switch (specMode) {//这里是什么了?View.MeasureSpec.UNSPECIFIED理解吧
case MeasureSpec.UNSPECIFIED://
//result就是getDefaultSize要返回的值,根据switch判读getDefaultSize返回的是什么了
//不就是方法的第一个形参吗,这个形参不就是宽高建议值吗
//也就是max(mMinHeight,mBackground.getMinimumHeight());
result = size;
break;
case MeasureSpec.AT_MOST:
case MeasureSpec.EXACTLY:
result = specSize;
break;
}
return result;
}
好了,现在就是setMeasuredDimension方法了,源码:
protected final void setMeasuredDimension(int measuredWidth, int measuredHeight) {
boolean optical = isLayoutModeOptical(this);
if (optical != isLayoutModeOptical(mParent)) {
Insets insets = getOpticalInsets();
int opticalWidth = insets.left + insets.right;
int opticalHeight = insets.top + insets.bottom;
measuredWidth += optical ? opticalWidth : -opticalWidth;
measuredHeight += optical ? opticalHeight : -opticalHeight;
}
mMeasuredWidth = measuredWidth;//这个是这个方法要注意的值
mMeasuredHeight = measuredHeight;//同上
mPrivateFlags |= PFLAG_MEASURED_DIMENSION_SET;
}
这个代码好长啊,好多东西,要关注的就是注释的代码,上面要注意的两行代码有什么用了
你再看一个方法的源码你就是知道了,getMeasureWidth()与getMeasureHeight():
public final int getMeasuredWidth() {
return mMeasuredWidth & MEASURED_SIZE_MASK;
}
public final int getMeasuredHeight() {
return mMeasuredHeight & MEASURED_SIZE_MASK;
}
这两个方法不就是返回调用measure测量的宽高吗?不就是上面两行注意的代码的值吗
现在回答你的问题:
这是代码,我想问makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED)中的一个参数为什么是0,什么意思?
第一个参数本应该是系统测量该View后得到的规格值(MeasureSpec),本来这个measure是由系统测量完宽高后自动调用,我们这里只是做了系统即将要做的事情而已,那么这个参数为什么是0了,既然我们要通过这个方法测量View的宽高,不就是怕系统还没有自动调用这个方法前调用getMeasureWidth/Height方法而没法获得导致取值为0 ,也就是我们默认调用这个方法就是系统没有对该View绘制,就直接调用了measure方法,所以也就是宽高为0咯,其实这
makeMeasureSpec的第一个参数设置什么都无所谓啦,因为最后取得值也不是第一个参数设置的值,我觉得我的表达好绕啊,不过要是你对measure的绘制机制的源码很熟悉的话,应该是没问题的,这里我推荐你去看(谷歌的小弟)csdn的博客里面有完整的源码分析,你要以前看的不是很懂,去看看他写的博客应该会有点启发
⑤ Android编程,有两个按钮控件,我想让一个占屏幕高度的90%,一个占10%,怎么实现
/*********** 以下是用来控制图片位置的 *******/
//获取屏幕尺寸
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
int widthPixels = dm.widthPixels;
//获取控件尺寸
LayoutParams params = (LayoutParams) imageView_base.getLayoutParams();
params.height = (int) (widthPixels * 0.57);
params.width = widthPixels;
//重设
imageView_base.setLayoutParams(params);
你参考参考我的代码,希望能帮到你
⑥ android 动态生成控件,怎么设置控件的大小
一、方法
使用getLayoutParams() 和setLayoutParams()方法
二、示例代码
LinearLayout.LayoutParams linearParams = (LinearLayout.LayoutParams) aaa.getLayoutParams();
// 取控件aaa当前的布局参数
linearParams.height = 365; // 当控件的高强制设成365象素
aaa.setLayoutParams(linearParams); // 使设置好的布局参数应用到控件aaa
三、原理
a)getLayoutParams()和setLayoutParams()都是控件基类view的public方法,在外部也可以直接调用。
b)由于LayoutParams一般是在加入容器中设置的,所以容易混淆所指定的布局属性究竟是保存在容器中,还是控件本身的属性,答案是控件本身。但是在设置时还是要注意布局属性与容器种类密切相关。
⑦ android 自定义view怎样获取长和宽
你把获取的宽高的代码放到onDraw里就对了,因为View在构造函数初巧源始化并未布局处理,此时宽高均为0,待所有控件初始化完毕后,信历由上级容器对内部各控件进行布局,此时控件才会具有位置与滑宽搜大小属性