l画从布局的根节点开始。它被要求来量和绘制布局树。绘画通过遍历布局树ƈ渲染每个和失效区域相交的视图来处理。相应的Q?strong style="margin: 0px; padding: 0px; ">每个视图l负责请求绘制它的子视图Q通过draw() ҎQ而每个视图负责画它自?/strong>?strong style="margin: 0px; padding: 0px; ">因ؓq个树是序遍历的,q意味着先画父节点(也就是在屏幕后面Q,然后按照树中出现的顺序画其同层次节点?/strong>
框架不会画不在失效区域的视图,而且q将会帮你画视图背景?/p>
你可以强制一个视图被重画Q通过调用invalidate()?/strong>
l画布局共有两步Q一个度量过E和一个布局q程?度量q程在measure(int, int)里实C是一个自向下的视图树遍历。每个视囑֜递归时往下推送尺寸规根{在度量q程的最后,每个视图都已l保存了自己的度量。第二个q程发生?layout(int, int, int, int) 中ƈ且也是自向下。在q个q程中,每个父节点负责定位它的所有子节点Q通过使用在度量过E中计算得到的尺寸?/p>
当一个视囄 measure()Ҏq回Ӟ它的getMeasuredWidth()和getMeasuredHeight() 值必被讄Q以及所有这个视囑֭节点的倹{一个视囄度量的宽度和高度值必ȝ合父视图引入的限制。这保在度量过E之后,所有父节点接受所有它们的?节点的度量倹{一个父视图可能会在其子视图上多ơ调用measure()Ҏ。比如,父视囑֏能会通过未指定的寸调用measure来发现它们的大小Q?然后使用实际数值再ơ调用measure()Q如果所有子视图未做限制的尺寸dq大或过(也即是,如果子视图之间不能对各自占据的空间达成共识的话, 父视囑ְ会干预ƈ讄W二个过E的规则Q?/p>
要开始一个布局Q可调用requestLayout()。这个方法通常在视图认为它自己不再适合它当前的边界的情况下被调用?/strong>
度量q程使用两个cL交流寸?strong style="margin: 0px; padding: 0px; ">View.MeasureSpecc被视图用来告诉它们的父视图它们惛_何被度量和定位。基的LayoutParamscM仅描qC视图x多大Q高和宽Q?/strong>。对于每个维度,它可以指定下面之一Q?/p>
对于不同的ViewGroup子类Q有相应的LayoutParams子类。比如,相对布局RelativeLayout有它自己的LayoutParams子类Q这包含了能够让子视图横向和竖向居中昄的能力?/p>
度量规格QMeasureSpecsQ?/strong>被用来沿着树从父到子的下传度量需求。一个MeasureSpecs可以是下面三U模式之一Q?/p> 一?/span>?a很多童鞋對getWidth()和getMeasuredWidth()的用法有很多的不解,這兩者之間有什麼樣的不同呢Q網上也有各E不同的版本Q但 大多敔R大同異Q從這個地方Ctrl+C,到另一個地方Ctrl+V,沒有把問說透,也有一部分文章誤導了大家對這兩個方法的認識Q我也是深受其害?這裡先m正下面的一個版本的說法QBaidu上一搜一大堆的,可惜這種說法是錯的,所以希望大家就不要再盲目的轉載C的空間裡Q?/span> 二?/span>好了Q錯誤的版本׃過多說了Q下面對這兩個方法做一下正解,首先大家應先知道以下qNQ?/span> /** Called when the activity is first created. */ mBackgroundLayout = new MyLayout(this); mTextViewTest = new TextViewTest(this); mBackgroundLayout.addView(mTextViewTest); public MyLayout(Context context) { @Override } /** Called when the activity is first created. */ public class TextViewTest extends TextView { @Override --------------------------------------------------------------------2011/03 /01更新------------------------------------------------------------ 1. 在xml裡面用的Layout_weight是什麼意思? A: 該屬性代表的Ɗ|ƊD,級別高Q即在佈局中佔的分量就重Q舉例?/span> <?xml version="1.0" encoding="utf-8"?> 因為a置了button1的權重最,所以它佔用的佈局p大,這樣a置的意思是Q將向的佈局分為三䆾Qbutton1佔兩份,button2佔一份,很簡單的Q有什g懂的可以留言Q謝!Q?/span> 下面看效果圖Q?/span> *******2011-3-26 修改 q里要首先感?/span>sunwayforever的指|避免了我q篇文章错误之处的进一步扩散,在这里先引用一句话吧:׃作者水qx限,文章中难免有疏漏和错误之处,恌大家批评指正。谢谢!Q?/span>注:上面E色底紋的言論錯誤,希望大家往下看Q?/span> linearLayout中包含有weight的childӞlinearLayout会measure两次Q?/span> 那我现在对这句话重新概括一下:“因ؓ讄了button1的权重最,所以它占用的布局优先U就高”Q也许在Android里面布局q没有优先之说Q我q里只是Z说明问题Q自己定义的Q所以朋友们不要拍砖?/span> 接著是當layout_weighta置為wrap_content的時候,即適應內容的寬度Q意思是這個控件要盡可能的,只要能把內容示Z可?了,同樣的,如果把button1和button2的layout_weighta置為wrap_content後,button1的weight?1Qbutton2的weight?.那麼button1要優先盡可能的小Q而button2也要盡可能的,只是優先級不一樣,因為a置?weightQ所以這兩個控件總的寬度要填滿父佈局的寬度,所以就又要a算每個控件所佔據的大,此時Qbutton1的優先級較高Q共有兩份,一?1/3Q一?/3Qbutton1要盡可能的小Q那button1當然要選1/3Q因此,我們看到的效果反而是button2佔據的較大。這裡要說的是 如果把權值同樣做如下a置Qbutton1?Qbutton2?000Q那button1是不是就要佔?/2000的空間呢Q這麼理解錯了,剛才 說了Q?/span>要盡可能的小Q但這個小是有 一個限度的Q那是wrap_contentQ就是還要是內容完完整整的顯C出來,同樣的,盡可能的大也是有一個限度的Q那是父佈局的寬度。因此,?layout_widtha置為wrap_content的時候,weight所代表的是你的控g要優先盡可能的大?/span> 所以,要對weight做了解,要深q理解下面兩句話: layout_height ?layout_width. 下面貼幾張圖Q?/span> 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;
getWidth得到是某个view的实际尺?
getMeasuredWidth是得到某view惌在parent view里面占的大小.
惛_你也見過這樣的解釋,聽v來這樣的解釋也似雲裡霧裡,沒有把問點透?/span>
1. 在一個類初始化時Q即在構造函數當中我們是得不到View的實際大的。感興趣的朋友可以試一下,getWidth()和getMeasuredWidth()得到的結果都?.但是我們可以從onDraw()Ҏ裡面得到控g的大?/span>
2. 這兩個方法所得到的結果的單位是像素即pixel.
兩個方法做介紹Q?/span>
getWidth():得到的是view在父Layout中佈局好後的寬度|如果沒有父佈局Q那麼默認的父佈局是整個屏q。也a׃好理解。通過一個例子來說明一下?/span>
? Q?/span>
public class Test extends Activity {
private LinearLayout mBackgroundLayout;
private TextViewTest mTextViewTest;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mBackgroundLayout.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.FILL_PARENT,
LinearLayout.LayoutParams.FILL_PARENT));
setContentView(mBackgroundLayout);
}
public class MyLayout extends LinearLayout{
super(context);
// TODO Auto-generated constructor stub
}
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控gQ如果此時要得到TextView獲取getWidth()Q那麼是在TextViewd到Layout後再ȝ取|並不單單的是TextView本n寬度的獲取?/span>
getMeasuredWidth()Q?/span>先看一下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.
得到的是在最q一ơ調用measure()Ҏ測量後得到的view的寬度,它僅僅用在測量和layout的計中?/span>
所以此Ҏ得到的是view的內容佔據的實際寬度?/span>
你如果想從一個最單的例子中的到它們的不同Q下面將上面的例子做一下修改:
public class Test extends Activity {
private TextViewTest mTextViewTest;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mTextViewTest = new TextViewTest(this);
setContentView(mTextViewTest);
}
public TextViewTest(Context context) {
super(context);
// TODO Auto-generated constructor stub
setText("test test ");
}
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());
}
}
}
^結Q正解)Q?/span>
getWidth(): View在設定好佈局後整個View的寬度?/span>
getMeasuredWidth(): View上的內容進行測量後得到的View內容佔據的寬度,前提是你必須在父佈局的onLayout()Ҏ或者此View的onDraw()Ҏ裡調 用measure(0,0);(measure 參數的g可以自己定義)Q否則你得到的結果和getWidth()得到的結果一樣?/span>
也許我組J的不是很好Q大家有什g清楚的地方再i我留言。關於這兩個方法的區別就是看你有沒有用measure()ҎQ當然measureQ)的位|也是很重要的?/span>
?請尊重原創,轉載請註明這是http://hi.baidu.com/ljlkings/home的空間?/span>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Button1"
/>
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="2"
android:text="Button2"
/>
</LinearLayout>
q?里对layout_weight 说一下自己新的见解,首先Q前面有一句话“因ؓ讄了button1的权重最,所以它占用的布局p?#8221;q句话在你的layout_width讄?fill_parent的时候是没错的,可是如果讄为wrap_content的时候,q句话就解释不清了,下面?/span>sunwayforeverҎ属性的认识Q?/span>
讑ֱq宽度ؓX
W一?button1的measuredWidth为X,button2也ؓX (因ؓ用了weight,所以linearLayout每次measure child时不考虑前一个已l占用的大小)Qtotal_width?X
W二ơ:计算delta=x-total_width=-x,然后会将button1的宽度设?/span>
x+delta*1/3=0.66x, button2的宽度ؓ x+delta*2/3=0.33x
那首先分析一下當layout_width屬性設|為fill_parent的時候,卛_滿父佈局Q當然意思是這個控件要Ҏweight的設|盡可能?大,因此Q依上例而論Qbutton1的weighta為1,button2的weighta置?.即button的優先級最高,因此Q要填充父佈局?要button1先來填充Q盡可能的大Q那這個盡可能又是多少呢,這就要綜合layout裡其他控件的weightgQ然後做一下運,button1 佔據2/3Qbutton2佔據1/3.你也可以把button2a置Z個非常大的數Q比?000Q此時在Graphical Layout模式下可以看到button1填充滿了整個寬度,而看不到button2的媄子,事實上button2還是存在的,你把鼠標指向 button1的後面就可以看到一個長L豎條Q那個就是button2Q已E非帔R常小了?/span>因此Q在layout_widtha置為fill_parent的時候,weight所代表的是你的控g要優先盡可能的大?/span>
在layout_widtha置為fill_parent的時候,layout_weight所代表的是你的控g要優先盡可能的大,但這個大是有限度的,即fill_parent.
在layout_widtha置為wrap_content的時候,layout_weight所代表的是你的控g要優先盡可能的小,但這個小是有限度的,即wrap_content.
转自Q?/span>http://www.cnblogs.com/-OYK/archive/2011/10/30/2229620.html
]]>
/**
* PaintcMl?nbsp;
*
* Paint即画W,在绘图过E中起到了极光要的作用Q画W主要保存了颜色Q?nbsp;
* 样式{绘制信息,指定了如何绘制文本和囑ŞQ画W对象有很多讄ҎQ?nbsp;
* 大体上可以分Zc,一cM囑Şl制相关Q一cM文本l制相关?nbsp;
*
* 1.囑Şl制
* setARGB(int a,int r,int g,int b);
* 讄l制的颜Ԍa代表透明度,rQgQb代表颜色倹{?nbsp;
*
* setAlpha(int a);
* 讄l制囑Ş的透明度?nbsp;
*
* setColor(int color);
* 讄l制的颜Ԍ使用颜色值来表示Q该颜色值包括透明度和RGB颜色?nbsp;
*
* setAntiAlias(boolean aa);
* 讄是否使用抗锯齿功能,会消耗较大资源,l制囑Ş速度会变慢?nbsp;
*
* setDither(boolean dither);
* 讑֮是否使用囑փ抖动处理Q会使绘制出来的囄颜色更加qx和饱满,囑փ更加清晰
*
* setFilterBitmap(boolean filter);
* 如果该项讄为trueQ则囑փ在动画进行中会o掉对Bitmap囑փ的优化操作,加快昄
* 速度Q本讄依赖于dither和xfermode的设|?nbsp;
*
* setMaskFilter(MaskFilter maskfilter);
* 讄MaskFilterQ可以用不同的MaskFilter实现滤镜的效果,如o化,立体{?nbsp; *
* setColorFilter(ColorFilter colorfilter);
* 讄颜色qo器,可以在绘刉色时实现不用颜色的变换效?nbsp;
*
* setPathEffect(PathEffect effect);
* 讄l制路径的效果,如点ȝ{?nbsp;
*
* setShader(Shader shader);
* 讄囑փ效果Q用Shader可以l制出各U渐变效?nbsp;
*
* setShadowLayer(float radius ,float dx,float dy,int color);
* 在图形下面设|阴影层Q生阴影效果,radius为阴q角度Qdx和dy为阴影在x轴和y轴上的距,color为阴q颜色
*
* setStyle(Paint.Style style);
* 讄ȝ的样式,为FILLQFILL_OR_STROKEQ或STROKE
*
* setStrokeCap(Paint.Cap cap);
* 当画W样式ؓSTROKE或FILL_OR_STROKEӞ讄W刷的图形样式,如圆形样?nbsp;
* Cap.ROUND,或方形样式Cap.SQUARE
*
* setSrokeJoin(Paint.Join join);
* 讄l制时各囑Ş的结合方式,如^滑效果等
*
* setStrokeWidth(float width);
* 当画W样式ؓSTROKE或FILL_OR_STROKEӞ讄W刷的粗l度
*
* setXfermode(Xfermode xfermode);
* 讄囑Ş重叠时的处理方式Q如合ƈQ取交集或ƈ集,l常用来制作皮的擦除效?nbsp;
*
* 2.文本l制
* setFakeBoldText(boolean fakeBoldText);
* 模拟实现_体文字Q设|在字体上效果会非常差
*
* setSubpixelText(boolean subpixelText);
* 讄该项为trueQ将有助于文本在LCD屏幕上的昄效果
*
* setTextAlign(Paint.Align align);
* 讄l制文字的对齐方?nbsp;
*
* setTextScaleX(float scaleX);
* 讄l制文字x轴的~放比例Q可以实现文字的拉的效?nbsp;
*
* setTextSize(float textSize);
* 讄l制文字的字号大?nbsp;
*
* setTextSkewX(float skewX);
* 讄斜体文字QskewX为倾斜弧度
*
* setTypeface(Typeface typeface);
* 讄Typeface对象Q即字体风格Q包括粗体,斜体以及衬线体,非衬U体{?nbsp;
*
* setUnderlineText(boolean underlineText);
* 讄带有下划U的文字效果
*
* setStrikeThruText(boolean strikeThruText);
* 讄带有删除U的效果
*
*/
本文转自Q?a >http://www.cnblogs.com/-OYK/archive/2011/10/25/2223624.html