一、Paint的基本實用方法和技巧
1 .負責圖形繪製相關
//重置
mPaint.reset();
mPaint.setColor(Color.RED);
mPaint.setAlpha(255);
//設置畫筆的樣式
// mPaint.setStyle(Paint.Style.FILL);//填充內容
// mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
mPaint.setStyle(Paint.Style.STROKE);//描邊
//畫筆的寬度
mPaint.setStrokeWidth(50);
//線帽
// mPaint.setStrokeCap(Paint.Cap.BUTT);//沒有
mPaint.setStrokeCap(Paint.Cap.ROUND);//圓形
// mPaint.setStrokeCap(Paint.Cap.SQUARE);//方形
// mPaint.setStrokeJoin(Paint.Join.MITER);//銳角
// mPaint.setStrokeJoin(Paint.Join.ROUND);//圓弧
// mPaint.setStrokeJoin(Paint.Join.BEVEL);//直線
//線段的連接處的樣式
// mPaint.setStrokeJoin(Paint.Join.MITER);//銳角
// mPaint.setStrokeJoin(Paint.Join.ROUND);//圓弧
// mPaint.setStrokeJoin(Paint.Join.BEVEL);//直線
//防鋸齒,會損失一定的性能
mPaint.setAntiAlias(true);
2 .負責文字繪製相關
//獲得字符行間距
// mPaint.getFontSpacing();
//獲得字符之間的間距
// mPaint.getLetterSpacing();
// mPaint.setLetterSpacing(letterSpacing)//設置
//設置文本刪除線
// mPaint.setStrikeThruText(true);
//是否設置下劃線
// mPaint.setUnderlineText(true);
//設置文本大小
// mPaint.setTextSize(textSize);
// mPaint.getTextSize();
// mPaint.setTypeface(Typeface.BOLD);//設置字體類型
// Typeface.ITALIC
// Typeface.create(familyName, style)//加載自定義字體
//文字傾斜 默認0,官方推薦的-0.25f是斜體
// mPaint.setTextSkewX(-0.25f);
//文本對齊方式
// mPaint.setTextAlign(Align.LEFT);
// mPaint.setTextAlign(Align.CENTER);
// mPaint.setTextAlign(Align.RIGHT);
//計算制定長度的字符串(字符長度、字符個數、顯示的時候真實的長度)
// int breadText = mPaint.breakText(text, measureForwards, maxWidth, measuredWidth)
mPaint.setTextSize(50);
// float[] measuredWidth = new float[1];
// int breakText = mPaint.breakText(str, true, 200, measuredWidth);
// Log.i("RICKY", "breakText="+breakText+", str.length()="+str.length()+", measredWidth:"+measuredWidth[0]);
// Rect bounds獲取文本的矩形區域(寬高)
// mPaint.getTextBounds(text, index, count, bounds)
// mPaint.getTextBounds(text, start, end, bounds)
//獲取文本的寬度,和上面類似,但是是一個比較粗略的結果
float measureText = mPaint.measureText(str);
//獲取文本的寬度,和上面類似,但是是比較精準的。
float[] measuredWidth = new float[10];
//measuredWidth得到每一個字符的寬度;textWidths字符數
int textWidths = mPaint.getTextWidths(str, measuredWidth);
// mPaint.getTextWidths(text, start, end, widths)
Log.i("RICKY", "measureText:"+measureText+", textWidths:"+textWidths);
3.基線的問題
FontMetrics fontMetrics = mPaint.getFontMetrics();
fontMetrics.top;
fontMetrics.ascent;
fontMetrics.descent;
fontMetrics.bottom;
所有的四個值都是以基線baseLine爲基準來計算的。baseline以上的就是負的;以下的是正的。
在做自定義控件的時候canvas.drawText(x,y) 這個y並不是text的左上角,而是以baseline爲基準的。
1)實例:指定左上角的頂點座標 繪製文本
公式: float baselineY = Y - fontMetrics.top;
2)實例:指定中間位置,繪製文本
公式: float baselineY = centerY + (fontMetrics.bottom-fontMetrics.top)/2 - fontMetrics.bottom
4.Paint畫筆的高級技能
渲染 Shader:
BimapShader位圖的圖像渲染器
LinearGradient線性渲染
RadialGradient環形渲染
水波紋效果,充電水波紋擴散效果、調色板
SweepGradient梯度渲染(掃描渲染)
微信等雷達掃描效果。手機衛士垃圾掃描
ComposeShader組合渲染
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawColor(Color.WHITE);
// canvas.drawBitmap(bitmap, 0, 0, paint);
/**
* TileMode.CLAMP 拉伸最後一個像素去鋪滿剩下的地方
* TileMode.MIRROR 通過鏡像翻轉鋪滿剩下的地方。
* TileMode.REPEAT 重複圖片平鋪整個畫面(電腦設置壁紙)
*/
// bitmapShader = new BitmapShader(bitmap, TileMode.CLAMP, TileMode.MIRROR);
// bitmapShader = new BitmapShader(bitmap, TileMode.CLAMP, TileMode.CLAMP);
bitmapShader = new BitmapShader(bitmap, TileMode.REPEAT, TileMode.REPEAT);
paint.setShader(bitmapShader);
// paint.setAntiAlias(true);
//設置像素矩陣,來調整大小,爲了解決寬高不一致的問題。
// float scale = Math.max(width, height)*1.0f/Math.min(width, height);
// Matrix matrix = new Matrix();
// matrix.setScale(scale, scale);//縮放比例
// bitmapShader.setLocalMatrix(matrix);
// canvas.drawRect(new Rect(0, 0, 800, 800), paint);
// canvas.drawCircle(height/2, height/2, height/2, paint);
// canvas.drawCircle(Math.min(width, height)/2f, scale*Math.max(width, height)/2f, Math.max(width, height)/2f, paint);
// canvas.drawOval(new RectF(0, 0, width, height), paint);
// canvas.drawOval(new RectF(0, 0, width, width), paint);
//通過shapeDrawable也可以實現
// ShapeDrawable shapeDrawable = new ShapeDrawable(new OvalShape());
// shapeDrawable.getPaint().setShader(bitmapShader);
// shapeDrawable.setBounds(0, 0, width, width);
// shapeDrawable.draw(canvas);
/**線性漸變
* x0, y0, 起始點
* x1, y1, 結束點
* int[] colors, 中間依次要出現的幾個顏色
* float[] positions,數組大小跟colors數組一樣大,中間依次擺放的幾個顏色分別放置在那個位置上(參考比例從左往右)
* tile
*/
// LinearGradient linearGradient = new LinearGradient(0, 0, 400, 400, colors, null, TileMode.CLAMP);
LinearGradient linearGradient = new LinearGradient(0, 0, 400, 400, colors, null, TileMode.REPEAT);
// paint.setShader(linearGradient);
// canvas.drawRect(0, 0, 400, 400, paint);
// radialGradient = new RadialGradient(300, 300, 100, colors, null, TileMode.REPEAT);
// paint.setShader(radialGradient);
// canvas.drawCircle(300, 300, 300, paint);
// sweepGradient = new SweepGradient(300, 300, colors, null);
// paint.setShader(sweepGradient);
// canvas.drawCircle(300, 300, 300, paint);
composeShader = new ComposeShader(linearGradient, bitmapShader, PorterDuff.Mode.SRC_OVER);
paint.setShader(composeShader);
canvas.drawRect(0, 0, 800, 1000, paint);
}
可以繪製圖片、顏色塊、文字
canvas.drawCircle()
canvas.drawRect()
canvas.drawOval()