Android Canvas圖形繪制自定義View——人與魚小demo


 

Android Canvas圖形繪制自定義View——人與魚小demo

 

                    ——安德風QQ1652102745

亮點分析:

①通過paint畫筆類繪制圖形實現填充與描邊
②自定義設置文字字體
③靈活玩轉貝塞爾曲線
④靈活掌握坐標(起始點、中轉點、結束點)通過路徑閉合繪制完整的2d圖形

⑤繪制想要的圖形、圓形、線條等

 

一、效果圖:

 

 

 

二、功能實現MainActivity.java(這次demo純java代碼實現布局設計,沒有用到xml,所以這次不再提供activity_main.xml源代碼了)

  1 package com.example.adfdabai;
  2 
  3 import androidx.annotation.NonNull;
  4 import androidx.annotation.RequiresApi;
  5 import androidx.appcompat.app.AppCompatActivity;
  6 
  7 import android.content.Context;
  8 import android.content.res.AssetManager;
  9 import android.graphics.Bitmap;
 10 import android.graphics.BitmapFactory;
 11 import android.graphics.BlurMaskFilter;
 12 import android.graphics.Canvas;
 13 import android.graphics.Color;
 14 import android.graphics.Paint;
 15 import android.graphics.Path;
 16 import android.graphics.RectF;
 17 import android.graphics.Typeface;
 18 import android.os.Build;
 19 import android.os.Bundle;
 20 import android.view.View;
 21 
 22 public class MainActivity extends AppCompatActivity {
 23 
 24 
 25 
 26     @Override
 27     protected void onCreate(Bundle savedInstanceState) {
 28         super.onCreate(savedInstanceState);
 29         setContentView(R.layout.activity_main);
 30         MyView myView=new MyView(this);//myview實例化
 31 
 32         setContentView(myView);//加載myView布局
 33     }
 34 
 35 
 36 
 37 
 38     //一、創鍵MyView繼承View視圖
 39     public class MyView extends View {
 40         public String shape;
 41         private Canvas canvas;
 42 
 43         public Paint paint;
 44 
 45         public MyView(Context context) {
 46             super(context);
 47         }
 48 
 49         //創建畫布
 50         @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
 51         @Override
 52         protected void onDraw(Canvas canvas) {
 53             super.onDraw(canvas);
 54 
 55 
 56             //繪制背景圖
 57             Bitmap   bitmap = BitmapFactory.decodeResource(this.getResources(),R.drawable.image);
 58             canvas.drawBitmap(bitmap,0,0,null);
 59 
 60 //              //  設置畫布背景顏色為粉色
 61 //               canvas.drawColor(Color.TRANSPARENT);
 62                 //創建畫筆
 63                 Paint paint = new Paint();
 64 
 65 
 66 
 67                 paint.setColor(Color.parseColor("#EC8AA6"));//畫筆顏色為深粉色
 68                 paint.setTextSize(80);//字體大小為80
 69                 paint.setAntiAlias(true);//去除齒輪
 70                 paint.setStyle(Paint.Style.FILL);//設置畫筆樣式為實心
 71                 String fontPath = "yuan.ttf";//導入字體(路徑assets目錄下yuan.tff;如果沒有assets目錄需要右鍵main,new--folder--Assets folder創建assets目錄)
 72                 Typeface tf = Typeface.createFromAsset(getAssets(), fontPath);
 73                 paint.setTypeface(tf);
 74 //            paint.setShadowLayer(5,0,0,Color.BLACK);//設置投影效果
 75             canvas.drawText("雙魚座", 350, 200, paint);
 76                 paint.setTextSize(60);//字體大小為40
 77                 canvas.drawText("AnDeFeng Birthday 02-23", 100, 300, paint);
 78 
 79 
 80 
 81                 //繪制條紋
 82                 paint.setColor(Color.WHITE);//設置畫筆顏色為白色
 83                 Path mypath=new Path();
 84 //                paint.setColor(Color.WHITE);//設置畫筆顏色為白色
 85                 paint.setStyle(Paint.Style.STROKE);//設置畫筆樣式為空心
 86 //                paint.setColor(Color.WHITE);//設置畫筆顏色為白色
 87                 paint.setStrokeWidth(6);//設置畫筆的寬度為6
 88                 //繪制連續波浪線
 89                  mypath.moveTo(100, 400);//起始線
 90                  mypath.quadTo(200, 500, 250, 400);//quadTo 用於繪制圓滑曲線,即貝塞爾曲線。
 91                  mypath.moveTo(250, 400);
 92                  mypath.quadTo(300, 300, 350, 400);
 93                  mypath.moveTo(350, 400);
 94                  mypath.quadTo(400, 500, 500, 400);
 95 
 96                  mypath.moveTo(550, 380);
 97                  mypath.quadTo(600, 500, 800, 400);
 98 
 99                 canvas.drawPath(mypath, paint);
100 
101 
102             {       //繪制大白
103 
104 
105 
106                 paint.setStyle(Paint.Style.STROKE);//設置畫筆1樣式為空心
107                 paint.setColor(Color.BLACK);//設置畫筆1顏色為黑色
108                 Paint paint1=new Paint();//畫筆2
109                 paint1.setStyle(Paint.Style.FILL);//畫筆2樣式 設置為實心
110                 paint1.setColor(Color.WHITE);//設置畫筆2顏色為白色
111 //            canvas.drawCircle(500,700,50,paint);
112 
113                 RectF oval2 = new RectF(200, 600, 200, 240);// 設置個新的長方形,掃描測量
114                 //大白的頭部
115                 oval2.set(400, 600, 600, 750);//橢圓形
116                 canvas.drawOval(oval2, paint);//畫筆1黑色描邊
117                 canvas.drawOval(oval2, paint1);//畫筆2白色填充
118 
119 
120                 //繪制大白眼睛
121                paint.setColor(Color.BLACK);//設置畫筆顏色為黑色
122                 paint.setStyle(Paint.Style.FILL);//設置畫筆樣式為實心
123 
124                 canvas.drawCircle(480, 680, 20, paint);
125                 //繪制大白的嘴巴
126                 paint.setColor(Color.BLACK);//設置畫筆顏色為黑色
127                 paint.setStyle(Paint.Style.STROKE);//設置畫筆樣式為空心
128 
129                 //直線繪制
130                 Path mypath2=new Path();//新建一個路徑為路徑2
131                 mypath2.moveTo(400, 680);//起始線
132                 mypath2.lineTo(480, 680);//結束線
133                 canvas.drawPath(mypath2, paint);
134 
135                 //繪制大白的身體
136                 Path mypath3=new Path();//新建一個路徑為路徑3
137                 //左半邊身體弧形
138                 mypath3.moveTo(430, 730);//起始線
139                 mypath3.quadTo(260, 850, 350, 1100);//quadTo 用於繪制圓滑曲線,即貝塞爾曲線。
140                 //右半邊身體弧形
141                 mypath3.moveTo(570, 730);//起始線
142                 mypath3.quadTo(700, 850, 650, 1100);//quadTo 用於繪制圓滑曲線,即貝塞爾曲線。
143 
144                 //下半身弧形
145                 mypath3.moveTo(350, 1100);//起始線
146                 mypath3.quadTo(500, 1200, 650, 1100);//quadTo 用於繪制圓滑曲線,即貝塞爾曲線。
147 
148                 //繪制左腳
149                 mypath3.moveTo(350, 1100);//起始線
150                 mypath3.quadTo(400, 1500, 500, 1150);//quadTo 用於繪制圓滑曲線,即貝塞爾曲線。
151                 //繪制右腳
152                 mypath3.moveTo(500, 1150);//起始線
153                 mypath3.quadTo(500, 1500, 650, 1100);//quadTo 用於繪制圓滑曲線,即貝塞爾曲線。
154                 paint1.setStyle(Paint.Style.FILL);//畫筆2樣式 設置為實心
155                 paint1.setColor(Color.WHITE);//設置畫筆2顏色為白色
156                 canvas.drawPath(mypath3, paint);
157                 canvas.drawPath(mypath3, paint1);
158 
159             }
160 
161 
162 
163 
164 
165         }
166         }
167 
168 
169 
170 
171 
172 
173 
174     }

三、創建assets文件目錄導入字體

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM