Android自定義View相關Api

自定義View

對自定義View一直很模糊,剛好最近不太忙,系統性的總結一下。自定義View主要有以下幾個知識點:

  • Canvas:可以它為一個畫布,用于承載View中的所有元素(基礎)
  • Paint:作為畫筆的存在,用來加特效的(基礎)
  • 裁切和幾何變換:通過限定在某些區域繪制以及對view進行變換達到指定效果(進階)

Canvas

  • 可以通過drawXxx()方法畫出下列簡單圖形:

    • drawCircle():圓
    • drawPoint():點
    • drawLine():線
    • drawLines():多條線
    • drawRect():長方形
    • drawArc():弧
    • drawOwal():橢圓
    • drawRoundRect():圓角矩形
  • 通過drawPath()畫出復雜的圖形

  • 通過drawBitmap()畫圖片

  • 通過drawText()畫圖片

Paint

  • setColor():設置顏色

  • setShader(Shader shader):設置著色器,Shader有以下幾種子類:

    • LinearGradient 線性漸變,兩個點之間的顏色線性漸變

      Shader.TileMode,著色規則有三種,CLAMP、MIRROR、REPEAT,以下同。
      
    • RadialGradient 輻射漸變,從圓心向四周進行輻射漸變

    • SweepGradient 掃描漸變,從圓的0角度,旋轉進行掃描漸變

    • BitmapShader 圖片著色器,將圖片作為著色器,比如可以用來做圓型頭像的裁剪

    • ComposeShader 混合著色器,一個Paint中使用兩個著色器,混合用

      PorterDuff.Mode,是用來指定兩個著色器公共繪制時的顏色策略,是一個enum,共17個。
      大體分為兩類,Alpha 合成 (Alpha Compositing)、混合 (Blending)

  • setColorFilter(ColorFilter colorFilter):為繪制設置顏色的過濾。可用于制作濾鏡效果。ColorFilter有三個子類:

    • LightingColorFilter,用來模擬簡單的光照效果。
    • PorterDuffColorFilter,使用一個指定的顏色和一種指定的 PorterDuff.Mode 來與繪制對象進行合成。
    • ColorMatrixColorFilter,使用一個 ColorMatrix 來對顏色進行處理,是一個4*5的矩陣(有點厲害,不知道怎么用),StyleImageView
  • setXfermode(Xfermode xfermode),只有一個子類PorterDuffXfermode

  • setAntiAlias (boolean aa) 設置抗鋸齒

  • setStyle(Paint.Style style)

  • setStrokeWidth(float width)

  • setStrokeCap(Paint.Cap cap)

  • setStrokeJoin(Paint.Join join)

  • setStrokeMiter(float miter)

  • setDither(boolean dither)

  • setFilterBitmap(boolean filter)設置是否使用雙線性過濾來繪制 Bitmap 。

  • setPathEffect(PathEffect effect):PathEffect 分為兩類,單一效果的 CornerPathEffect DiscretePathEffect DashPathEffect PathDashPathEffect ,和組合效果的 SumPathEffect ComposePathEffect。

  • setShadowLayer(float radius, float dx, float dy, int shadowColor)

  • setMaskFilter(MaskFilter maskfilter)

  • setTextSize()等

范圍裁切和自由變換

  • 范圍裁切

    使用canvas的clipRect()和clipPath(),這兩個方法進行裁切,注意使用Canvas.save()和Canvas.restore()保存和恢復Canvas的狀態

  • 自由變換

    • 使用 Canvas 來做常見的二維變換;

      Canvas.translate(float dx, float dy) 平移
      Canvas.rotate(float degrees, float px, float py) 旋轉
      Canvas.scale(float sx, float sy, float px, float py) 放縮
      Canvas.skew(float sx, float sy) 錯切

    • 使用 Matrix 來做常見和不常見的二維變換;

      1.創建 Matrix 對象;
      2.調用 Matrix 的 pre/postTranslate/Rotate/Scale/Skew() 方法來設置幾何變換;
      3.使用 Canvas.setMatrix(matrix) 或 Canvas.concat(matrix) 來把幾何變換應用到 Canvas。
      4.Matrix.setPolyToPoly(float[] src, int srcIndex, float[] dst, int dstIndex, int pointCount) 用點對點映射的方式設置變換

    • 使用 Camera 來做三維變換。 Camera 的三維變換有三類:旋轉、平移、移動相機。注意使用Camera的sava()、restore()、reset()等方法,大致與Canvas的類似

      1.旋轉:Camera.rotateX(),Camera.rotateY(),Camera.rotateZ(),Camera.rotate() 三維旋轉;注意Camera的旋轉中心,一般的需要配合Canvas的translate(),將旋轉中心切換為遠點進行旋轉;然后用camera.applyToCanvas(canvas); // 把旋轉投影到 Canvas
      2.平移:Camera.translate(float x, float y, float z)
      3.移動相機:Camera.setLocation(x, y, z) 設置虛擬相機的位置,注意這個方法它的參數的單位不是像素,而是 inch,英寸

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。