高级UI-画笔Paint
在UI這一塊,談到自定義,就離不開畫筆和畫布的使用話題,在自定義控件的時候,為了做出炫酷的效果,我們往往會使用畫筆和畫布,那么這里我們就先來看看畫筆的使用吧
簡單使用例子
自定義一個View
public class PaintView extends View {private Paint mPaint;public PaintView(Context context, @Nullable AttributeSet attrs) {super(context, attrs);mPaint = new Paint();}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);//重置mPaint.reset();//畫筆設(shè)置mPaint.setColor(Color.RED);mPaint.setAlpha(255);//樣式設(shè)置 // mPaint.setStyle(Paint.Style.FILL);//填充mPaint.setStyle(Paint.Style.STROKE);//描邊 // mPaint.setStyle(Paint.Style.FILL_AND_STROKE);//填充及描邊//畫筆寬度設(shè)置mPaint.setStrokeWidth(20);//線帽設(shè)置mPaint.setStrokeCap(Paint.Cap.BUTT);//無 // mPaint.setStrokeCap(Paint.Cap.ROUND);//圓形 // mPaint.setStrokeCap(Paint.Cap.SQUARE);//方形//線條交叉處 // mPaint.setStrokeJoin(Paint.Join.BEVEL);//直角 // mPaint.setStrokeJoin(Paint.Join.ROUND);//圓角 // mPaint.setStrokeJoin(Paint.Join.MITER);//銳角Path path = new Path();path.moveTo(100,100);path.lineTo(300,100);path.lineTo(500,300);mPaint.setStrokeJoin(Paint.Join.BEVEL);canvas.drawPath(path,mPaint);path.moveTo(100,400);path.lineTo(300,400);path.lineTo(500,700);mPaint.setStrokeJoin(Paint.Join.MITER);canvas.drawPath(path,mPaint);path.moveTo(100,800);path.lineTo(300,800);path.lineTo(500,1100);mPaint.setStrokeJoin(Paint.Join.ROUND);canvas.drawPath(path,mPaint);} }畫了三條線
Paint的使用說明
Paint在是使用的時候,一般會有兩個類參與,一個負(fù)責(zé)圖形繪制,一個負(fù)責(zé)文字繪制
在使用前一般重置Paint,調(diào)用reset()
設(shè)置方法一般都對應(yīng)著獲取方法
圖形繪制相關(guān)方法
- 設(shè)置顏色
- 設(shè)置透明度0~255
- 設(shè)置畫筆的樣式
- 設(shè)置畫筆的寬度
- 設(shè)置線帽
- 設(shè)置線條交叉處樣式
- 設(shè)置防鋸齒
- 設(shè)置圖像抖動處理
文字繪制相關(guān)方法
- 設(shè)置字符行間距
- 設(shè)置字符之間的間距
- 設(shè)置文本刪除線
- 設(shè)置下劃線
- 設(shè)置文本大小
- 設(shè)置字體類型
- 加載自定義字體
- 設(shè)置文字傾斜,默認(rèn)0,官方推薦的-0.25f是斜體
- 設(shè)置文本對齊方式
- 計算制定長度的字符串(字符長度、字符個數(shù)、顯示的時候真實的長度)
- 獲取文本的矩形區(qū)域(寬高)Rect bounds
- 獲取文本的寬度,比較粗略
- 獲取文本的寬度,比較精準(zhǔn)
文本的基線問題
在繪制文本的時候,事宜基準(zhǔn)線為準(zhǔn)的,但有時我們在繪制的時候又不以基準(zhǔn)線穩(wěn)準(zhǔn),那么就需要通過計算去獲得位置了
canvas.drawText(x,y)這個y并不是text的左上角,而是以baseline為基準(zhǔn)的
通過獲得相對于基準(zhǔn)線的位置,從而計算出需要的位置,負(fù)值表示在基準(zhǔn)線上方,正值表示在基準(zhǔn)線下方
自定義ProgressBar實現(xiàn)
定義自定義屬性
<?xml version="1.0" encoding="utf-8"?> <resources><declare-styleable name="CustomProgressBar"><attr name="roundProgressColor" format="color" /><attr name="roundColor" format="color" /><attr name="roundWidth" format="dimension" /><attr name="textSize" format="dimension" /><attr name="textColor" format="color" /><attr name="max" format="integer" /><attr name="min" format="integer" /><attr name="textShow" format="boolean" /><attr name="style"><enum name="STROKE" value="0" /><enum name="FILL" value="1" /></attr></declare-styleable> </resources>自定義ProgressBar
public class CustomProgressBar extends View {public static final int STROKE = 0;public static final int FILL = 1;private int min;private int roundColor;private int roundProgressColor;private float roundWidth;private int style;private int textColor;private boolean textShow;private float textSize;private Paint paint;private int max;private int progress;public CustomProgressBar(Context context, @Nullable AttributeSet attrs) {super(context, attrs);//定義畫筆paint = new Paint();//獲得自定義屬性TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CustomProgressBar);max = typedArray.getInteger(R.styleable.CustomProgressBar_max, 100);min = typedArray.getInteger(R.styleable.CustomProgressBar_min, 80);roundColor = typedArray.getColor(R.styleable.CustomProgressBar_roundColor, Color.RED);roundProgressColor = typedArray.getColor(R.styleable.CustomProgressBar_roundProgressColor, Color.GRAY);roundWidth = typedArray.getDimension(R.styleable.CustomProgressBar_roundWidth, 10);style = typedArray.getInt(R.styleable.CustomProgressBar_style, 0);textColor = typedArray.getColor(R.styleable.CustomProgressBar_textColor, Color.GREEN);textShow = typedArray.getBoolean(R.styleable.CustomProgressBar_textShow, true);textSize = typedArray.getDimension(R.styleable.CustomProgressBar_textSize, 15);typedArray.recycle();}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);//畫默認(rèn)的外層圓環(huán)int center = getWidth() / 2;float radius = center - roundWidth / 2;paint.setColor(roundColor);paint.setStyle(Paint.Style.STROKE);paint.setStrokeWidth(roundWidth);paint.setAntiAlias(true);canvas.drawCircle(center, center, radius, paint);//畫進(jìn)度百分比paint.setColor(textColor);paint.setStrokeWidth(0);paint.setTextSize(textSize);paint.setTypeface(Typeface.DEFAULT_BOLD);int precent = (int) (progress / (float) max * 100);if (textShow && style == STROKE) {canvas.drawText(precent + "%", (getWidth() - paint.measureText(precent + "%s")) / 2F,(getHeight() - (paint.descent() + paint.ascent())) / 2F, paint);}//畫圓弧paint.setColor(roundProgressColor);paint.setStrokeWidth(roundWidth);RectF oval = new RectF(center - radius, center - radius, center + radius, center + radius);switch (style) {case STROKE:paint.setStyle(Paint.Style.STROKE);canvas.drawArc(oval, 0, 360 * precent / 100, false, paint);break;case FILL:paint.setStyle(Paint.Style.FILL_AND_STROKE);canvas.drawArc(oval, 0, 360 * precent / 100, true, paint);break;}}public int getMin() {return min;}public void setMin(int min) {this.min = min;}public synchronized int getMax() {return max;}public synchronized void setMax(int max) {if (max < 0) {throw new IllegalArgumentException("max不能小于0");}this.max = max;}public synchronized int getProgress() {return progress;}public synchronized void setProgress(int progress) {if (progress < 0) {throw new IllegalArgumentException("progress不能小于0");}if (progress > max) {progress = max;}if (progress <= max) {this.progress = progress;//更新postInvalidate();}}public int getRoundColor() {return roundColor;}public void setRoundColor(int roundColor) {this.roundColor = roundColor;}public int getRoundProgressColor() {return roundProgressColor;}public void setRoundProgressColor(int roundProgressColor) {this.roundProgressColor = roundProgressColor;}public float getRoundWidth() {return roundWidth;}public void setRoundWidth(float roundWidth) {this.roundWidth = roundWidth;}public int getStyle() {return style;}public void setStyle(int style) {this.style = style;}public int getTextColor() {return textColor;}public void setTextColor(int textColor) {this.textColor = textColor;}public boolean isTextShow() {return textShow;}public void setTextShow(boolean textShow) {this.textShow = textShow;}public float getTextSize() {return textSize;}public void setTextSize(float textSize) {this.textSize = textSize;} }編寫布局
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:myApp="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"><com.cj5785.painttest.CustomProgressBarandroid:id="@+id/custom_progress_bar"android:layout_centerInParent="true"android:layout_width="100dp"android:layout_height="100dp"myApp:roundProgressColor="@android:color/holo_green_light"myApp:roundColor="@android:color/holo_blue_light"myApp:roundWidth="10dp"myApp:textColor="@android:color/holo_orange_light"myApp:textSize="18sp" /><Buttonandroid:layout_alignParentBottom="true"android:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="start"/></RelativeLayout>測試
public class ProgressBarActivity extends AppCompatActivity {private CustomProgressBar progressBar;private int progess;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_progress_bar);progressBar = findViewById(R.id.custom_progress_bar);}public void start(View view) {progess += 5;progressBar.setProgress(progess);} }效果如下
附錄 API
public class Paint extends Object
java.lang.Object
? ?android.graphics.Paint
The Paint class holds the style and color information about how to draw geometries, text and bitmaps.
| enum | Paint.Align Align specifies how drawText aligns its text relative to the [x,y] coordinates. |
| enum | Paint.Cap The Cap specifies the treatment for the beginning and ending of stroked lines and paths. |
| class | Paint.FontMetrics Class that describes the various metrics for a font at a given text size. |
| class | Paint.FontMetricsInt Convenience method for callers that want to have FontMetrics values as integers. |
| enum | Paint.Join The Join specifies the treatment where lines and curve segments join on a stroked path. |
| enum | Paint.Style The Style specifies if the primitive being drawn is filled, stroked, or both (in the same color). |
| int | ANTI_ALIAS_FLAG Paint flag that enables antialiasing when drawing. |
| int | DEV_KERN_TEXT_FLAG Legacy Paint flag, no longer used. |
| int | DITHER_FLAG Paint flag that enables dithering when blitting. |
| int | EMBEDDED_BITMAP_TEXT_FLAG Paint flag that enables the use of bitmap fonts when drawing text. |
| int | FAKE_BOLD_TEXT_FLAGPaint flag that applies a synthetic bolding effect to drawn text. |
| int | FILTER_BITMAP_FLAG Paint flag that enables bilinear sampling on scaled bitmaps. |
| int | HINTING_OFF Font hinter option that disables font hinting. |
| int | HINTING_ON Font hinter option that enables font hinting. |
| int | LINEAR_TEXT_FLAG Paint flag that enables smooth linear scaling of text. |
| int | STRIKE_THRU_TEXT_FLAG Paint flag that applies a strike-through decoration to drawn text. |
| int | SUBPIXEL_TEXT_FLAG Paint flag that enables subpixel positioning of text. |
| int | UNDERLINE_TEXT_FLAG Paint flag that applies an underline decoration to drawn text. |
| Paint() Create a new paint with default settings. |
| Paint(int flags) Create a new paint with the specified flags. |
| Paint(Paint paint) Create a new paint, initialized with the attributes in the specified paint parameter. |
| float | ascent() Return the distance above (negative) the baseline (ascent) based on the current typeface and text size. |
| int | breakText(char[] text, int index, int count, float maxWidth, float[] measuredWidth) Measure the text, stopping early if the measured width exceeds maxWidth. |
| int | breakText(String text, boolean measureForwards, float maxWidth,float[] measuredWidth) Measure the text, stopping early if the measured width exceeds maxWidth. |
| int | breakText(CharSequence text, int start, int end, boolean measureForwards, float maxWidth, float[] measuredWidth) Measure the text, stopping early if the measured width exceeds maxWidth. |
| void | clearShadowLayer() Clear the shadow layer. |
| float | descent() Return the distance below (positive) the baseline (descent) based on the current typeface and text size. |
| boolean | equalsForTextMeasurement(Paint other)Returns true of the passed Paint will have the same effect on text measurement |
| int | getAlpha()Helper to getColor() that just returns the color’s alpha value. |
| int | getColor()Return the paint’s color. |
| ColorFilter | getColorFilter()Get the paint’s colorfilter (maybe be null). |
| boolean | getFillPath(Path src, Path dst)Applies any/all effects (patheffect, stroking) to src, returning the result in dst. |
| int | getFlags()Return the paint’s flags. |
| String | getFontFeatureSettings()Returns the font feature settings. |
| float | getFontMetrics(Paint.FontMetrics metrics)Return the font’s recommended interline spacing, given the Paint’s settings for typeface, textSize, etc. |
| Paint.FontMetrics | getFontMetrics()Allocates a new FontMetrics object, and then calls getFontMetrics(fm) with it, returning the object. |
| int | getFontMetricsInt(Paint.FontMetricsInt fmi)Return the font’s interline spacing, given the Paint’s settings for typeface, textSize, etc. |
| Paint.FontMetricsInt | getFontMetricsInt() |
| float | getFontSpacing()Return the recommend line spacing based on the current typeface and text size. |
| String | getFontVariationSettings()Returns the font variation settings. |
| int | getHinting()Return the paint’s hinting mode. |
| float | getLetterSpacing()Return the paint’s letter-spacing for text. |
| MaskFilter | getMaskFilter()Get the paint’s maskfilter object. |
| int | getOffsetForAdvance(char[] text, int start, int end, int contextStart,int contextEnd, boolean isRtl, float advance)Get the character offset within the string whose position is closest to the specified horizontal position. |
| int | getOffsetForAdvance(CharSequence text, int start, int end, int contextStart, int contextEnd, boolean isRtl, float advance) |
| PathEffect | getPathEffect()Get the paint’s patheffect object. |
| float | getRunAdvance(char[] text, int start, int end, int contextStart, int contextEnd, boolean isRtl, int offset)Measure cursor position within a run of text. |
| float | getRunAdvance(CharSequence text, int start, int end, int contextStart,int contextEnd, boolean isRtl, int offset) |
| Shader | getShader()Get the paint’s shader object. |
| Paint.Cap | getStrokeCap()Return the paint’s Cap, controlling how the start and end of stroked lines and paths are treated. |
| Paint.Join | getStrokeJoin()Return the paint’s stroke join type. |
| float | getStrokeMiter()Return the paint’s stroke miter value. |
| float | getStrokeWidth()Return the width for stroking. |
| Paint.Style | getStyle()Return the paint’s style, used for controlling how primitives’ geometries are interpreted (except for drawBitmap, which always assumes FILL_STYLE). |
| Paint.Align | getTextAlign()Return the paint’s Align value for drawing text. |
| void | getTextBounds(String text, int start, int end, Rect bounds)Return in bounds (allocated by the caller) the smallest rectangle that encloses all of the characters, with an implied origin at (0,0). |
| void | getTextBounds(char[] text, int index, int count, Rect bounds)Return in bounds (allocated by the caller) the smallest rectangle that encloses all of the characters, with an implied origin at (0,0). |
| Locale | getTextLocale()Get the text’s primary Locale. |
| LocaleList | getTextLocales()Get the text locale list. |
| void | getTextPath(char[] text, int index, int count, float x, float y, Pathpath)Return the path (outline) for the specified text. |
| void | getTextPath(String text, int start, int end, float x, float y, Pathpath)Return the path (outline) for the specified text. |
| float | getTextScaleX()Return the paint’s horizontal scale factor for text. |
| float | getTextSize()Return the paint’s text size. |
| float | getTextSkewX()Return the paint’s horizontal skew factor for text. |
| int | getTextWidths(char[] text, int index, int count, float[] widths)Return the advance widths for the characters in the string. |
| int | getTextWidths(String text, float[] widths)Return the advance widths for the characters in the string. |
| int | getTextWidths(String text, int start, int end, float[] widths)Return the advance widths for the characters in the string. |
| int | getTextWidths(CharSequence text, int start, int end, float[] widths)Return the advance widths for the characters in the string. |
| Typeface | getTypeface()Get the paint’s typeface object. |
| Xfermode | getXfermode()Get the paint’s transfer mode object. |
| boolean | hasGlyph(String string)Determine whether the typeface set on the paint has a glyph supporting the string. |
| final boolean | isAntiAlias()Helper for getFlags(), returning true if ANTI_ALIAS_FLAG bit is set AntiAliasing smooths out the edges of what is being drawn, but is has no impact on the interior of the shape. |
| final boolean | isDither()Helper for getFlags(), returning true if DITHER_FLAG bit is set Dithering affects how colors that are higher precision than the device are down-sampled. |
| boolean | isElegantTextHeight()Get the elegant metrics flag. |
| final boolean | isFakeBoldText()Helper for getFlags(), returning true if FAKE_BOLD_TEXT_FLAG bit is set |
| final boolean | isFilterBitmap()Whether or not the bitmap filter is activated. |
| final boolean | isLinearText()Helper for getFlags(), returning true if LINEAR_TEXT_FLAG bit is set |
| final boolean | isStrikeThruText()Helper for getFlags(), returning true if STRIKE_THRU_TEXT_FLAG bit is set |
| final boolean | isSubpixelText()Helper for getFlags(), returning true if SUBPIXEL_TEXT_FLAG bit is set |
| final boolean | isUnderlineText()Helper for getFlags(), returning true if UNDERLINE_TEXT_FLAG bit is set |
| float | measureText(char[] text, int index, int count)Return the width of the text. |
| float | measureText(CharSequence text, int start, int end)Return the width of the text. |
| float | measureText(String text, int start, int end)Return the width of the text. |
| float | measureText(String text)Return the width of the text. |
| void | reset()Restores the paint to its default settings. |
| void | set(Paint src)Copy the fields from src into this paint. |
| void | setARGB(int a, int r, int g, int b)Helper to setColor(), that takes a,r,g,b and constructs the color int |
| void | setAlpha(int a)Helper to setColor(), that only assigns the color’s alpha value, leaving its r,g,b values unchanged. |
| void | setAntiAlias(boolean aa)Helper for setFlags(), setting or clearing the ANTI_ALIAS_FLAG bit AntiAliasing smooths out the edges of what is being drawn, but is has no impact on the interior of the shape. |
| void | setColor(int color)Set the paint’s color. |
| ColorFilter | setColorFilter(ColorFilter filter)Set or clear the paint’s colorfilter, returning the parameter. |
| void | setDither(boolean dither)Helper for setFlags(), setting or clearing the DITHER_FLAG bit Dithering affects how colors that are higher precision than the device are down-sampled. |
| void | setElegantTextHeight(boolean elegant)Set the paint’s elegant height metrics flag. |
| void | setFakeBoldText(boolean fakeBoldText)Helper for setFlags(), setting or clearing the FAKE_BOLD_TEXT_FLAG bit |
| void | setFilterBitmap(boolean filter)Helper for setFlags(), setting or clearing the FILTER_BITMAP_FLAG bit. |
| void | setFlags(int flags)Set the paint’s flags. |
| void | setFontFeatureSettings(String settings)Set font feature settings. |
| boolean | setFontVariationSettings(String fontVariationSettings)Sets TrueType or OpenType font variation settings. |
| void | setHinting(int mode)Set the paint’s hinting mode. |
| void | setLetterSpacing(float letterSpacing)Set the paint’s letter-spacing for text. |
| void | setLinearText(boolean linearText)Helper for setFlags(), setting or clearing the LINEAR_TEXT_FLAG bit |
| MaskFilter | setMaskFilter(MaskFilter maskfilter)Set or clear the maskfilter object. |
| PathEffect | setPathEffect(PathEffect effect)Set or clear the patheffect object. |
| Shader | setShader(Shader shader)Set or clear the shader object. |
| void | setShadowLayer(float radius, float dx, float dy, int shadowColor)This draws a shadow layer below the main layer, with the specified offset and color, and blur radius. |
| void | setStrikeThruText(boolean strikeThruText)Helper for setFlags(), setting or clearing the STRIKE_THRU_TEXT_FLAG bit |
| void | setStrokeCap(Paint.Cap cap)Set the paint’s Cap. |
| void | setStrokeJoin(Paint.Join join)Set the paint’s Join. |
| void | setStrokeMiter(float miter)Set the paint’s stroke miter value. |
| void | setStrokeWidth(float width)Set the width for stroking. |
| void | setStyle(Paint.Style style)Set the paint’s style, used for controlling how primitives’ geometries are interpreted (except for drawBitmap, which always assumes Fill). |
| void | setSubpixelText(boolean subpixelText)Helper for setFlags(), setting or clearing the SUBPIXEL_TEXT_FLAG bit |
| void | setTextAlign(Paint.Align align)Set the paint’s text alignment. |
| void | setTextLocale(Locale locale)Set the text locale list to a one-member list consisting of just the locale. |
| void | setTextLocales(LocaleList locales)Set the text locale list. |
| void | setTextScaleX(float scaleX)Set the paint’s horizontal scale factor for text. |
| void | setTextSize(float textSize)Set the paint’s text size. |
| void | setTextSkewX(float skewX)Set the paint’s horizontal skew factor for text. |
| Typeface | setTypeface(Typeface typeface)Set or clear the typeface object. |
| void | setUnderlineText(boolean underlineText)Helper for setFlags(), setting or clearing the UNDERLINE_TEXT_FLAG bit |
| Xfermode | setXfermode(Xfermode xfermode)Set or clear the transfer mode object. |
轉(zhuǎn)載于:https://www.cnblogs.com/cj5785/p/10664584.html
總結(jié)
以上是生活随笔為你收集整理的高级UI-画笔Paint的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spreedrest
- 下一篇: 第五周每周总结