成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Android-6步教你自定義View

移動開發(fā) Android
如果你打算完全定制一個View,那么你需要實現(xiàn)View類(所有的Android View都實現(xiàn)于這個類),并且實現(xiàn)確定尺寸的onMeasure(…))方法和確認(rèn)繪圖的onDraw(…))方法。

如果你打算完全定制一個View,那么你需要實現(xiàn)View類(所有的Android View都實現(xiàn)于這個類),并且實現(xiàn)確定尺寸的onMeasure(…))方法和確認(rèn)繪圖的onDraw(…))方法。

自定義View一共分為6步

***步

  1. public class SmileyView extends View { 
  2.     private Paint mCirclePaint; 
  3.     private Paint mEyeAndMouthPaint; 
  4.  
  5.     private float mCenterX; 
  6.     private float mCenterY; 
  7.     private float mRadius; 
  8.     private RectF mArcBounds = new RectF(); 
  9.  
  10.     public SmileyView(Context context) { 
  11.         this(context, null); 
  12.     } 
  13.  
  14.     public SmileyView(Context context, AttributeSet attrs) { 
  15.         this(context, attrs, 0); 
  16.     } 
  17.  
  18.     public SmileyView(Context context, AttributeSet attrs, int defStyleAttr) { 
  19.         super(context, attrs, defStyleAttr); 
  20.         initPaints(); 
  21.     } 
  22.  
  23.     private void initPaints() {/* ... */} 
  24.  
  25.     @Override 
  26.     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {/* ... */} 
  27.  
  28.     @Override 
  29.     protected void onDraw(Canvas canvas) {/* ... */} 
  30.  

2.實現(xiàn)畫筆paint類

本文一共兩只畫筆

  1. private void initPaints() { 
  2.     mCirclePaint = new Paint(Paint.ANTI_ALIAS_FLAG); 
  3.     mCirclePaint.setStyle(Paint.Style.FILL); 
  4.     mCirclePaint.setColor(Color.YELLOW); 
  5.     mEyeAndMouthPaint = new Paint(Paint.ANTI_ALIAS_FLAG); 
  6.     mEyeAndMouthPaint.setStyle(Paint.Style.STROKE); 
  7.     mEyeAndMouthPaint.setStrokeWidth(16 * getResources().getDisplayMetrics().density); 
  8.     mEyeAndMouthPaint.setStrokeCap(Paint.Cap.ROUND); 
  9.     mEyeAndMouthPaint.setColor(Color.BLACK); 
  10.  

3.覆寫onMeasure(…)方法

實現(xiàn)這個方法告訴了母容器如何放棄自定義View,可以通過提供的measureSpecs來決定你的View的高和寬,以下是一個正方形,確認(rèn)它的寬和高是一樣的。

  1. @Override 
  2. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
  3.     int w = MeasureSpec.getSize(widthMeasureSpec); 
  4.     int h = MeasureSpec.getSize(heightMeasureSpec); 
  5.  
  6.     int size = Math.min(w, h); 
  7.     setMeasuredDimension(sizesize); 
  8.  

注意:

這個方法需要至少保證一個setMeasuredDimension(..)調(diào)用,否則會報IllegalStateException錯誤。

4.實現(xiàn)onSizeChanged(…)方法

這個方法是你獲取View現(xiàn)在的寬和高. 這里我們計算的是中心和半徑。

  1. @Override 
  2. protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
  3.     mCenterX = w / 2f; 
  4.     mCenterY = h / 2f; 
  5.     mRadius = Math.min(w, h) / 2f; 
  6.  

5.實現(xiàn)onDraw(…)方法

這個方法提供了如何繪制view,它提供的Canvas類可以進(jìn)行繪制。

  1. @Override 
  2. protected void onDraw(Canvas canvas) { 
  3.     // draw face 
  4.     canvas.drawCircle(mCenterX, mCenterY, mRadius, mCirclePaint); 
  5.     // draw eyes 
  6.     float eyeRadius = mRadius / 5f; 
  7.     float eyeOffsetX = mRadius / 3f; 
  8.     float eyeOffsetY = mRadius / 3f; 
  9.     canvas.drawCircle(mCenterX - eyeOffsetX, mCenterY - eyeOffsetY, eyeRadius, mEyeAndMouthPaint); 
  10.     canvas.drawCircle(mCenterX + eyeOffsetX, mCenterY - eyeOffsetY, eyeRadius, mEyeAndMouthPaint); 
  11.     // draw mouth 
  12.     float mouthInset = mRadius /3f; 
  13.     mArcBounds.set(mouthInset, mouthInset, mRadius * 2 - mouthInset, mRadius * 2 - mouthInset); 
  14.     canvas.drawArc(mArcBounds, 45f, 90f, false, mEyeAndMouthPaint); 
  15.  

6.添加你的View

  1. <FrameLayout 
  2.     xmlns:android="http://schemas.android.com/apk/res/android" 
  3.     android:layout_width="match_parent" 
  4.     android:layout_height="match_parent"
  5.  
  6.     <com.example.app.SmileyView 
  7.         android:layout_width="match_parent" 
  8.         android:layout_height="match_parent" /> 
  9. </FrameLayout>  

到此就結(jié)束了,自定義View沒你想的那么難 

責(zé)任編輯:龐桂玉 來源: Android開發(fā)中文站
相關(guān)推薦

2016-12-26 15:25:59

Android自定義View

2016-11-16 21:55:55

源碼分析自定義view androi

2016-04-12 10:07:55

AndroidViewList

2013-05-20 17:33:44

Android游戲開發(fā)自定義View

2012-05-18 10:52:20

TitaniumAndroid模塊自定義View模塊

2013-01-06 10:43:54

Android開發(fā)View特效

2017-03-14 15:09:18

AndroidView圓形進(jìn)度條

2021-10-26 10:07:02

鴻蒙HarmonyOS應(yīng)用

2011-08-02 11:17:13

iOS開發(fā) View

2022-04-20 18:22:18

CSS拖拽預(yù)覽圖

2021-01-20 08:58:39

iOS 14桌面圖標(biāo)快捷指令

2010-08-03 16:13:01

FlexBuilder

2013-04-01 14:35:10

Android開發(fā)Android自定義x

2017-01-06 08:47:53

2017-05-19 10:03:31

AndroidBaseAdapter實踐

2017-05-18 12:36:16

android萬能適配器列表視圖

2010-02-07 14:02:16

Android 界面

2015-02-12 15:33:43

微信SDK

2021-01-07 05:24:38

SpringbootSpringBanner

2011-08-18 17:32:55

iPhone開發(fā)Table Cell
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: av在线播放不卡 | 91精品国产高清一区二区三区 | 国产一级片在线播放 | 综合精品久久久 | 欧美一级二级视频 | 91 在线| 国产精品亚洲一区二区三区在线观看 | 日韩免费一区 | 亚洲精品乱 | 久久久99国产精品免费 | 一区二区三区四区不卡 | 麻豆changesxxx国产 | 国产成人精品久久二区二区91 | 成人精品久久久 | 韩国av一区二区 | 亚洲精品久久久久久久久久久久久 | 国产精品久久一区二区三区 | av大片在线观看 | 蜜桃av一区二区三区 | 羞羞视频免费在线观看 | 国产无人区一区二区三区 | 久99久视频 | 久久在线看 | 精品国产一区二区三区性色av | 国产高清一区二区 | 亚洲一区毛片 | 日韩av成人在线观看 | 国产999精品久久久 精品三级在线观看 | 97视频在线观看免费 | 日韩在线免费 | 国产精品成人一区二区 | 九九精品在线 | 国产精品国产精品 | 成人小视频在线免费观看 | www.午夜 | 欧美xxxx性 | 国产精品呻吟久久av凹凸 | 欧洲av在线 | 免费黄色av | 91社区在线观看 | 在线观看亚洲精品 |