一個高階Android工程師除了要會使用Google原生的view,必須會根據實際專案的酷炫效果自己去寫一些自定義view來解決問題,自定義view已經寫了不少了,今天來給大家帶來一些自定義view總結
自定義view速查表
Canvas常用操作速查表
操作分類 | 相關API | 備註 |
---|---|---|
繪製顏色 | drawColor, drawRGB, drawARGB | 使用單一顏色填充整個畫布 |
繪製基本形狀 | drawPoint, drawPoints, drawLine, drawLines, drawRect, drawRoundRect, drawOval, drawCircle, drawArc | 依次為 點、線、矩形、圓角矩形、橢圓、圓、圓弧 |
繪製圖片 | drawBitmap, drawPicture | 繪製點陣圖和圖片) |
繪製文字 | drawText, drawPosText, drawTextOnPath | 依次為 繪製文字、繪製文字時指定每個文字位置、根據路徑繪製文字 |
繪製路徑 | drawPath | 繪製路徑,繪製貝塞爾曲線時也需要用到該函式 |
頂點操作 | drawVertices, drawBitmapMesh | 通過對頂點操作可以使影像形變,drawVertices直接對畫布作用、 drawBitmapMesh只對繪製的Bitmap作用 |
畫布剪裁 | clipPath, clipRect | 設定畫布的顯示區域 |
畫布快照 | save, restore, saveLayerXxx, restoreToCount, getSaveCount | 依次為 儲存當前狀態、 回滾到上一次儲存的狀態、 儲存圖層狀態、 會滾到指定狀態、 獲取儲存次數 |
畫布變換 | translate, scale, rotate, skew | 依次為 位移、縮放、 旋轉、錯切 |
Matrix(矩陣) | getMatrix, setMatrix, concat | 實際畫布的位移,縮放等操作的都是影像矩陣Matrix,只不過Matrix比較難以理解和使用,故封裝了一些常用的方法。 |
操作型別 | 相關API | 備註 |
---|---|---|
基礎方法 | getDensity, getWidth, getHeight,getDrawFilter,isHardwareAccelerated(API 11),getMaximumBitmapWidth,getMaximumBitmapHeight,getDensity,quickReject,isOpaque,setBitmap,setDrawFilter | 使用單一顏色填充畫布 |
繪製顏色 | drawColor, drawRGB, drawARGB,drawPaint | 使用單一顏色填充畫布 |
繪製基本形狀 | drawPoint, drawPoints, drawLine, drawLines, drawRect, drawRoundRect, drawOval, drawCircle, drawArc | 依次為 點、線、矩形、圓角矩形、橢圓、圓、圓弧 |
繪製圖片 | drawBitmap, drawPicture | 繪製點陣圖和圖片 |
繪製文字 | drawText, drawPosText, drawTextOnPath | 依次為 繪製文字、繪製文字時指定每個文字位置、根據路徑繪製文字 |
繪製路徑 | drawPath | 繪製路徑,繪製貝塞爾曲線時也需要用到該函式 |
頂點操作 | drawVertices, drawBitmapMesh | 通過對頂點操作可以使影像形變,drawVertices直接對畫布作用、 drawBitmapMesh只對繪製的Bitmap作用 |
畫布剪裁 | clipPath, clipRect, clipRegion,getClipBounds | 畫布剪裁相關方法 |
畫布快照 | save, restore, saveLayer, saveLayerXxx, restoreToCount, getSaveCount | 依次為 儲存當前狀態、 回滾到上一次儲存的狀態、 儲存圖層狀態、 回滾到指定狀態、 獲取儲存次數 |
畫布變換 | translate, scale, rotate, skew | 依次為 位移、縮放、 旋轉、錯切 |
Matrix(矩陣) | getMatrix, setMatrix, concat | 實際畫布的位移,縮放等操作的都是影像矩陣Matrix,只不過Matrix比較難以理解和使用,故封裝了一些常用的方法。 |
Path常用操作速查表
API21以上,很不爽,得吐槽
作用 | 相關API | 備註 |
---|---|---|
移動起點 | moveTo | 移動下一次操作的起點位置 |
設定終點 | setLastPoint | 重置當前path中最後一個點位置,如果在繪製之前呼叫,效果和moveTo相同 |
連線直線 | lineTo | 新增上一個點到當前點之間的直線到Path |
閉合路徑 | close | 連線第一個點連線到最後一個點,形成一個閉合區域 |
新增內容 | addRect, addRoundRect, addOval, addCircle, addPath, addArc, arcTo | 新增(矩形, 圓角矩形, 橢圓, 圓, 路徑, 圓弧) 到當前Path (注意addArc和arcTo的區別) |
是否為空 | isEmpty | 判斷Path是否為空 |
是否為矩形 | isRect | 判斷path是否是一個矩形 |
替換路徑 | set | 用新的路徑替換到當前路徑所有內容 |
偏移路徑 | offset | 對當前路徑之前的操作進行偏移(不會影響之後的操作) |
貝塞爾曲線 | quadTo, cubicTo | 分別為二次和三次貝塞爾曲線的方法 |
rXxx方法 | rMoveTo, rLineTo, rQuadTo, rCubicTo | 不帶r的方法是基於原點的座標系(偏移量), rXxx方法是基於當前點座標系(偏移量) |
填充模式 | setFillType, getFillType, isInverseFillType, toggleInverseFillType | 設定,獲取,判斷和切換填充模式 |
提示方法 | incReserve | 提示Path還有多少個點等待加入(這個方法貌似會讓Path優化儲存結構) |
布林操作(API19) | op | 對兩個Path進行布林運算(即取交集、並集等操作) |
計算邊界 | computeBounds | 計算Path的邊界 |
重置路徑 | reset, rewind | 清除Path中的內容 reset不保留內部資料結構,但會保留FillType. rewind會保留內部的資料結構,但不保留FillType |
矩陣操作 | transform | 矩陣變換 |
Matrix常用操作速查表
方法類別 | 相關API | 備註 |
---|---|---|
基本方法 | equals hashCode toString toShortString | 比較、 獲取雜湊值、 轉換為字串 |
數值操作 | set reset setValues getValues | 設定、 重置、 設定數值、 獲取數值 |
數值計算 | mapPoints mapRadius mapRect mapVectors | 計算變換後的數值 |
設定(set) | setConcat setRotate setScale setSkew setTranslate | 設定變換 |
前乘(pre) | preConcat preRotate preScale preSkew preTranslate | 前乘變換 |
後乘(post) | postConcat postRotate postScale postSkew postTranslate | 後乘變換 |
特殊方法 | setPolyToPoly setRectToRect rectStaysRect setSinCos | 一些特殊操作 |
矩陣相關 | invert isAffine(API21) isIdentity | 求逆矩陣、 是否為仿射矩陣、 是否為單位矩陣 ... |
貝塞爾曲線常用操作速查表
表格中演示動畫均來自維基百科
貝塞爾曲線 | 對應的方法 | 演示動畫 |
---|---|---|
一階曲線 (線性曲線) |
lineTo | |
二階曲線 | quadTo | |
三階曲線 | cubicTo | |
四階曲線 | 無 |
自定義view進階參考資料
繪製機制
先好好的理解一下繪製流程 公共技術點之 View 繪製流程
GcsSloop---自定義View系列自定義
- 基礎篇
- 進階篇
- 安卓自定義View進階 - 分類和流程
- 安卓自定義View進階 - 繪製基本圖形
- 安卓自定義View進階 - 畫布操作
- 安卓自定義View進階 - 圖片文字
- 安卓自定義View進階 - Path基本操作
- 安卓自定義View進階 - 貝塞爾曲線
- 安卓自定義View進階 - Path完結篇(偽)
- 安卓自定義View進階 - Path玩出花樣(PathMeasure)
- 安卓自定義View進階 - Matrix原理
- 安卓自定義View進階 - Matrix詳解
- 安卓自定義View進階 - Matrix Camera
- 安卓自定義View進階 - 事件分發機制原理
- 安卓自定義View進階 - 事件分發機制詳解
- 安卓自定義View進階 - MotionEvent詳解
- 安卓自定義View進階 - 特殊形狀控制元件事件處理方案
- 安卓自定義View進階 - 多點觸控詳解
- 安卓自定義View進階 - 手勢檢測(GestureDetector)
愛哥的---自定義View其實很簡單
- 自定義控制元件其實很簡單1/12
- 自定義控制元件其實很簡單1/6
- 自定義控制元件其實很簡單1/4
- 自定義控制元件其實很簡單1/3
- 自定義控制元件其實很簡單5/12
- 自定義控制元件其實很簡單1/2
- 自定義控制元件其實很簡單7/12
- 自定義控制元件其實很簡單2/3
- 自定義控制元件其實很簡單3/4
劉某人程式設計師---Android繪圖機制
- Android繪圖機制(一)——自定義View的基礎屬性和方法
- Android繪圖機制(二)——自定義View繪製形, 圓形, 三角形, 扇形, 橢圓, 曲線,文字和圖片的座標講解
- Android繪圖機制(三)——自定義View的實現方式以及半弧圓新控制元件
- Android繪圖機制(四)——使用HelloCharts開源框架搭建一系列炫酷圖表,柱形圖,折線圖,餅狀圖和動畫特效,抽絲剝繭帶你認識圖表之美
Carson_Ho
- Canvas類的最全面詳解 - 自定義View應用系列
- Path類的最全面詳解 - 自定義View應用系列
- 自定義View基礎 - 最易懂的自定義View原理系列(1)
- 自定義View Measure過程 - 最易懂的自定義View原理系列(2)
- 自定義View Layout過程 - 最易懂的自定義View原理系列(3)
- 自定義View Draw過程- 最易懂的自定義View原理系列(4)
- 手把手教你寫一個完整的自定義View
- 最易懂的自定義View---自定義view講解集合
事件傳遞機制
還是先來理解事件傳遞機制公共技術點之 View 事件傳遞
- Carson_Ho Android事件分發機制詳解:史上最全面、最易懂
- Kelin 圖解 Android 事件分發機制
- milter 可能是講解Android事件分發最好的文章
- Idtk 更簡單的學習Android事件分發
- 希爾瓦娜斯女神 Android View事件機制 21問21答
屬性動畫
把動畫基礎瞭解好來,差不多就出師了公共技術點之 Android 動畫基礎
自定義view簡短篇
教你步步為營掌握自定義View
自定義View,有這一篇就夠了
自定義view開源專案練習
NumberProgressBar(程式碼家)
這個專案可以熟練掌握如何控制view在介面中的位子SmallChart
專案包括折線圖、曲線圖(可填充)、柱狀圖、扇形圖、雷達圖的繪製,讓你熟練使用draw()相關類。CircleImageView
一個圓形的ImageViewPhotoView
對ImageView支援各種手勢操作,縮放、移動、旋轉...熟練掌握手勢操作。MPAndroidChart
MPAndroidChart是一款基於Android的開源圖表庫,MPAndroidChart不僅可以在android裝置上繪製各種統計圖表,而且可以對圖表進行拖動和縮放操作,應用起來非常靈活。MPAndroidChart同樣擁有常用的圖表型別:線型圖、餅圖、柱狀圖和散點圖。Side-Menu.Android
分類側滑選單,吊炸天的效果WilliamChart
繪製圖表的庫,支援LineChartView、BarChartView和StackBarChartView三中圖表型別circular-progress-button
帶進度顯示的Button,讓操作更炫酷Context-Menu.Android
可以方便快速整合漂亮帶有動畫效果的上下文選單ToggleButton
狀態切換的 Button,類似 iOS,用 View 實現InstaMaterial
Instagram的一組Material 風格的概念設計sweet-alert-dialog
一個帶動畫效果的自定義對話方塊樣式重新整理控制元件集合 適合好好coding一遍
把這些coding好了,做一個自己專屬的重新整理控制元件指日可待以上開源專案選擇不同型別的擼一個,有空擼個遍,以後覺得是自定義view的大神
建議
參考寫現在很火的開源專案的自定義view時,先看看他的效果,然後再自己動腦動手去寫,每一個問題都有多種解決方案,開源出來的並不一定是最好的,用自己的思路去寫再和別人開源的做對比,取長補短,然後在自定義view這塊的造詣將會更深。
簡單來說:看效果--->動腦動手寫--->對比取長補短