1. 程式人生 > 實用技巧 >Android自定控制元件基礎(一)——幾何圖形繪製

Android自定控制元件基礎(一)——幾何圖形繪製

雖然本人有幾年開發經驗,但是自定義控制元件這一塊兒,研究的很少,慚愧……用到的時候就是百度查詢,複製貼上。工時緊,總是想的快點完工就好。(都是藉口啦,想學總會有時間噠)

作為一個Android開發 要說自定義控制元件不會寫,太丟人了,我決定一點點做起,以後用的都是自己的自定義控制元件!!!加油~~~

進入正題:此部落格參考文章:啟艦大神部落格

一、先說一下自定義控制元件必須的Paint和Canvas

簡單來說,就是畫圖所需要的比和紙(畫布)Paint是筆 Canvas是紙 有了紙筆,就盡情展現你的繪畫天賦吧~

Paint的幾個基本設定函式

  • paint.setAntiAlias(true);//抗鋸齒功能 作用是邊緣柔化,可以消除混疊等
  • paint.setColor(Color.RED); //設定畫筆顏色
  • paint.setStyle(Style.FILL);//設定填充樣式
  • paint.setStrokeWidth(30);//設定畫筆寬度
  • paint.setShadowLayer(10, 15, 15, Color.GREEN);//設定陰影

畫布的背景設定

  • canvas.drawColor(Color.BLUE);
  • canvas.drawRGB(255, 255, 0); //這兩個功能一樣,都是用來設定背景顏色的。

二、程式碼實現

  1. 新建一個工程,新建一個類:MyView繼承自View
 1 package com.matai.betheltest;
 2 
 3 import android.content.Context;
 4 import android.graphics.Canvas;
 5 import android.graphics.Color;
 6 import android.graphics.Paint;
 7 import android.view.View;
 8 
 9 public class MyView extends View {
10 
11     private static final String TAG = "MyView";
12 
13     private Context context;
14 
15     public MyView(Context context) {
16         super(context);
17         this.context=context;
18     }
19 
20     //重寫OnDraw函式 用於繪圖
21    @Override
22     protected void onDraw(Canvas canvas) {
23         super.onDraw(canvas);
24 
25        Paint paint=new Paint();//設定畫筆
26        paint.setAntiAlias(true);//抗鋸齒功能(邊緣柔化,可以消除混疊等)
27        paint.setColor(Color.RED);  //設定畫筆顏色
28        paint.setStyle(Paint.Style.FILL);//設定填充樣式   Style.FILL/Style.FILL_AND_STROKE/Style.STROKE
29        paint.setStrokeWidth(5);//設定畫筆寬度
30        paint.setShadowLayer(2,2,2,Color.GREEN);//設定陰影
31 
32        canvas.drawRGB(255,255,255);//設定畫布背景顏色
33        //畫圓
34        canvas.drawCircle(190, 200, 150, paint);
35    }
36 }
View Code

2. Activity佈局檔案設定

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/frameLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".RobotActivity">



</FrameLayout>
View Code

3.Activity程式碼

 1 public class RobotActivity extends AppCompatActivity {
 2 
 3     private static final String TAG = "RobotActivity";
 4 
 5     private FrameLayout frameLayout;
 6 
 7     //畫幾何圖形
 8     private MyView myView;
 9 
10     @Override
11     protected void onCreate(Bundle savedInstanceState) {
12         super.onCreate(savedInstanceState);
13         setContentView(R.layout.activity_robot);
14 
15         frameLayout=findViewById(R.id.frameLayout);
16 
17         myView=new MyView(this);
18 
19         frameLayout.addView(myView);
20     }
View Code

執行結果:

三、多種幾何圖形實現

1. 畫直線:canvas.drawLine(10,10,50,60,paint);引數說明:

drawLine(float startX, float startY, float stopX, float stopY, @NonNull Paint paint)

startX:開始畫直線的x座標

startY:開始畫直線的y座標

stopX:畫直線結束時的x座標

startY:畫直線結束時的y座標

paint:畫筆

效果圖:

2. 畫多條直線:drawLines(float[] pts, @NonNull Paint paint) 引數說明:

pts:點的集合,每兩個點形成一條直線,組織方式為{x1,y1,x2,y2,x3,y3,……}

float []pts={10,10,100,100,200,200,400,400};
canvas.drawLines(pts, paint);

效果圖:

3.畫點 drawPoint(float x, float y, @NonNull Paint paint)引數說明:

x:x座標

y: y座標

canvas.drawPoint(40,50,paint);

效果圖:(點很大是因為我畫筆寬度寫成了50)

4. 多個點:

drawPoints(float[] pts, @NonNull Paint paint) 引數說明:同畫兩條直線一樣

drawPoints(float[] pts, int offset, int count,@NonNull Paint paint)這個方法多出的兩個引數說明:

offset:pts陣列中跳過的數值個數,注意不是點的個數!一個點是兩個數值;

count:參與繪製的數值的個數,指pts[]裡數值個數,而不是點的個數,因為一個點是兩個數值

程式碼為:float []pts={10,10,100,100,200,200,400,400}; canvas.drawPoints(pts, 0, 8, paint);(全部畫出 不跳過任何一個點) 效果圖:

程式碼為:float []pts={10,10,100,100,200,200,400,400}; canvas.drawPoints(pts, 2, 4, paint); (跳過第一個點 不畫最後一個點)效果圖:

程式碼為:float []pts={10,10,100,100,200,200,400,400}; canvas.drawPoints(pts, 4, 4, paint); (跳過第二個點 不花最後一個點和第一個點)效果圖:

5. 矩形工具類RectF與Rect

兩者區別不大,都是滑出一個矩形,最常用的構造方法是Rect(int left, int top, int right, int bottom) 都可以看懂 是根據四個點構造矩形

canvas.drawRect(10, 10, 100, 100, paint);//直接構造 效果圖:

還有一種構造方法是傳入RectF或者Rect矩形變數:drawRect (RectF rect, Paint paint)或者drawRect (Rect r, Paint paint)

使用:RectF rect = new RectF(120, 10, 210, 100);
canvas.drawRect(rect, paint);//使用RectF構造 效果圖:

6. 圓角矩形

void drawRoundRect (RectF rect, float rx, float ry, Paint paint) 引數說明:

RectF rect:要畫的矩形
float rx:生成圓角的橢圓的X軸半徑
float ry:生成圓角的橢圓的Y軸半徑

使用:RectF rect = new RectF(100, 10, 300, 100);
canvas.drawRoundRect(rect, 20, 10, paint); 效果圖:

7. 橢圓:橢圓是根據矩形生成的,矩形的長為橢圓的x軸 寬為y

void drawOval (RectF oval, Paint paint) 引數說明:
RectF oval:用來生成橢圓的矩形

使用:RectF rect = new RectF(100, 10, 300, 100);
canvas.drawOval(rect, paint);//同一個矩形畫橢圓 效果圖:

8.弧形:弧是橢圓的一部分,而橢圓是根據矩形來生成的,所以弧當然也是根據矩形來生成的。

drawArc (RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint) 引數說明:

RectF oval:生成橢圓的矩形
float startAngle:弧開始的角度,以X軸正方向為0度
float sweepAngle:弧持續的角度
boolean useCenter:是否有弧的兩邊,True,還兩邊,False,只有一條弧

使用:RectF rect1 = new RectF(100, 10, 300, 100);canvas.drawArc(rect1, 0, 90, true, paint);(有邊邊,左圖)
RectF rect2 = new RectF(400, 10, 600, 100);canvas.drawArc(rect2, 0, 90, false, paint);(只有弧,右圖)

記錄學習,為什麼不收藏原部落格呢?因為自己重新寫一遍 印象深刻哼