編輯:關於Android編程
距離寫上一篇自定義View文章已經大半年過去了,一直想繼續寫,但是無奈技術有限,生怕誤人子弟。這段時間項目剛剛完成,有點時間,跟著大神的腳步,鞏固下自定義View的相關基礎知識。
Canvas和Paint可以理解為現實中的畫布和畫筆,這兩樣是繪圖必備,首先來詳細的了解下這兩個。
首先來看下Paint的常用函數:
* setColor(int color):設置畫筆顏色。
* setStrokeWidth(float width):設置畫筆寬度。
* setAntiAlias(boolean aa):設置抗鋸齒。
* setStyle(Style style): 設置填充樣式。
* setShadowLayer(float radius, float dx, float dy, int shadowColor):設置陰影。
設置畫筆顏色和畫筆寬度沒什麼可說的,設置抗鋸齒可以讓我們繪制的圖形更加圓滑,除了Paint的setAntiAlias()函數可以設置抗鋸齒外,也可以通過Canvas設置:
canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG));
setStyle()函數可以設置如下參數:
* Paint.Style.STROKE:描邊。
* Paint.Style.FILL:填充內部。
* Paint.Style.FILL_AND_STROKE:填充內部和描邊。
新建個項目,在onDraw函數中分別繪制下,看下都有什麼區別:
protected void onDraw(Canvas canvas) { mPaint.setColor(Color.BLUE); mPaint.setStyle(Paint.Style.STROKE); canvas.drawCircle(mLeftX, mLeftY, 100, mPaint); mPaint.setColor(Color.RED); mPaint.setStyle(Paint.Style.FILL); canvas.drawCircle(mLeftX * 4, mLeftY, 100, mPaint); mPaint.setColor(Color.BLACK); mPaint.setStyle(Paint.Style.FILL_AND_STROKE); canvas.drawCircle(mLeftX * 7, mLeftY, 100, mPaint); }
運行結果:
通過運行結果可以看到,貌似Paint.Style.FILL和Paint.Style.FILL_AND_STROKE其實並沒有什麼區別。
但是,如果把畫筆的寬度調寬一些:<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwcmUgY2xhc3M9"brush:java;">
mPaint.setStrokeWidth(50);
mPaint.setColor(Color.RED);
mPaint.setStyle(Paint.Style.FILL);
canvas.drawCircle(mLeftX, mLeftY, 50, mPaint);
mPaint.setColor(Color.BLACK);
mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
canvas.drawCircle(mLeftX * 4, mLeftY, 50, mPaint);
運行結果:
可以看出看來,FILL_AND_STROKE其實會把寬度一起填充。
setShadowLayer(float radius, float dx, float dy, int shadowColor):
* radius:陰影傾斜度。
* dx:水平位移。
* dy:垂直位移。
* shadowColor:陰影顏色。
給文字繪制上陰影:
mPaint.setTextSize(50); mPaint.setColor(Color.BLUE); mPaint.setShadowLayer(5, 10, 10, Color.GREEN); canvas.drawText("Airsaid", mLeftX, mLeftY, mPaint);
運行結果:
Canvas作為畫布,含有繪制各種圖形的函數,下面根據具體圖形來分類進行詳細講解。
mPaint.setColor(Color.BLUE); mPaint.setStrokeWidth(10); canvas.drawLine(0, 0, getWidth(), 0, mPaint);
運行結果:
mPaint.setColor(Color.BLUE); mPaint.setStrokeWidth(10); float pts[] = {0, 10, getWidth(), 10, 0, 50, getWidth(), 50}; canvas.drawLines(pts, mPaint);
運行結果:
mPaint.setColor(Color.BLUE); mPaint.setStrokeWidth(10); float pts[] = {0, 10, getWidth(), 10, 0, 50, getWidth(), 50}; canvas.drawLines(pts, 4, 4, mPaint);
運行結果:
mPaint.setColor(Color.RED); mPaint.setStrokeWidth(20); canvas.drawPoint(100, 100, mPaint);
運行結果:
mPaint.setColor(Color.RED); mPaint.setStrokeWidth(20); float pts[] = {100, 100, 200, 100, 300, 100}; canvas.drawPoints(pts, mPaint);
運行結果:
mPaint.setColor(Color.RED); mPaint.setStrokeWidth(20); float pts[] = {100, 100, 200, 100, 300, 100}; canvas.drawPoints(pts, 2, 4, mPaint);
運行結果:
mPaint.setColor(Color.RED); Rect rect = new Rect(100, 30, 200, 100); canvas.drawRect(rect, mPaint); RectF rectF = new RectF(300, 30, 400, 100); canvas.drawRect(rectF, mPaint); canvas.drawRect(500, 30, 600, 100, mPaint);
其中Rect和RectF為矩形輔助類,可根據4個點構建一片矩形區域,用於幫助我們對矩形進行操作。
運行結果:
mPaint.setColor(Color.RED); RectF rectF = new RectF(0, 0, 300, 100); canvas.drawRoundRect(rectF, 30f, 30f, mPaint); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { canvas.drawRoundRect(400f, 0f, 700f, 100f, 30f, 30f, mPaint); }
其中,由於直接傳入矩形的四個點來繪制圓角矩形的函數是在API21才開始提供,所以進行了判斷。
運行結果:
mPaint.setColor(Color.RED); canvas.drawCircle(100f, 50f, 50f, mPaint);
運行結果:
mPaint.setColor(Color.RED); RectF rectF = new RectF(50, 0, 200, 100); canvas.drawOval(rectF, mPaint); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { canvas.drawOval(300, 0, 450, 100, mPaint); }
運行結果:
mPaint.setColor(Color.RED); mPaint.setStrokeWidth(5); mPaint.setStyle(Paint.Style.STROKE); RectF rectF = new RectF(50, 0, 200, 100); canvas.drawArc(rectF, 0f, 180f, false, mPaint); RectF rectF2 = new RectF(250, 0, 400, 100); canvas.drawArc(rectF2, 0f, 180f, true, mPaint); RectF rectF3 = new RectF(450, 0, 600, 100); mPaint.setStyle(Paint.Style.FILL); canvas.drawArc(rectF3, 0f, 180f, true, mPaint);
運行結果:
先看效果圖: 這是一個在github上的開源控件按鈕View(點擊此處查看),同時帶有進度。使用方法:把該項目從github上下載下來導
1.生命周期場景演示 : 切換到該Fragment11-29 14:26:35.095: D/AppListFragment(7649): onAttach11-29 1
有很多人喜歡在手機上下東西,但是有手機在休眠的時候WIFI會斷網,這樣想下載的東西也下載不了了,那麼怎麼避免這種情況出現呢,下面小編就給大家介紹下防止手機休
最近有很多人微信底部的變色卡片導航是怎麼做的,我在網上看了好幾個例子,都是效果接近,都存有一些差異,自己琢磨也做了一個,幾乎99%的還原,效果還不錯吧仔細觀察微信圖片,發