介紹
Paint:畫筆
方法
paint.setColor(Color.RED);// 設(shè)置顏色
paint.setARGB(255, 255, 255, 0); // 設(shè)置 Paint對象顏色,范圍為0~255
paint.setAlpha(200); // 設(shè)置alpha不透明度,范圍為0~255
paint.setAntiAlias(true); // 抗鋸齒
paint.setStyle(Paint.Style.FILL); //描邊效果
paint.setStrokeWidth(4);//描邊寬度
paint.setStrokeCap(Paint.Cap.ROUND); //圓角效果
paint.setStrokeJoin(Paint.Join.MITER);//拐角風(fēng)格
paint.setShader(new SweepGradient(200, 200, Color.BLUE, Color.RED)); //設(shè)置環(huán)形渲染器
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DARKEN)); //設(shè)置圖層混合模式
paint.setColorFilter(new LightingColorFilter(0x00ffff, 0x000000)); //設(shè)置顏色過濾器
Paint.Style
分為三種:
paint.setStyle(Paint.Style.FILL); //填充所有
paint.setStyle(Paint.Style.STROKE); //描邊效果,只畫出線條
paint.setStyle(Paint.Style.FILL_AND_STROKE); //填充內(nèi)部和描邊
Paint.cap
paint.setStrokeCap(Paint.Cap.BUTT); //默認(rèn)效果,如繪制的正方形,就是正方行
paint.setStrokeCap(Paint.Cap.ROUND); //繪制的圖形兩邊會有圓角效果粗截,兩邊的圓角是在SQUARE 的基礎(chǔ)上延申出一部分形成圓角
paint.setStrokeCap(Paint.Cap.SQUARE); //BUTT 的基礎(chǔ)上凰锡,兩邊延申出去一部分
image.png
Paint.Join
paint.setStrokeJoin(Paint.Join.MITER);//拐角風(fēng)格,直角
paint.setStrokeJoin(Paint.Join.BEVEL);//拐角風(fēng)格昼牛,切割
paint.setStrokeJoin(Paint.Join.ROUND);//拐角風(fēng)格统台,圓角
image.png
測量字體的高度
String text = "測試文本的高度";
canvas.drawText(text,0,100,paint);
//創(chuàng)建一個空的矩陣
Rect rect = new Rect();
paint.getTextBounds(text,0,text.length(), rect);
int width = rect.width();
int height = rect.height();
Log.i("打印","通過rect獲取到的寬度 ==== "+width);
Log.i("打印","通過rect獲取到的高度 ==== "+height);
// FontMetrics
Paint.FontMetrics fontMetrics = paint.getFontMetrics();
int top = (int) fontMetrics.top;
int ascent = (int) fontMetrics.ascent;
int bottom = (int) fontMetrics.bottom;
int descent = (int) fontMetrics.descent;
int leading = (int) fontMetrics.leading;
Log.i("打印","FontMetrics top ==== "+top);
Log.i("打印","FontMetrics ascent ==== "+ascent);
Log.i("打印","FontMetrics bottom ==== "+bottom);
Log.i("打印","FontMetrics descent ==== "+descent);
Log.i("打印","FontMetrics leading ==== "+leading);
int FontMetricsHeight = descent + Math.abs(ascent);
Log.i("打印","通過FontMetrics獲取到的高度奄容,真實的高度 ==== "+FontMetricsHeight);
paint.setShader 設(shè)置渲染器
線性渲染
/**
* 1.線性渲染,LinearGradient(float x0, float y0, float x1, float y1, @NonNull @ColorInt int colors[], @Nullable float positions[], @NonNull TileMode tile)
* (x0,y0):漸變起始點坐標(biāo)
* (x1,y1):漸變結(jié)束點坐標(biāo)
* color0:漸變開始點顏色,16進(jìn)制的顏色表示冰更,必須要帶有透明度
* color1:漸變結(jié)束顏色
* colors:漸變數(shù)組
* positions:位置數(shù)組,position的取值范圍[0,1],作用是指定某個位置的顏色值昂勒,如果傳null蜀细,漸變就線性變化。
* tile:用于指定控件區(qū)域大于指定的漸變區(qū)域時戈盈,空白區(qū)域的顏色填充方法,分為三種:CLAMP(最后1像素拉伸) REPEAT(重復(fù)) MIRROR(鏡影)
*/
//渲染一個x和y的坐標(biāo)點是250的奠衔,顏色是從綠色到紅色漸變,在0.6f(60%)的時候開始漸變成紅色奕谭,1 最后是藍(lán)色 涣觉,繪制區(qū)域大于渲染器指定區(qū)域的填充是1像素拉伸
Shader lineShader = new LinearGradient(0, 0, 250, 250, new int[]{Color.GREEN, Color.RED,Color.BLUE}, new float[]{0, 0.6f, 1}, Shader.TileMode.REPEAT);
paint.setShader(lineShader);
畫圓效果
//drawCircle(float cx, float cy, float radius, @NonNull Paint paint)
//cx:要畫的圓的中心點x坐標(biāo),cy:要畫的圓的中心點y坐標(biāo)血柳,radius:畫的圓的半徑
canvas.drawCircle(125,125,125,paint);
image.png
畫矩形效果
//drawRect(float left, float top, float right, float bottom, @NonNull Paint paint)
//left:畫的巨型的左邊起始位置官册,top:上邊其實位置 right:右側(cè)位置 bottom:底部位置
canvas.drawRect(0,0,500,500,paint);
image.png
環(huán)形渲染
/**
* 環(huán)形渲染抄淑,RadialGradient(float centerX, float centerY, float radius, @ColorInt int colors[], @Nullable float stops[], TileMode tileMode)
* centerX ,centerY:shader的中心坐標(biāo)农曲,開始漸變的坐標(biāo)
* radius:漸變的半徑
* centerColor,edgeColor:中心點漸變顏色,邊界的漸變顏色
* colors:漸變顏色數(shù)組
* stoops:漸變位置數(shù)組欧聘,類似掃描漸變的positions數(shù)組根吁,取值[0,1],中心點為0员淫,半徑到達(dá)位置為1.0f
* tileMode:shader未覆蓋以外的填充模式。
*/
Shader shader = new RadialGradient(250, 250, 250, new int[]{Color.GREEN, Color.YELLOW, Color.RED}, null, Shader.TileMode.REPEAT);
paint.setShader(shader);
canvas.drawCircle(250, 250, 250, paint);
image.png
矩形
canvas.drawRect(0,0,500,500,paint);
畫布的大小是500击敌,生于部分重復(fù)填充
image.png
掃描渲染
//掃描渲染,順時針方向逐漸漸變渲染
/**SweepGradient(float cx, float cy, @ColorInt int color0,int color1)
* cx,cy 漸變中心坐標(biāo)
* color0,color1:漸變開始結(jié)束顏色
* colors介返,positions:類似LinearGradient,用于多顏色漸變,positions為null時,根據(jù)顏色線性漸變
*/
Shader shader = new SweepGradient(250, 250, Color.RED, Color.GREEN);
paint.setShader(shader);
canvas.drawCircle(250, 250, 250, paint);
image.png
位圖渲染
/** 位圖渲染沃斤,BitmapShader(@NonNull Bitmap bitmap, @NonNull TileMode tileX, @NonNull TileMode tileY)
* Bitmap:構(gòu)造shader使用的bitmap
* tileX:X軸方向的TileMode
* tileY:Y軸方向的TileMode
REPEAT, 繪制區(qū)域超過渲染區(qū)域的部分圣蝎,重復(fù)排版
CLAMP, 繪制區(qū)域超過渲染區(qū)域的部分衡瓶,會以最后一個像素拉伸排版
MIRROR, 繪制區(qū)域超過渲染區(qū)域的部分徘公,鏡像翻轉(zhuǎn)排版
*/
Bitmap mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.timg);
Shader mShader = new BitmapShader(mBitmap, Shader.TileMode.REPEAT, Shader.TileMode.MIRROR);
paint.setShader(mShader);
canvas.drawRect(0, 0, 500, 500, paint);
image.png
為徒渲染圓形效果
canvas.drawCircle(250, 250, 250, paint);
image.png
組合渲染
/**
* 組合渲染,
* ComposeShader(@NonNull Shader shaderA, @NonNull Shader shaderB, Xfermode mode)
* ComposeShader(@NonNull Shader shaderA, @NonNull Shader shaderB, PorterDuff.Mode mode)
* shaderA,shaderB:要混合的兩種shader
* Xfermode mode: 組合兩種shader顏色的模式
* PorterDuff.Mode mode: 組合兩種shader顏色的模式
* PorterDuff.Mode.MULTIPLY :
*/
Bitmap mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.timg);
BitmapShader bitmapShader = new BitmapShader(mBitmap, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);
LinearGradient linearGradient = new LinearGradient(0, 0, 1000, 1600, new int[]{Color.RED, Color.GREEN, Color.BLUE}, null, Shader.TileMode.CLAMP);
Shader shader = new ComposeShader(bitmapShader, linearGradient, PorterDuff.Mode.MULTIPLY);
paint.setShader(shader);
canvas.drawCircle(250, 250, 250, paint);
image.png