① 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,待所有控制項初始化完畢後,信歷由上級容器對內部各控制項進行布局,此時控制項才會具有位置與滑寬搜大小屬性