2013年1月16日 星期三

2013年1月8日 星期二

【轉】Android getWidth和getMeasuredWidth的正解

一。也許很多童鞋對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的空間。

-------------------------------------------------2011/03/01更新------------------------------------------------------------
1. 在xml裡面用的Layout_weight是什麼意思?
 A: 該屬性代表的權值,權值越小,級別越高,即在佈局中佔的分量就越重,舉例。
      
http://schemas.android.com/apk/res/android
"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >

因為設置了button1的權重最小,所以它佔用的佈局就越大,這樣設置的意思是:將橫向的佈局分為三份,button1佔兩份,button2佔一份,很簡單的,有什麼不懂的可以留言,謝謝!,
下面看效果圖:
*******2011-3-26 修改
       这里要首先感谢sunwayforever的指导,避免了我这篇文章错误之处的进一步扩散,在这里先引用一句话吧:由于作者水平有限,文章中难免有疏漏和错误之处,恳请大家批评指正。谢谢!(注:上面綠色底紋的言論錯誤,希望大家往下看)
这里对layout_weight 说一下自己新的见解,首先,前面有一句话“因为设置了button1的权重最小,所以它占用的布局就越大”这句话在你的layout_width设置为fill_parent的时候是没错的,可是如果设置为wrap_content的时候,这句话就解释不清了,下面是sunwayforever对此属性的认识:
linearLayout中包含有weight的child时,linearLayout会measure两次:
设屏幕宽度为X
第一次:button1的measuredWidth为X,button2也为X (因为用了weight,所以linearLayout每次measure child时不考虑前一个已经占用的大小),total_width为2X
第二次:计算delta=x-total_width=-x,然后会将button1的宽度设为
x+delta*1/3=0.66x, button2的宽度为 x+delta*2/3=0.33x
      那我现在对这句话重新概括一下:“因为设置了button1的权重最小,所以它占用的布局优先级就越高”,也许在Android里面布局并没有优先级之说,我这里只是为了说明问题,自己定义的,所以朋友们不要拍砖。
      那首先分析一下當layout_width屬性設置為fill_parent的時候,即充滿父佈局,當然意思是這個控件要根據weight的設置盡可能的大,因此,依上例而論,button1的weight設為1,button2的weight設置為2.即button的優先級最高,因此,要填充父佈局就要button1先來填充,盡可能的大,那這個盡可能又是多少呢,這就要綜合layout裡其他控件的weight值了,然後做一下運算,button1佔據2/3,button2佔據1/3.你也可以把button2設置為一個非常大的數,比如2000,此時在Graphical Layout模式下可以看到button1填充滿了整個寬度,而看不到button2的影子,事實上button2還是存在的,你把鼠標指向button1的後面就可以看到一個長長的豎條,那個就是button2,已經非常非常小了。因此,在layout_width設置為fill_parent的時候,weight所代表的是你的控件要優先盡可能的大。

     接著是當layout_weight設置為wrap_content的時候,即適應內容的寬度,意思是這個控件要盡可能的小,只要能把內容顯示出來就可以了,同樣的,如果把button1和button2的layout_weight設置為wrap_content後,button1的weight為1,button2的weight為2.那麼button1要優先盡可能的小,而button2也要盡可能的小,只是優先級不一樣,因為設置了weight,所以這兩個控件總的寬度要填滿父佈局的寬度,所以就又要計算每個控件所佔據的大小,此時,button1的優先級較高,共有兩份,一份1/3,一份2/3,button1要盡可能的小,那button1當然要選1/3,因此,我們看到的效果反而是button2佔據的較大。這裡要說的是如果把權值同樣做如下設置:button1為1,button2為2000,那button1是不是就要佔據1/2000的空間呢?這麼理解就錯了,剛才說了,要盡可能的小,但這個小是有一個限度的,那就是wrap_content,就是還要是內容完完整整的顯示出來,同樣的,盡可能的大也是有一個限度的,那就是父佈局的寬度。因此,在layout_width設置為wrap_content的時候,weight所代表的是你的控件要優先盡可能的大。
所以,要對weight做了解,要深深的理解下面兩句話:
在layout_width設置為fill_parent的時候,layout_weight所代表的是你的控件要優先盡可能的大,但這個大是有限度的,即fill_parent.
在layout_width設置為wrap_content的時候,layout_weight所代表的是你的控件要優先盡可能的小,但這個小是有限度的,即wrap_content.
layout_height 同 layout_width.

下面貼幾張圖:
1. layout_width="fill_parent", button1的weight=1,button2的weight=2;
2.layout_width="fill_parent", button1的weight=1,button2的weight=2000;
3.layout_width="wrap_content", button1的weight=1,button2的weight=2;
4.layout_width="wrap_content", button1的weight=1,button2的weight=2000;

轉載來自:
http://hi.baidu.com/ljlkings/item/afb3b4c2b2a96e66f7c95dac

2013年1月7日 星期一

自製軟體 手機簡易測試 -- 測試手機的好幫手 PhoneSimpleTest

小弟第一次寫APP
用來測試一些手機的小功能,分享給大家
英文用的不好請見諒,google翻譯的


說明:
提供簡易測試手機的功能
簡單易用,讓您輕鬆測試裝置的基本功能!
提供簡易測試手機的功能
(1)螢幕:提供純色(RGB)、對比、清晰、灰階等測試。
(2)音效:測試喇叭是否正常。
(3)震動:測試手機震動功能。
(4)閃光燈:以手電筒功能,測試閃光燈是否正常。
(5)觸控:可偵測目前機器最多支援幾點觸控。
(6)Wifi:可測試目前手機無線網路的訊號狀態。
(7)感應器:可測試目前手機所支援的感應器,並顯示相關數值。
(8)GPS:可測試目前GPS的定位及收訊衛星狀況,提供精確度、高度、速度、經度、緯度、方向等相關訊息。

一項一項的測試可以讓您更了解自己的手機有沒有諸如像 亮點、暗點、白斑等問題,並可了解顯示器的色彩表現,也可檢測目前裝置所支援的感應器是否功能運作正常,而在裝置資訊中提供您關於通訊面一些基本訊息,如IEMI、Sim卡序號、GSM訊號強弱等(0~31,但若數值為99,則為系統商不提供相關訊息)。

無廣告,純粹提供測試使用。

Google Play 搜尋 PhoneSimpleTest 或是 手機簡易測試

Google Play 連結

【目前已知問題】
某些機種於GPS測試時無法正常顯示單一衛星訊號長條圖

v1.784 - 20130724
嘗試修正系統訊息在部分機器若無提供資料會ANR or 當機的問題v1.783 - 20130721
新增部分系統訊息v1.782 - 20130713
修正GPS測試中,未開啟GPS之後離開頁面死機問題
v1.781 - 20130706
修正GPS測試中,離開測試卻仍持續偵測GPS訊號的錯誤
附註說明:使用感應器測試時,因各裝置內建感應器數目不同,
部分裝置因內建感應器較多,若測試時不斷移動,將容易造成系統負載過重,
導致程式當機,建議置穩裝置後再做測試。
v1.78 - 20130108
修正GPS測試中,顯示衛星訊號強度的錯誤
v1.77 - 20130107
增加版本歷程
v1.76 - 20130105
系統訊息增加更完整的電池相關資訊
v1.75 - 20130103
變更GPS測試的顯示模式
v1.74 - 20130103
變更GPS測試的顯示模式
v1.73 - 20130102
系統資訊頁面增加顯示電池目前電量及目前開機時間
v1.721 - 20130102
修正一些小錯誤
v1.72 - 20121231
嘗試修正系統資訊無法正常開啟的問題,當遇到無法識別的CPU時脈資訊時(應該是三星系列發生的問題),暫時將其顯示為1MHZ
v1.71 - 20121229
修正了系統資訊中,CPU時脈無法在多核心處理器中正確顯示的問題
v1.70 - 20121228
新增GPS測試
v1.61 - 20121221
降低感應器測試的資料更新頻率,避免系統因感應器過多,系統附載過重所造成的當機問題。
v1.60 - 20121221
新增裝置頁面供檢視裝置狀態
修正了一些小錯誤
v1.50 - 20121220
變更系統資訊版型
修正一些小錯誤
v1.49 - 20121218
新增感應器測試,支援目前市面上常見的感應器
v1.40 - 20121217
新增Wifi測試
修正了一些小錯誤
v1.31 - 20121213
修正了一些小錯誤
v1.3 - 20121212
新增觸控測試
v1.2 - 20121212
新增對比度測試畫面
主畫面改版
v1.1 - 20121127
更新了對比度測試的顯示方式
v1.0 - 20121121
第一版發佈

=====English=====

v1.784 - 20130724
fix SysInfo ANR's bug
v1.783 - 20130721
add new Sysinformation
v1.782
fix GPStest's bug
v1.781
fix GPStest's bug
Before use SensorTest Recommend flat device for further testing!!
v1.78
fix GPStest's bug
v1.77
add Version History
v1.76
Sysinfo add new battery information
v1.75
change GPStest's display mode
v1.74
change GPStest's display mode
v1.73
SysInfo add battery/machine online information
v1.721
fix some bugs
v1.72
try to fix some sysinfo bug
v1.71
fix Cpu freq display bug,now support multi-core
v1.70
add GPS test
v1.61
Reduce sensor fresh rate avoid to Crash!
v1.60
add Phone Infomation page
and fix some bugs
v1.50
change sysinfo page style
and fix some bugs
v1.49
add Sensor Test
v1.40
add Wifi test
and fix some bugs
v1.31
fixed some bugs
v1.3
add touch test
v1.2
add new Contrast mode
change mainlayout
v1.1
Update Contrast Test display mode
v1.0
first version publish

Related Posts Plugin for WordPress, Blogger...