上一篇自定義View(一)中 已經記錄了View繪製的整個流程,
接下來,我要做的是記錄一些自定義View之前需要記錄的東西,是什麼呢?就是Graphics 2D,爲什麼記錄它呢?會自定義View的人都知道,我們的簡單的點、線、面等等各種圖形都是通過它畫出來的,我是這麼記得 ,具體畫的當然另有對象了,
一、Point和PointF 類 在Graphics 2D 中表示一個點,當然它的初始化等都相對簡單了,就沒有必要記錄,
二、Rect和RectF 表示矩形
三、Bitmap和bitmapDrawable 位圖
四、真正的繪製將會是在Canvas 和 Paint 類完成
1、canvas 在android中比翻譯爲畫布:它具有一些我們需要的方法,就是畫,具體的畫什麼呢?比如:畫線、矩形、圓、文字、路徑、位圖等等
2、paint 畫筆,他是一個輕量級的組件,它有一些屬性,將是在開發中我們經常用到的,比如:設置筆的粗細、顏色、抗鋸齒等等。
上面這些具體的東西我不會在記錄因爲需要的時候可以看源碼,或者去看《Android自定義組件開發詳解》李贊紅 寫的,
我將記錄學習的時候的例子
4.1 :畫位圖 在Canvas中畫位圖有三個方法
public void drawBitmap(@NonNull Bitmap bitmap, float left, float top, @Nullable Paint paint) { throwIfCannotDraw(bitmap); native_drawBitmap(mNativeCanvasWrapper, bitmap, left, top, paint != null ? paint.getNativeInstance() : 0, mDensity, mScreenDensity, bitmap.mDensity); }該方法最爲簡單,爲什麼呢?將指定的bitmap繪製在畫布上,然後指定位圖相對於畫布的位置大小,繪製的時候一般paint穿null就OK了,當然要計算繪製位圖的時候除外,還要傳paint對象
public void drawBitmap(@NonNull Bitmap bitmap, @Nullable Rect src, @NonNull RectF dst, @Nullable Paint paint)
public void drawBitmap(@NonNull Bitmap bitmap, @Nullable Rect src, @NonNull Rect dst, @Nullable Paint paint)這兩個方法,從bitmap中取出一塊區域大小爲src 的圖片並且繪製到canvas 的dst處,這兩者的比例關係嚴重影響到最終位圖的繪製效果代碼
/** * 現將位圖繪製在空白位圖上 * 再將位圖設置到ImageView上 */ class ApisActivity : Activity() { private var mCanvas: Canvas? = null private var mImage:ImageView? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_apis) findViewById() drawBitmap() } private fun findViewById(){ mImage = findViewById(R.id.image) as ImageView } /** * 繪製兩張圖片,一張按照原大小繪製,另一張放大3陪 */ private fun drawBitmap() { var createBitmap:Bitmap = Bitmap.createBitmap(500, 800, Bitmap.Config.ARGB_8888) mCanvas = Canvas(createBitmap) val bitmap:Bitmap = BitmapFactory.decodeResource(resources,R.mipmap.ic_launcher) //原大小繪製 mCanvas?.drawBitmap(bitmap,0F,0F,null) //對圖片進行縮放 val width:Int = createBitmap.width val height:Int = createBitmap.height //從圖中取出的src val mRect: Rect = Rect(0,0,width,height) //繪製到canvas中dst val mRectD: Rect = Rect(0,height,width.times(3),height.times(3).plus(height)) mCanvas?.drawBitmap(createBitmap,mRect,mRectD,null) mImage?.setImageBitmap(createBitmap) } }
還有很多繪製的東西,但是今天沒時間了,後面有機會在將這篇文章記錄完