導航:首頁 > 操作系統 > android獲取控制項尺寸

android獲取控制項尺寸

發布時間:2023-08-21 21:54:27

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

閱讀全文

與android獲取控制項尺寸相關的資料

熱點內容
聚合支付加密幣 瀏覽:310
蜜源app是什麼時候創立的 瀏覽:704
計算機專業學51單片機 瀏覽:208
程序員不接受反駁 瀏覽:294
微軟自帶的壓縮軟體 瀏覽:286
中國玩家在日本伺服器做什麼 瀏覽:48
12864和單片機 瀏覽:898
25匹空調壓縮機 瀏覽:649
adkandroid下載 瀏覽:308
如何在蘋果電腦上裝python 瀏覽:327
哪個app的跑步訓練內容最豐富 瀏覽:583
廣訊通怎麼刪除文件夾 瀏覽:206
解壓的視頻化妝品 瀏覽:674
易語言新進程監視源碼 瀏覽:941
turbo碼解碼演算法 瀏覽:956
stc11f16xe單片機 瀏覽:282
linuxupdate命令行 瀏覽:578
pdf轉化成wps 瀏覽:765
php拋出錯誤 瀏覽:159
買車看車用什麼app 瀏覽:656