亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android編程獲取控件寬和高的方法總結分析

2020-04-11 11:02:01
字體:
來源:轉載
供稿:網友

本文總結分析了Android編程獲取控件寬和高的方法。分享給大家供大家參考,具體如下:

我們都知道在onCreate()里面獲取控件的高度是0,這是為什么呢?我們來看一下示例:

首先我們自己寫一個控件,這個控件非常簡單:

public class MyImageView extends ImageView {  public MyImageView(Context context, AttributeSet attrs) {    super(context, attrs);  }  public MyImageView(Context context) {    super(context);  }  @Override  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {    super.onMeasure(widthMeasureSpec, heightMeasureSpec);    System.out.println("onMeasure 我被調用了"+System.currentTimeMillis());  }  @Override  protected void onDraw(Canvas canvas) {    super.onDraw(canvas);    System.out.println("onDraw 我被調用了"+System.currentTimeMillis());  }}

布局文件:

<com.test.MyImageView  android:id="@+id/imageview"  android:layout_width="wrap_content"  android:layout_height="wrap_content"  android:src="@drawable/test" />

測試的Activity的onCreate():

@Overridepublic void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.main);  System.out.println("執行完畢.."+System.currentTimeMillis());}

現在我們現在來看一下結果:

說明等onCreate方法執行完了,我們定義的控件才會被度量(measure),所以我們在onCreate方法里面通過view.getHeight()獲取控件的高度或者寬度肯定是0,因為它自己還沒有被度量,也就是說他自己都不知道自己有多高,而你這時候去獲取它的尺寸,肯定是不行的.

現在碰到這個問題我們不能不解決,在網上找到了如下辦法:

//------------------------------------------------方法一int w = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);int h = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);imageView.measure(w, h);int height =imageView.getMeasuredHeight();int width =imageView.getMeasuredWidth();textView.append("/n"+height+","+width);//-----------------------------------------------方法二ViewTreeObserver vto = imageView.getViewTreeObserver();vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {  public boolean onPreDraw() {    int height = imageView.getMeasuredHeight();    int width = imageView.getMeasuredWidth();    textView.append("/n"+height+","+width);    return true;  }});//-----------------------------------------------方法三ViewTreeObserver vto2 = imageView.getViewTreeObserver();vto2.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {  @Override  public void onGlobalLayout() {    imageView.getViewTreeObserver().removeGlobalOnLayoutListener(this);    textView.append("/n/n"+imageView.getHeight()+","+imageView.getWidth());  }});

這三個方法是哪里找到現在已經忘了.

現在要討論的是當我們需要時候使用哪個方法呢?

現在把測試的Activity改成如下:

@Override public void onCreate(Bundle savedInstanceState) {   super.onCreate(savedInstanceState);   setContentView(R.layout.main);   final ImageView imageView = (ImageView) findViewById(R.id.imageview);   //------------------------------------------------方法一   int w = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);   int h = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);   imageView.measure(w, h);   int height =imageView.getMeasuredHeight();   int width =imageView.getMeasuredWidth();   textView.append("/n"+height+","+width);   System.out.println("執行完畢.."+System.currentTimeMillis()); }

接著來看下面幾種方式輸出結果:

把測試Activity改成如下:

@Overridepublic void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.main);  final ImageView imageView = (ImageView) findViewById(R.id.imageview);//-----------------------------------------------方法二  ViewTreeObserver vto = imageView.getViewTreeObserver();  vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {    public boolean onPreDraw() {      int height = imageView.getMeasuredHeight();      int width = imageView.getMeasuredWidth();      textView.append("/n"+height+","+width);      return true;    }  });}

結果如下:

方法三就不再測試了同方法二!!!

那么方法而和方法三在執行上有什么區別呢?

我們在布局文件中加入一個TextView來記錄這個控件的寬高.

<ScrollView  android:layout_width="wrap_content"  android:layout_height="wrap_content" >  <TextView    android:id="@+id/text"    android:layout_width="wrap_content"    android:layout_height="wrap_content" /></ScrollView>

先來測試方法二:

@Overridepublic void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.main);  final ImageView imageView = (ImageView) findViewById(R.id.imageview);//-----------------------------------------------方法二  ViewTreeObserver vto = imageView.getViewTreeObserver();  vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {    public boolean onPreDraw() {      int height = imageView.getMeasuredHeight();      int width = imageView.getMeasuredWidth();      textView.append("/n"+height+","+width);      return true;    }  });}

結果如下:

我們再來測試方法三

@Overridepublic void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.main);  final ImageView imageView = (ImageView) findViewById(R.id.imageview);  //-----------------------------------------------方法三  ViewTreeObserver vto2 = imageView.getViewTreeObserver();  vto2.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {    @Override    public void onGlobalLayout() {      imageView.getViewTreeObserver().removeGlobalOnLayoutListener(this);      textView.append("/n/n"+imageView.getHeight()+","+imageView.getWidth());    }  });}

輸出結果如下:

我想這方法二和方法三之間的區別就不用說了吧.

總結:那么需要獲取控件的寬高該用那個方法呢?

方法一: 比其他的兩個方法多了一次計算,也就是多調用了一次onMeasure()方法,該方法雖然看上去簡單,但是如果要目標控件計算耗時比較大的話(如listView等),不建議使用.

方法二,它的回調方法會調用很多次,并且滑動TextView的時候任然會調用,所以不建議使用.

方法三,比較合適.

當然,實際應用的時候需要根據實際情況而定.

希望本文所述對大家Android程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩国产中文精品字幕自在自线| 亚洲v日韩v综合v精品v| 国产一区二区三区在线播放免费观看| 久久精品人人爽| 欧美丰满少妇xxxx| 萌白酱国产一区二区| 综合国产在线视频| 亚洲欧美中文字幕| www.日本久久久久com.| 国产999在线| 美女av一区二区三区| 国产精品黄色av| 欧美激情精品久久久久久大尺度| 亚洲成人三级在线| 4p变态网欧美系列| 国产99久久久欧美黑人| 欧美日韩午夜视频在线观看| 中文字幕在线成人| 日韩美女在线观看| 欧美男插女视频| 中文字幕亚洲一区在线观看| 欧美日韩亚洲网| 色偷偷噜噜噜亚洲男人的天堂| 日韩在线视频网| 日韩精品在线观看网站| 这里只有视频精品| 在线观看成人黄色| 日韩亚洲精品视频| 亚洲电影免费在线观看| 国产主播喷水一区二区| 中文字幕亚洲第一| 成人在线视频网站| 久久香蕉国产线看观看网| 国产91精品视频在线观看| 欧美激情高清视频| 欧美电影电视剧在线观看| 日韩中文字幕在线看| www国产精品视频| 亚洲无限乱码一二三四麻| 成人av在线天堂| 亚洲黄色www网站| 欧美日韩第一页| 亚洲一区二区中文字幕| 亚洲国产天堂网精品网站| 77777少妇光屁股久久一区| 久久久亚洲精品视频| 91精品国产91久久久久久| 国产精品网站大全| 日韩在线视频网| 欧美又大粗又爽又黄大片视频| 久久91亚洲精品中文字幕| 欧美精品一区二区三区国产精品| 欧美电影院免费观看| 欧美日韩ab片| 91精品国产乱码久久久久久蜜臀| 日韩精品日韩在线观看| 91久久久久久久| 丰满岳妇乱一区二区三区| 91麻豆国产语对白在线观看| 欧美日韩国产精品专区| 久久精品视频中文字幕| 国产午夜精品视频免费不卡69堂| 欧美精品久久久久| 欧美亚洲激情视频| 欧美性videos高清精品| 国产精品久久久久久久天堂| 97视频人免费观看| 欧美黑人狂野猛交老妇| 欧美性猛交xxxx黑人猛交| 亚洲精品在线不卡| 欧美老女人www| 国产日韩欧美日韩大片| 欧美诱惑福利视频| 久久91精品国产91久久跳| 久久久久久久色| 欧美精品少妇videofree| 成人午夜在线影院| 最近中文字幕2019免费| 欧美黑人巨大精品一区二区| 亚洲欧美日韩爽爽影院| 高清日韩电视剧大全免费播放在线观看| 欧美孕妇孕交黑巨大网站| 庆余年2免费日韩剧观看大牛| 精品女同一区二区三区在线播放| 国产成人精品国内自产拍免费看| 永久555www成人免费| 精品丝袜一区二区三区| 欧美激情欧美狂野欧美精品| 日韩精品免费在线| 日韩经典一区二区三区| 欧美精品生活片| 欧美电影在线免费观看网站| 国模视频一区二区| 欧美性猛交xxxxx免费看| 亚洲男人天天操| 亚洲欧美国产一区二区三区| 姬川优奈aav一区二区| 国产成人自拍视频在线观看| 欧美在线视频免费观看| 久久精品亚洲热| www.亚洲男人天堂| 91成品人片a无限观看| 欧美性猛交xxxxx水多| 亚洲在线一区二区| 国产美女精品视频| 国产精品亚洲视频在线观看| 欧美亚洲第一区| 欧美性猛交xxx| 中文字幕亚洲一区| 国产成人福利夜色影视| 亚洲r级在线观看| 国产成人综合精品| 中文字幕在线观看日韩| 日韩在线免费高清视频| 成人日韩av在线| 91成人免费观看网站| 亚洲精品wwwww| 久久国产精品首页| 国产极品精品在线观看| 伊人久久大香线蕉av一区二区| 免费97视频在线精品国自产拍| 欧美激情欧美激情| 8x拔播拔播x8国产精品| 国产精品久久久久77777| 97视频在线观看网址| 成人黄色免费看| 亚洲一区二区久久久久久| 日韩精品中文字幕有码专区| 日韩成人久久久| 亚洲va电影大全| 欧美精品亚州精品| 国产在线视频91| 欧美另类第一页| 欧美大片免费观看在线观看网站推荐| 久久精品一偷一偷国产| 亚洲成人在线视频播放| 色阁综合伊人av| 成人乱色短篇合集| 欧美成人三级视频网站| 97免费视频在线| 成人综合国产精品| 91中文字幕一区| 亚洲欧美制服综合另类| 国产精品日日摸夜夜添夜夜av| 91网站在线免费观看| 久久精品亚洲热| 97涩涩爰在线观看亚洲| 色噜噜亚洲精品中文字幕| 国产精品精品一区二区三区午夜版| 韩日欧美一区二区| 欧美亚洲国产成人精品| 国产极品精品在线观看| 欧美裸体视频网站| 亚洲www视频| 久久久精品一区二区| 国产精品久久久久999| 亚洲国产又黄又爽女人高潮的| 欧美一级淫片videoshd| 中文字幕日韩免费视频| 国产精品狼人色视频一区| 美女视频久久黄| 97成人超碰免| 日韩在线中文视频| 97福利一区二区|