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文件目錄導入字體