直接上效果:
11.jpg
22.jpg
33.jpg
44.jpg
55.jpg
還實現(xiàn)了前進兵罢,后退,清除功能
下面是主要代碼:
package com.ltmb.demo;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PorterDuff;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Toast;
import com.socks.library.KLog;
import java.util.ArrayList;
import java.util.List;
/**
* @author chenshichun
* 創(chuàng)建日期:2022/4/25
* 描述:
*/
public class DrawView extends View implements View.OnClickListener {
private final Canvas canvas;//聲明畫筆
private final Paint paint;//聲明畫布
private final Paint surfacePaint;//聲明畫布
private final Bitmap bitmap;//聲明位圖
private final Paint textPaint;//聲明畫布
private final Context context;
private final List<PointBean> pointBeanList = new ArrayList();// 點集合
private final List<PointBean> pointBeanListCopy = new ArrayList();// 點集合備份數(shù)據(jù)但汞,用于前進
private final List<LineBean> lineBeansList = new ArrayList();// 線集合
public DrawView(Context context) {
super(context);
this.context = context;
// TODO 自動生成的構(gòu)造函數(shù)存根
// bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test).copy(Bitmap.Config.ARGB_8888, true);//設(shè)置位圖的寬高
bitmap = Bitmap.createBitmap(1280, 1800, Bitmap.Config.ALPHA_8);//設(shè)置位圖的寬高
canvas = new Canvas(bitmap);
// 點和線paint
paint = new Paint();//創(chuàng)建一個畫筆
paint.setStyle(Paint.Style.STROKE);//設(shè)置非填充
paint.setStrokeWidth(10);//筆寬5像素
paint.setColor(Color.parseColor("#197AFF"));
paint.setAntiAlias(true);//鋸齒不顯示
paint.setDither(true);//設(shè)置圖像抖動處理
paint.setStrokeJoin(Paint.Join.ROUND);//設(shè)置圖像的結(jié)合方式
paint.setStrokeCap(Paint.Cap.ROUND);//設(shè)置畫筆為圓形樣式
// 面paint
surfacePaint = new Paint(Paint.DITHER_FLAG);//創(chuàng)建一個畫筆
surfacePaint.setStyle(Paint.Style.FILL);//設(shè)置填充
surfacePaint.setStrokeWidth(5);//筆寬5像素
surfacePaint.setColor(Color.parseColor("#54197AFF"));
surfacePaint.setAntiAlias(true);//鋸齒不顯示
surfacePaint.setDither(true);//設(shè)置圖像抖動處理
surfacePaint.setStrokeJoin(Paint.Join.ROUND);//設(shè)置圖像的結(jié)合方式
surfacePaint.setStrokeCap(Paint.Cap.ROUND);//設(shè)置畫筆為圓形樣式
// 文字paint
textPaint = new Paint(Paint.DITHER_FLAG);//創(chuàng)建一個畫筆
textPaint.setStyle(Paint.Style.FILL);//設(shè)置填充
textPaint.setStrokeWidth(2);//筆寬5像素
textPaint.setColor(Color.parseColor("#ffffffff"));
textPaint.setTextSize(56f);
textPaint.setAntiAlias(true);//鋸齒不顯示
textPaint.setDither(true);//設(shè)置圖像抖動處理
textPaint.setStrokeJoin(Paint.Join.ROUND);//設(shè)置圖像的結(jié)合方式
textPaint.setStrokeCap(Paint.Cap.ROUND);//設(shè)置畫筆為圓形樣式
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawBitmap(bitmap, 0, 0, paint);
}
private boolean isDraw = false;
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction() & MotionEvent.ACTION_MASK;
switch (action) {
case MotionEvent.ACTION_DOWN:
float currentX = event.getX();
float currentY = event.getY();
if (isRestart) {
PointBean pointBean = new PointBean();
pointBean.setX(currentX);
pointBean.setY(currentY);
pointBeanList.add(pointBean);
pointBeanListCopy.add(pointBean);
if (pointBeanListCopy.size() < pointBeanList.size()) {// 說明是后退以后再點擊
pointBeanList.clear();
pointBeanList.addAll(pointBeanListCopy);
}
drawPointLines(pointBeanList);
} else {// 點擊設(shè)置長度
// 創(chuàng)建線集合數(shù)據(jù)
lineBeansList.clear();
KLog.d("chenshichun", pointBeanList);
for (int i = 0; i < pointBeanList.size(); i++) {
LineBean lineBean = new LineBean();
if (i + 1 < pointBeanList.size()) {
lineBean.x = pointBeanList.get(i).getX();
lineBean.y = pointBeanList.get(i).getY();
lineBean.x1 = pointBeanList.get(i + 1).getX();
lineBean.y1 = pointBeanList.get(i + 1).getY();
lineBeansList.add(lineBean);
}
}
KLog.d("chenshichun", lineBeansList);
KLog.d("chenshichun", "currentX " + currentX + " currentY " + currentY);
isDraw = false;
for (LineBean lineBean : lineBeansList) {
if (((currentX < lineBean.x && currentX > lineBean.x1)
|| (currentX > lineBean.x && currentX < lineBean.x1)) &&
((currentY < lineBean.y && currentY > lineBean.y1)
|| (currentY > lineBean.y && currentY < lineBean.y1))) {// 點擊的點所在的線
Toast.makeText(context, "ss", Toast.LENGTH_SHORT).show();
KLog.d("chenshichun", lineBean);
textPaint.setColor(getResources().getColor(R.color.white));
canvas.drawText("100", (lineBean.x + lineBean.x1) / 2, (lineBean.y + lineBean.y1) / 2, textPaint);
invalidate();
isDraw = true;
}
}
if (!isDraw) {
Toast.makeText(context, "請點擊對應(yīng)線", Toast.LENGTH_SHORT).show();
}
}
break;
case MotionEvent.ACTION_POINTER_DOWN:
break;
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_UP:
break;
}
return true;
}
/*
* 畫點線面
* */
private boolean isRestart = true;
Path path1;
Path path2;
private void drawPointLines(List<PointBean> beanList) {
// 每次清除畫布
canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
if (beanList.size() > 1) {
path1 = new Path();// 線的顏色藍色
path2 = new Path();// 面的顏色淡藍色
// 判斷最后一個點和第一個點重合
if (Math.abs(beanList.get(0).getX() - beanList.get(beanList.size() - 1).getX()) < 30
&& Math.abs(beanList.get(0).getY() - beanList.get(beanList.size() - 1).getY()) < 30) {
beanList.get(beanList.size() - 1).setX(beanList.get(0).getX());
beanList.get(beanList.size() - 1).setY(beanList.get(0).getY());
for (int i = 0; i < beanList.size(); i++) {
if (i == 0) {
path1.moveTo(beanList.get(i).getX(), beanList.get(i).getY());
path2.moveTo(beanList.get(i).getX(), beanList.get(i).getY());
} else {
path1.lineTo(beanList.get(i).getX(), beanList.get(i).getY());
path2.lineTo(beanList.get(i).getX(), beanList.get(i).getY());
}
}
path2.close();
isRestart = false;
surfacePaint.setStyle(Paint.Style.FILL);
} else {
for (int i = 0; i < beanList.size(); i++) {
if (i == 0) {
path1.moveTo(beanList.get(i).getX(), beanList.get(i).getY());
} else {
path1.lineTo(beanList.get(i).getX(), beanList.get(i).getY());
}
}
}
canvas.drawPath(path1, paint);
canvas.drawPath(path2, surfacePaint);
} else {
canvas.drawPoint(beanList.get(0).getX(), beanList.get(0).getY(), paint);
}
invalidate();//使繪畫動作生效
}
@Override
public void onClick(View v) {
}
/*
* 前進
* */
public void forward() {
if (pointBeanListCopy.size() < pointBeanList.size()) {
pointBeanListCopy.add(pointBeanList.get(pointBeanListCopy.size()));
drawPointLines(pointBeanListCopy);
invalidate();//使繪畫動作生效
}
}
/*
* 后退
* */
public void backOff() {
isRestart = true;
pointBeanListCopy.remove(pointBeanListCopy.size() - 1);
drawPointLines(pointBeanListCopy);
invalidate();//使繪畫動作生效
}
public void clear() {
isRestart = true;
pointBeanList.clear();
pointBeanListCopy.clear();
canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
invalidate();//使繪畫動作生效
}
}
完整代碼:https://github.com/chenshichun/DrawCanvas-android
歡迎收藏點贊