日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android神笔之Paint

發布時間:2024/1/8 Android 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android神笔之Paint 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

再Android中,自定義控件是一個非常重要的知識點,而自定義控件對Android開發者是一個難點,考驗開發人員對View原理的理解,對于繼承View的自定義控件,一般都需要重寫onDraw方法,而且往往需要開發人員能夠掌握Paint這個類。

簡介

The Paint class holds the style and color information about how to draw geometries, text and bitmaps.

Paint:該類保存了繪制幾何圖形、文本和位圖的樣式和顏色信息。也就是說我們可以使用Paint保存的樣式和顏色,來繪制圖形、文本和bitmap,這就是Paint的強大之處。接下來我們使用Paint來繪圖,并且看看該類有哪些樣式和顏色。

Paint的使用

使用Paint之前需要初始化

mPaint = new Paint();

設置筆(Paint)的顏色和alpha值:

mPaint.setColor(Color.BLUE); mPaint.setAlpha(255); 復制代碼

注意alpha的范圍是[0..255],而不是[0..1],是一個int值。

設置畫筆的樣式:通過mPaint.setStyle()來設置樣式。

public enum Style {/*** Geometry and text drawn with this style will be filled, ignoring all* stroke-related settings in the paint.*/FILL (0),/*** Geometry and text drawn with this style will be stroked, respecting* the stroke-related fields on the paint.*/STROKE (1),/*** Geometry and text drawn with this style will be both filled and* stroked at the same time, respecting the stroke-related fields on* the paint. This mode can give unexpected results if the geometry* is oriented counter-clockwise. This restriction does not apply to* either FILL or STROKE.*/FILL_AND_STROKE (2);Style(int nativeInt) {this.nativeInt = nativeInt;}final int nativeInt;} 復制代碼

總共有三種畫筆的樣式

FILL:填充內容;

STROKE:描邊;

FILL_AND_STROKE:填充內容并描邊。

設置畫筆的寬度

mPaint.setStrokeWidth(50);

設置畫筆的線帽

通過mPaint.setStrokeCap來設置線帽,總共有三種線帽

/*** The Cap specifies the treatment for the beginning and ending of* stroked lines and paths. The default is BUTT.*/public enum Cap {/*** The stroke ends with the path, and does not project beyond it.*/BUTT (0),/*** The stroke projects out as a semicircle, with the center at the* end of the path.*/ROUND (1),/*** The stroke projects out as a square, with the center at the end* of the path.*/SQUARE (2);private Cap(int nativeInt) {this.nativeInt = nativeInt;}final int nativeInt;} 復制代碼

BUTT:沒有線帽,默認模式

ROUND:圓形

SQUARE:方形

三種線帽對比:

@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);mPaint.setColor(Color.BLUE);mPaint.setAlpha(255);//設置畫筆的樣式mPaint.setStyle(Paint.Style.FILL_AND_STROKE);//畫筆的寬度mPaint.setStrokeWidth(50);mPaint.setStrokeCap(Paint.Cap.SQUARE);//方形mPaint.setStrokeJoin(Paint.Join.BEVEL);//直線Path path = new Path();path.moveTo(100, 100);path.lineTo(300, 100);canvas.drawPath(path, mPaint);mPaint.reset();//重置mPaint.setColor(Color.RED);mPaint.setStyle(Paint.Style.FILL_AND_STROKE);mPaint.setStrokeWidth(50);mPaint.setStrokeCap(Paint.Cap.ROUND);//圓形mPaint.setStrokeJoin(Paint.Join.BEVEL);//直線Path path1 = new Path();path1.moveTo(100, 200);path1.lineTo(300, 200);canvas.drawPath(path1, mPaint);mPaint.reset();//重置mPaint.setColor(Color.GREEN);mPaint.setStyle(Paint.Style.FILL_AND_STROKE);mPaint.setStrokeWidth(50);mPaint.setStrokeCap(Paint.Cap.BUTT);//沒有mPaint.setStrokeJoin(Paint.Join.BEVEL);//直線Path path2 = new Path();path2.moveTo(100, 300);path2.lineTo(300, 300);canvas.drawPath(path2, mPaint);} 復制代碼

上面代碼中有個重置畫筆,這時候需要重新設置畫筆。

設置Join

使用setStrokeJoin方法來設置Join,Join有三種類型:

BEVEL:直線

ROUND:圓角

MITER:銳角

@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);mPaint.setColor(Color.BLUE);mPaint.setAlpha(255);mPaint.setStyle(Paint.Style.STROKE);//設置畫筆的樣式mPaint.setStrokeWidth(50);//畫筆的寬度mPaint.setStrokeCap(Paint.Cap.BUTT);//線帽mPaint.setStrokeJoin(Paint.Join.BEVEL);Path path = new Path();path.moveTo(100, 100);path.lineTo(300, 100);path.lineTo(100, 300);path.close();canvas.drawPath(path, mPaint);mPaint.reset();//重置mPaint.setColor(Color.RED);mPaint.setStyle(Paint.Style.FILL_AND_STROKE);mPaint.setStrokeWidth(50);mPaint.setStrokeCap(Paint.Cap.BUTT);//圓形mPaint.setStrokeJoin(Paint.Join.ROUND);//圓弧Path path1 = new Path();path1.moveTo(100, 400);path1.lineTo(300, 400);path1.lineTo(100, 700);path1.close();canvas.drawPath(path1, mPaint);mPaint.reset();//重置mPaint.setColor(Color.GREEN);mPaint.setStyle(Paint.Style.FILL_AND_STROKE);mPaint.setStrokeWidth(50);mPaint.setStrokeCap(Paint.Cap.BUTT);//沒有mPaint.setStrokeJoin(Paint.Join.MITER);//銳角Path path2 = new Path();path2.moveTo(100, 800);path2.lineTo(300, 800);path2.lineTo(100, 1100);path2.close();canvas.drawPath(path2, mPaint);} 復制代碼

以上就是Join三種類型對比。

設置防鋸齒

mPaint.setAntiAlias(true);

如果設置防鋸齒,會損失一定的性能

抖動處理

使用mPaint.setDither()方法,設置是否使用圖像抖動處理。會使繪制的圖片等顏色更加的清晰以及飽滿,也是損失性能。

使用Path繪制圖形

點組成線,線組成面,這樣Path可以繪制各種各樣的圖形,可以說是無所不能的了,但是Path也提供了很多方法,來繪制圖形。

文本繪制

上文中,介紹了Paint畫筆,和繪制了一些圖形。但是介紹Paint的時候,我們知道它可以繪制圖形,文本和bitmap,所以Paint是非常強大的了,我們看下Paint是如何繪制文本的。

設置字符之間的間距

setLetterSpacing

設置文本刪除線

mPaint.setStrikeThruText(true);

是否設置下劃線

mPaint.setUnderlineText(true);

設置文本大小

mPaint.setTextSize(textSize);

設置字體類型

mPaint.setTypeface(Typeface.BOLD); // Style public static final int NORMAL = 0;//常規 public static final int BOLD = 1;//粗體 public static final int ITALIC = 2; //斜體 public static final int BOLD_ITALIC = 3;//粗斜體

字體類型有以上四種類型可以設置。

加載自定義字體

Typeface.create(familyName, style)

文字傾斜

mPaint.setTextSkewX(-0.25f);

文字傾斜默認為0,官方推薦的-0.25f是斜體

文本對齊方式

mPaint.setTextAlign(Align.LEFT)

有三種:

public enum Align {/*** The text is drawn to the right of the x,y origin*/LEFT (0),//左對齊/*** The text is drawn centered horizontally on the x,y origin*/CENTER (1),//居中/*** The text is drawn to the left of the x,y origin*/RIGHT (2);//右對齊private Align(int nativeInt) {this.nativeInt = nativeInt;}final int nativeInt;} 復制代碼

計算制定長度的字符串

int breadText = mPaint.breakText(text, measureForwards, maxWidth, measuredWidth)

注意:字符長度、字符個數、顯示的時候是真實的長度

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) 復制代碼

使用drawText繪制文本

public class PaintView extends View {private Paint mPaint;private String text = "你是我世界之光,我心另一半";public PaintView(Context context) {this(context,null);}public PaintView(Context context, @Nullable AttributeSet attrs) {this(context, attrs,0);}public PaintView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init(context, attrs, defStyleAttr);}private void init(Context context, AttributeSet attrs, int defStyleAttr) {mPaint = new Paint();}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);mPaint.setColor(Color.BLUE);mPaint.setStyle(Paint.Style.STROKE);//設置畫筆的樣式mPaint.setStrokeCap(Paint.Cap.BUTT);//線帽mPaint.setStrokeJoin(Paint.Join.BEVEL);int top = 100;int baselineX = 0;mPaint.setTextSize(50);mPaint.setTextAlign(Paint.Align.LEFT);canvas.drawLine(0, top, 2000, top, mPaint);//文本MetricsPaint.FontMetrics fontMetrics = mPaint.getFontMetrics();float baselineY = top - fontMetrics.top;canvas.drawText(text, baselineX, baselineY, mPaint);} } 復制代碼

繪制文本時,還有一個很重要的知識點就是基線的確定,有關drawtext的基線,可以參考《DrawText 基線的確定》這篇文章。

總結

以上是生活随笔為你收集整理的Android神笔之Paint的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。