編輯:關於Android編程
MainActivity如下:
package cc.testviewstudy2; import android.os.Bundle; import android.app.Activity; /** * Demo描述: * 關於自定義View的學習(二) * * View的繪制流程:onMeasure()-->onLayout()-->onDraw() * * 學習資料: * http://blog.csdn.net/guolin_blog/article/details/16330267 * Thank you very much * */ public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } }
LinearLayoutTest如下:
package cc.testviewstudy2; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.AttributeSet; import android.view.View; import android.widget.LinearLayout; /** * 注意: * 1 繼承自XXXXLayout不要繼承自ViewGroup * 假如繼承自ViewGroup那麼xml的cc.testviewstudy2.ViewGroupLayout中 * 設置layout_width和layout_height不論是wrap_content還是fill_parent * 這個父視圖總是充滿屏幕的. * 現象是如此,原因暫不明. * * 2 在本LinearLayoutTest我們只放入一個子View作為測試 */ public class LinearLayoutTest extends LinearLayout { private Paint mPaint; public LinearLayoutTest(Context context) { super(context); } public LinearLayoutTest(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); if (getChildCount()>0) { View childView=getChildAt(0); //這裡的widthMeasureSpec和heightMeasureSpec都是父視圖的 //這兩個值都由Size和Mode組成,所以要是如下輸出: //System.out.println("widthMeasureSpec="+widthMeasureSpec+",heightMeasureSpec="+heightMeasureSpec); //會得到兩個很大的值.這個值就是Size和Mode的組合. //所以我們應該按照下面的方式來 //分別獲取widthMeasureSpec和heightMeasureSpec的Size和Mode int widthSize=MeasureSpec.getSize(widthMeasureSpec); int widthMode=MeasureSpec.getMode(widthMeasureSpec); int heightSize=MeasureSpec.getSize(heightMeasureSpec); int heightMode=MeasureSpec.getMode(heightMeasureSpec); System.out.println("父視圖widthSize="+widthSize+",父視圖widthMode="+widthMode+ ",父視圖heightSize="+heightSize+",父視圖heightMode="+heightMode); //測量子View measureChild(childView, widthMeasureSpec, heightMeasureSpec); } } @Override protected void onLayout(boolean arg0, int arg1, int arg2, int arg3, int arg4) { if (getChildCount()>0) { View childView=getChildAt(0); System.out.println("子視圖childView.getMeasuredWidth()="+childView.getMeasuredWidth()+ ",子視圖childView.getMeasuredHeight()="+ childView.getMeasuredHeight()); //擺放子View childView.layout(0, 0, childView.getMeasuredWidth(), childView.getMeasuredHeight()); //X和Y均平移50 //在此犯錯寫成了:childView.layout(50, 50, childView.getMeasuredWidth(), childView.getMeasuredHeight()); //導致圖片顯示出來很小,正確的方式如下: //childView.layout(50, 50, childView.getMeasuredWidth()+50, childView.getMeasuredHeight()+50); } } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); mPaint = new Paint(); mPaint.setColor(Color.YELLOW); mPaint.setTextSize(20); String content = "Hello World"; canvas.drawText(content, 150, 100, mPaint); } }
main.xml如下:
最近看了很多動畫和一些效果很好的自定義控件,發現了一件事,就是Android的View層設計思想和古老的JavaSwing是如此的相似。這是在原來的基礎上加入了一些輸入移
一.效果展示在Android手機的桌面上,我們經常可以看到如下小控件在這些控件上,可以顯示我們APP的一些重要的交互信息,以我最近開發的手機衛士為例,在widget上可以
關於Android View 事件分發過程的文章網絡上可以搜到一把大,這裡貼一篇代碼性的文章,作者也是個牛人:Android事件分發機制完全解析,帶你從源碼的角度徹底理解
Blur自從iOS系統引入了Blur效果,也就是所謂的毛玻璃、模糊化效果,磨砂效果,各大系統就開始競相模仿,這是一個怎樣的效果呢,我們現來看一些圖:這些就是典型的Blur