一個畫圖需要四大基本要素: 1、一個用來保存像素的Bitmap; 2、一個Canvas畫布,繪制Bitmap操作; 3、繪制的東西 4、繪制的畫筆Paint(顏色和樣式)
Canvas大致可以分為三類方法: 1. save、restore 等與層的保存和回滾相關的方法; 2. scale、rotate、clipXXX 等對畫布進行操作的方法; 3. drawXXX 等一系列繪畫相關的方法;
如何獲得一個Canvas對象。 Canvas對象的獲取方式有三種: 第一種我們通過重寫View.onDraw方法,View中的Canvas對象會被當做參數傳遞過來,我們操作這個Canvas,效果會直接反應在View中。 第二種就是當你想自己創建一個Canvas對象。從上面的基本要素可以明白,一個Canvas對象一定是結合了一個Bitmap對象的。所以一定要為一個Canvas對象設置一個Bitmap對象。
//得到一個Bitmap對象,當然也可以使用別的方式得到。但是要注意,改bitmap一定要是mutable(異變的) Bitmap b = Bitmap.createBitmap(100,100, Bitmap.Config.ARGB_8888); Canvas c = new Canvas(b); /*先new一個Canvas對象,在調用setBitmap方法,一樣的效果 * Canvas c = new Canvas(); * c.setBitmap(b); */第三種方式,是調用SurfaceHolder.lockCanvas(),返回一個Canvas對象。
1.Canvas 的左上角是(0,0); 2.基于左上角往右 X 為正,往下 Y 為正,反之為負; 3.移動單位為px
canvas和顯示沒關系,只影響畫圖的坐標系。畫布的平移旋轉等操作,可以視為坐標系的操作。
//平移public void translate(float dx, float dy) {//畫布移動x、y的距離}//縮放public void scale(float sx, float sy) {//畫布x、y方向縮放倍率,使用默認基準點(原點 0,0)} public final void scale(float sx, float sy, float px, float py) {//畫布x、y方向縮放倍率,使用基準點(px,py)}//旋轉 public void rotate(float degrees) {//畫布旋轉角度,旋轉中心:畫布原點(0,0)}public final void rotate(float degrees, float px, float py) {//畫布旋轉角度,旋轉中心坐標(px,py)} 藍色的是手機屏幕邊框,紅色的是一個全屏的canvas
當canvas旋轉30度之后,其實成了這個樣子,但是你繪制的圖形還是只能在canvas內,并且坐標是按照canvas旋轉之前來的,也就是左上角坐標仍然是(0,0),右下角的坐標仍然是(width,height)。圖片永遠畫在canvas中的,圖片相對于canvas是沒有任何變化的。
1)填充 drawARGB(int a, int r, int g, int b) drawColor(int color) drawRGB(int r, int g, int b) drawColor(int color, PorterDuff.Mode mode) 2)幾何圖形
//弧,扇形public void drawArc(@NonNull RectF oval, float startAngle, float sweepAngle, boolean useCenter, @NonNull Paint paint) {//弧所在矩形,起始角度,掃過角度(正方形:順時針),是否使用中心,畫筆}public void drawArc(float left, float top, float right, float bottom, float startAngle,float sweepAngle, boolean useCenter, @NonNull Paint paint) {//弧所在矩形的左上右下坐標,起始角度,掃過角度(正方形:順時針),是否使用中心,畫筆}//圓public void drawCircle(float cx, float cy, float radius, @NonNull Paint paint) {//圓心坐標,半徑,畫筆}//橢圓 public void drawOval(@NonNull RectF oval, @NonNull Paint paint) {//橢圓所在矩形,畫筆}public void drawOval(float left, float top, float right, float bottom, @NonNull Paint paint) {//橢圓所在矩形左上角右下角坐標,畫筆}//點public void drawPoint(float x, float y, @NonNull Paint paint) {//點的xy,畫筆}//矩形public void drawRect(@NonNull Rect r, @NonNull Paint paint) {//矩形,畫筆}public void drawRect(@NonNull RectF rect, @NonNull Paint paint) {//矩形(坐標為浮點型),畫筆}public void drawRect(float left, float top, float right, float bottom, @NonNull Paint paint) {//矩形左上右下坐標,畫筆}//圓角矩形public void drawRoundRect(@NonNull RectF rect, float rx, float ry, @NonNull Paint paint) {//圓角矩形所在矩形,x方向圓角半徑,y方向圓角半徑,畫筆}public void drawRoundRect(float left, float top, float right, float bottom, float rx, float ry, @NonNull Paint paint) {//圓角矩形所在矩形的左上右下坐標,x方向圓角半徑,y方向圓角半徑,畫筆}//線public void drawLine(float startX, float startY, float stopX, float stopY,@NonNull Paint paint) {//線:起點坐標,終點坐標,畫筆}3)圖片 canvas.drawBitmap (位圖) canvas.drawPicture (圖片) 4)文本
public void drawText(@NonNull CharSequence text, int start, int end, float x, float y,@NonNull Paint paint) {//文本,文本的截取(start,end),(x,y)默認文本的左下角,若設置mTextPaint.setTextAlign(Paint.Align.CENTER);則為文本的水平中心位置,畫筆}public void drawText(@NonNull String text, float x, float y, @NonNull Paint paint) {//文本,(x,y)默認文本的左下角,若設置mTextPaint.setTextAlign(Paint.Align.CENTER);則為文本的水平中心位置,畫筆}5、path
public void drawPath(@NonNull Path path, @NonNull Paint paint) {//path,畫筆}在save到restore之間所畫的圖的操作,restore之后的代碼不受影響 。 save保存畫布,讓后續操作類似在新的圖層上操作一樣,restore類似合并圖層,讓save前的圖層與save后的圖層合并。
reset() 重置畫筆 setColor(int color) 給畫筆設置顏色值 setARGB(int a, int r, int g, int b) 同樣是設置顏色,但是利用ARGB分開設置 setAlpha(int a) 設置畫筆透明度 setStyle(Paint.Style style) 設置畫筆樣式,取值有 Paint.Style.FILL :填充內部 Paint.Style.FILL_AND_STROKE :填充內部和描邊 Paint.Style.STROKE :僅描邊 setStrokeWidth(float width) 設置畫筆寬度 setAntiAlias(boolean aa) 設置畫筆是否抗鋸齒 左邊無抗鋸齒,右邊抗鋸齒 setDither() 該方法是設置防抖動。
無防抖
有防抖 setStrokeCap(Paint.Cap cap) 設置線帽樣式,取值有 Cap.ROUND(圓形線帽)、 Cap.SQUARE(方形線帽)、 Paint.Cap.BUTT(無線帽)
setStrokeJoin(Paint.Join join) 設置線段連接處樣式,參數取值有: Join.MITER(結合處為銳角) Join.Round(結合處為圓弧) Join.BEVEL(結合處為直線)
setShader(Shader shader) 設置漸變效果 設置圖像效果,使用Shader可以繪制出各種漸變效果; Shader下面有五個子類可用: BitmapShader :位圖圖像渲染 LinearGradient:線性渲染 RadialGradient:環形渲染 SweepGradient:掃描漸變渲染/梯度渲染 ComposeGradient:組合渲染,可以和其他幾個子類組合起來使用 這幾個類中LinearGradient、RadialGradient、SweepGradient均是可以將顏色進行處理,形成柔和的過渡,也可以稱為漸變,而BitmapShader 則是直接使用位圖進行渲染,就類似于貼圖,在貼圖的過程中根據需要自然就可以選擇相應的模式,有三種模式可供選擇,分別是: 枚舉: emun Shader.TileMode 定義了平鋪的3種模式: static final Shader.TileMode CLAMP: 邊緣拉伸,即使用邊緣的最后一個像素進行延展; static final Shader.TileMode MIRROR:在水平方向和垂直方向交替景象, 兩個相鄰圖像間沒有縫隙,從名稱上看就像照鏡子一樣; Static final Shader.TillMode REPETA:在水平方向和垂直方向重復擺放,兩個相鄰圖像間有縫隙縫隙;
setShadowLayer(float radius ,float dx,float dy,int color) 在圖形下面設置陰影層,產生陰影效果,radius為陰影的角度,dx和dy為陰影在x軸和y軸上的距離,color為陰影的顏色
setColorFilter(ColorFilter filter) 設置顏色過濾器,可以通過顏色過濾器過濾掉對應的色值,比如去掉照片顏色,生成老照片效果;
setPathEffect(PathEffect effect); //設置繪制路徑的效果,如點畫線等,給path設置樣式(效果)
Canvas沿著路徑繪制圖形,我們可以這樣來定義一條路徑:(1)構造一個Path對象;(2)調用Path的moveTo(x,y)方法設定路徑的起點;(3)調用lineTo(x,y)方法設定下一個點的位置。 (1)設置Path路徑效果:首先需要創建一個PathEffect子類對象,然后再調用Paint的setPathEffect(PathEffect p)方法即可。 (2)沿著路徑繪制文本:首先需要設定路徑的形狀,然后設置好畫筆并調用Canvas的drawPath(Path path,Paint paint)方法沿著路徑繪制圖形,最后調用Canvas的drawTextOnPath(String text, Path path, float hOffset, float vOffset, Paint paint)方法繪制路徑文本,其中hOffset為相對于路徑起點距離的水平位置,hOffset為相對于路徑上或下距離。
moveTo(x,y): 不會進行繪制,只用于移動移動畫筆,確定起點坐標,與其他方法配合使用; lineTo(x,y): 一階貝塞爾曲線,坐標為終點坐標,配合moveTo方法用于進行直線繪制; quadTo (x1,y1,x2,y2): 二階貝塞爾曲線,(x1,y1) 為控制點,(x2,y2)為結束點,用于繪制圓滑的曲線; cubicTo(x1, y1, x2, y2, x3, y3): 三階貝塞爾曲線, (x1,y1) 為控制點,(x2,y2)為控制點,(x3,y3) 為結束點,用于繪制復雜的曲線。
參考
自定義控件三部曲之繪圖篇(七)——Paint之函數大匯總
Paint、Canvas、Matrix使用講解(一、Paint)
Android筆記二十八.Android繪圖深度解析
新聞熱點
疑難解答