自定義View (二)

上一篇自定義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)
    }

}

還有很多繪製的東西,但是今天沒時間了,後面有機會在將這篇文章記錄完



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章