自定義view總結

madreain發表於2017-08-23

一個高階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其實很簡單

劉某人程式設計師---Android繪圖機制

Carson_Ho

事件傳遞機制

還是先來理解事件傳遞機制公共技術點之 View 事件傳遞

屬性動畫

把動畫基礎瞭解好來,差不多就出師了公共技術點之 Android 動畫基礎

自定義view簡短篇

教你步步為營掌握自定義View
自定義View,有這一篇就夠了

自定義view開源專案練習

  1. NumberProgressBar(程式碼家)
    這個專案可以熟練掌握如何控制view在介面中的位子

  2. SmallChart
    專案包括折線圖、曲線圖(可填充)、柱狀圖、扇形圖、雷達圖的繪製,讓你熟練使用draw()相關類。

  3. CircleImageView
    一個圓形的ImageView

  4. PhotoView
    對ImageView支援各種手勢操作,縮放、移動、旋轉...熟練掌握手勢操作。

  5. AndroidSwipeLayout
    綜合

  6. MPAndroidChart
    MPAndroidChart是一款基於Android的開源圖表庫,MPAndroidChart不僅可以在android裝置上繪製各種統計圖表,而且可以對圖表進行拖動和縮放操作,應用起來非常靈活。MPAndroidChart同樣擁有常用的圖表型別:線型圖、餅圖、柱狀圖和散點圖。

  7. Side-Menu.Android
    分類側滑選單,吊炸天的效果

  8. WilliamChart
    繪製圖表的庫,支援LineChartView、BarChartView和StackBarChartView三中圖表型別

  9. circular-progress-button
    帶進度顯示的Button,讓操作更炫酷

  10. Context-Menu.Android
    可以方便快速整合漂亮帶有動畫效果的上下文選單

  11. ToggleButton
    狀態切換的 Button,類似 iOS,用 View 實現

  12. InstaMaterial
    Instagram的一組Material 風格的概念設計

  13. sweet-alert-dialog
    一個帶動畫效果的自定義對話方塊樣式

  14. 重新整理控制元件集合 適合好好coding一遍
    把這些coding好了,做一個自己專屬的重新整理控制元件指日可待

    以上開源專案選擇不同型別的擼一個,有空擼個遍,以後覺得是自定義view的大神

建議

參考寫現在很火的開源專案的自定義view時,先看看他的效果,然後再自己動腦動手去寫,每一個問題都有多種解決方案,開源出來的並不一定是最好的,用自己的思路去寫再和別人開源的做對比,取長補短,然後在自定義view這塊的造詣將會更深。

簡單來說:看效果--->動腦動手寫--->對比取長補短

個人部落格

github

相關文章