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

首頁 > 學院 > 開發設計 > 正文

自定義View

2019-11-08 00:15:07
字體:
來源:轉載
供稿:網友

1、創建類繼承View 或View的子類注意:重寫構造時,不能缺少兩個參數的構造:否則:報錯:public class MyView extends View{ /** * 當在布局文件中聲明該view,由系統調用此函數創建對象 * @param context * @param attrs */ public MyView(Context context, AttributeSet attrs) { super(context, attrs); } /** * 當在代碼中用關鍵字 new 創建該view時,調用此方法 * @param context */ public MyView(Context context) { super(context); }2、布局文件中的使用 <zzmyviewz9.view.MyView android:layout_width="wrap_content" android:layout_centerInParent="true" android:layout_height="wrap_content" />3、重寫相關的方法,實現我們的需求:一個view 從創建對象,到顯示在屏幕上,中間幾個重要的步驟:1、測量大小  2、指定位置  3、繪制內容 /** * 當系統需要測量當前控件大小時, */ PRotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); // 我們有個任務,就是指定我們自己的大小 // Measured 測量 Dimension 尺寸 setMeasuredDimension(180,100); // 指定我自己寬 180個象素 ,高100個象素 } /** * 二: 當系統為view指定位置時,調用此方法 ,對于自定義view 來說,該方法,作用不大 */ protected void onLayout(boolean changed, int left, int top, int right,int bottom) { super.onLayout(changed, left, top, right, bottom); } /** * 繪制內容 * @param Canvas 畫布 */ protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawColor(Color.BLUE); // 繪制一個純蘭色 Paint paint = new Paint(); // 畫圓時,所用的畫筆 paint.setColor(Color.RED); canvas.drawCircle(50, 50, 30, paint); // 繪制一個圓,圓心在x軸50象素,Y軸50像素的地方,半徑為30象素 }    onMeasure(int,int);                        // 系統測量控件大小時調用該方法,自己給自己測量寬和高    onLayout(boolean,int,int,int,int);// 系統為該view 指定位置時調用此方法,子view的位置,自身只有建議權,決定權在父view的手中。傳遞的參數是距離父控件的左上右下的位置    onDraw(Canvas);                        // 為本view繪制內容時,調用該方法。                   // 在主線程中請求重新繪制ondraw方法      invalidate();     // 在子線程中請求重新繪制ondraw方法     postInvalidate();  /* * 自定義控件三部曲 * 1. 重寫onMeasure方法 *   用來自己給自己指定一個寬高 系統會給我們推薦一個樣式的寬高 但是具體寬高是多少是由我們自己說了算 * 2.重寫onLayout方法              這個方法 是當我們繼承自ViewGroup時復寫 當父控件決定了子控件距離它的左上點和右下點之后調用 * 3.重寫onDraw方法             view長什么樣 是由自己決定 */ // 覺得自己有多大 @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // TODO Auto-generated method stub super.onMeasure(widthMeasureSpec, widthMeasureSpec); // 只要復寫了這個方法 最好自己給自定指定一個寬高 // 如果自己要給自己指定具體的寬高那么就 setMeasuredDimension 方法 // 如果想通過系統推薦 那么就調用父類的方法// setMeasuredDimension(200, 100); } // 當父控件指定好自己的位置后 告訴我們位置在哪 // 在這里 這個方法的意思不是很大 可以不用理會 // 原因就是因為我們是繼承自View的 @Override protected void onLayout(boolean changed, int left, int top, int right,int bottom) { // TODO Auto-generated method stub super.onLayout(changed, left, top, right, bottom); width = right-left; height = bottom-top; } // 子控件決定自己長什么樣子 // 畫筆 畫布 畫布(一張白紙 由我們隨便作畫) // 畫是一層一層的壓上去的 @Override protected void onDraw(Canvas canvas) { // 讓紙變成紅色 canvas.drawColor(Color.RED); canvas.drawRect(20, 20, 80, 200, paint); // 指定圓心和半徑 canvas.drawCircle(width/2, height/2, width/2, paint); paint.setColor(Color.YELLOW); paint.setStyle(Paint.Style.FILL); // 設置畫筆抗鋸齒 paint.setAntiAlias(true); paint.setStrokeWidth(5); canvas.drawCircle(width/2, height/2, width/2*0.9f, paint); }

1、onMeasure和onLayout的方法詳解

測量的大?。菏莢iew 自己想要的大小,在 view.measure 方法執行完以后,就有了       view.getMeasuredWidth();// 測量的寬       view.getMeasuredHeight(); //  測量的高真實的寬和高: view 的真實大小, 是在 view.layout 方法執行完了以后,才會有的值       view.getWidth(); // 真實的寬       view.getHeight(); // 真實的高@Override
/** * 當系統需要測量控件大小的時候,調用此方法, * 如果是一個view 那么,指定自己的大小就可以了, * 如果是一個布局(例如ViewGroup),不但要指定自己的大小,同時還要測量所有的子view 的大小。 * 參數一: widthMeasureSpec 寬度的大小和建議 * 參數一: heightMeasureSpec 高度的大小和建議 */ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); // 模式和size 模式是int類型的前兩位 size是后 30位 // int sizeWidth = MeasureSpec.getSize(widthMeasureSpec); // 獲得寬度尺寸 // int modeWidth = MeasureSpec.getMode(widthMeasureSpec); // 獲得寬度的相應模式 /* * 先測量誰(父控件還是子view),測量多少次都是不確定的 */ //可以指定// MeasureSpec.makeMeasureSpec(size, mode) // 測量所有的子view的大小 for(int i=0;i<getChildCount();i++){ View view = getChildAt(i); view.measure(widthMeasureSpec, heightMeasureSpec); /* * 測量的大小:是view 自己想要的大小,在 view.measure 方法執行完以后,就有了 * view.getMeasuredWidth();// 測量的寬 view.getMeasuredHeight(); // 測量的高 */ } //缺少這句話,則會導致沒有測量位置:導致linearlayout顯示,但是他的自view沒有顯示 //更好的方法是:使用for循環,給每一子view指定位置// getChildAt(2).measure(widthMeasureSpec, heightMeasureSpec); } @Override /** * 當父view為當前控件指定位置后,調用此方法 ,做為一個viewGroup,必須在此方法中,為子view指定位置 * @param changed 當前控件的大小,位置,是否發生改變 * @param l t r b 當前控件在父view坐標系中的位置 * */ protected void onLayout(boolean changed, int l, int t, int r, int b) {// System.out.println("ltrb:"+ l+" : "+t +" : "+r +" : "+b); // 一個viewGroup在onlayout 中的任務就是為,子view 指定位置 // View child0 = getChildAt(0);// child0.layout(0, 0, getWidth(), getHeight()); // 四個參數,分別是 child0 在當前view中的位置 // View child1 = getChildAt(1);// child1.layout(getWidth(), 0, getWidth()*2, getHeight()); // 四個參數,分別是 child0 在當前view中的位置 for(int i=0;i<getChildCount();i++){ View view = getChildAt(i); // 讓第一個子view填充滿整個viewGroup,以后的子view,依次向右移動一個寬度 view.layout(0+i*getWidth(), 0, getWidth()+i*getWidth(), getHeight()); // view 的真實大小, 是在 view.layout 方法執行完了以后,才會有的值// view.getWidth(); // 真實的寬// view.getHeight(); // 真實的高 } }注意:

@Override // 系統測量控件大小時,調用 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); // getMeasuredHeight(); // } @Override // 當父view為我們指定好位置后,調用此方法,告訴我們的位置 protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); // 真實的高度,只有當 onLayout 執行了以后才能獲得 this.top = getHeight(); System.out.println(top); }


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美视频国产精品| 国产欧美韩国高清| 欧美激情国产高清| 亚洲欧美日韩网| 精品视频久久久久久| 色先锋资源久久综合5566| 久久精品国产96久久久香蕉| 日韩在线观看电影| 少妇精69xxtheporn| 国产精品成熟老女人| 国产成人福利视频| 亚洲女人初尝黑人巨大| 中文字幕国产精品久久| 久久亚洲精品成人| 亚洲福利视频久久| 91最新国产视频| 国产精品亚洲网站| 视频一区视频二区国产精品| 国产精品一区二区在线| 欧美日韩国产一区二区三区| 亚洲v日韩v综合v精品v| 久久免费成人精品视频| 亚洲国产天堂久久国产91| 欧美激情一区二区三区在线视频观看| 亚洲国产日韩欧美在线动漫| 国产区精品视频| 欧美人与性动交| 日本高清视频一区| 国产成人一区二区三区电影| 国产精品色悠悠| 国产精品成人av性教育| 欧美成人精品xxx| 欧美日韩国产色| 国产精品免费久久久久久| 亚洲欧美日韩精品久久亚洲区| 国内精品一区二区三区| 日日摸夜夜添一区| 久久精品国产亚洲精品2020| 国产精品91视频| 亚洲毛片在线观看.| 亚洲香蕉av在线一区二区三区| 亚洲第一国产精品| 亚洲一区精品电影| 国产精品免费久久久久影院| 国产精品久久久久77777| 亚洲欧美激情精品一区二区| 国产精品久久久久久亚洲调教| 日韩欧美在线视频观看| 精品日韩视频在线观看| 亚洲人成网站777色婷婷| 欧美丝袜美女中出在线| 91天堂在线视频| 国产美女直播视频一区| 精品伊人久久97| 亚洲大胆人体视频| 97超碰色婷婷| 日本一区二区在线免费播放| 亚洲一区免费网站| 在线观看视频亚洲| 日韩国产欧美精品一区二区三区| 亚洲成人1234| 欧洲s码亚洲m码精品一区| 国产亚洲精品久久久久久777| 亚洲精选在线观看| 亚洲国产精品久久精品怡红院| 一区二区成人精品| 国产一区二区三区在线观看视频| 欧美一级片久久久久久久| 国产精品中文字幕在线观看| 欧美日韩日本国产| 欧美日本黄视频| 亚洲欧洲日产国产网站| 性色av一区二区三区在线观看| 中文日韩电影网站| 国产成人精品电影| 北条麻妃久久精品| 国产日本欧美在线观看| 欧美日韩中文字幕在线视频| 国产伦精品免费视频| 超薄丝袜一区二区| 欧美日韩中国免费专区在线看| 成人a免费视频| 中文字幕国产亚洲2019| 成人444kkkk在线观看| 亚洲美女又黄又爽在线观看| 国产精品直播网红| 久久久久久久一区二区三区| 91av在线免费观看| 国产精品欧美风情| 日韩二区三区在线| 欲色天天网综合久久| 中文字幕精品一区二区精品| 欧美成人一二三| 97精品一区二区三区| 国产亚洲a∨片在线观看| 91探花福利精品国产自产在线| 久久国产一区二区三区| 亚洲天天在线日亚洲洲精| 国产成人综合亚洲| 久久精品国产免费观看| 久久这里有精品| 国产精品久久久精品| 国内偷自视频区视频综合| 66m—66摸成人免费视频| 日韩av观看网址| 97国产精品视频人人做人人爱| 91亚洲va在线va天堂va国| 欧美怡红院视频一区二区三区| 97视频在线观看免费高清完整版在线观看| 91豆花精品一区| 久久久久久久影视| 2019日本中文字幕| 欧美老女人在线视频| 久久精品久久久久电影| 欧美日韩一二三四五区| 色婷婷综合成人| 国产精品久久久久av免费| 欧美激情国产高清| 国产伊人精品在线| 亚洲最大福利视频网站| 久久久在线免费观看| 久久综合伊人77777| 欧美成人精品在线观看| 亚洲第一精品夜夜躁人人爽| 色琪琪综合男人的天堂aⅴ视频| 久久久久久久久爱| 亚洲精品一区二区三区婷婷月| 国产一区二区丝袜| 97精品国产97久久久久久免费| 久久久久久久久久久亚洲| 欧美天堂在线观看| 亚洲国产成人精品久久久国产成人一区| 国产精品网红福利| 一本色道久久88综合日韩精品| 国产一区二区视频在线观看| 中文精品99久久国产香蕉| 国产亚洲精品美女久久久| 亚洲国产高清自拍| 狠狠躁夜夜躁人人爽超碰91| 欧美大奶子在线| 日韩最新免费不卡| 91精品国产乱码久久久久久久久| 久久久久国色av免费观看性色| 国产精品入口免费视| 国产美女精品视频免费观看| 中文字幕精品一区久久久久| 国产69久久精品成人看| 日本精品久久久| 国产精品午夜国产小视频| 欧美另类极品videosbestfree| 欧美激情一区二区三区成人| 亚洲人成亚洲人成在线观看| 欧美小视频在线| 久久久久久国产免费| 日本一区二区三区在线播放| 久久免费视频在线观看| 最近2019年好看中文字幕视频| 91精品国产综合久久男男| 中日韩美女免费视频网站在线观看| 国产成人在线精品| 97高清免费视频| 国内精品久久久久伊人av| 欧美性视频精品| 精品av在线播放|