今天实现的是画板效果
实现原理
根据触摸事件返回的坐标点绘制path路径
@Override
public boolean onTouchEvent(MotionEvent event) {
x = event.getX();
y = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
//当触摸屏幕的时候将点移动到触摸的位置
path.moveTo(x, y);
break;
case MotionEvent.ACTION_MOVE:
//当滑动的时候将滑动路径连接起来
path.lineTo(x, y);
//在滑动的过程中不断更新界面
invalidate();
break;
case MotionEvent.ACTION_UP:
//当手抬起的时候更新界面
invalidate();
break;
}
return true;
}
canvas绘制路径
//绘制白色背景
canvas.drawColor(Color.WHITE);
//绘制路径
canvas.drawPath(path, paint);
最后保存自己绘制的图像
public void save() {
setDrawingCacheEnabled(false);
setDrawingCacheEnabled(true);
new Thread(new Runnable() {
@Override
public void run() {
Bitmap drawingCache = getDrawingCache(true);
File file = new File(getContext().getCacheDir() + "123.png");
FileOutputStream fileOutputStream = null;
try {
fileOutputStream = new FileOutputStream(file);
drawingCache.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream);
fileOutputStream.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fileOutputStream != null) {
try {
fileOutputStream.close();
try {
MediaStore.Images.Media.insertImage(getContext().getContentResolver(),
file.getAbsolutePath(), "sad.png", null);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
// 最后通知图库更新
getContext().sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + file.getPath())));
Log.e("测试", "保存成功");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}).start();
}
完整代码
package com.yuyigufen.customview;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.net.Uri;
import android.provider.MediaStore;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Random;
/**
* Created by Administrator on 2018/6/11 0011.
*/
public class MyPaintView extends View {
private float x;
private float y;
private Path path;
private Paint paint;
private Random random;
public MyPaintView(Context context) {
super(context);
}
public MyPaintView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
random = new Random();
paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(10);
paint.setColor(Color.RED);
path = new Path();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(measureSize(widthMeasureSpec), measureSize(heightMeasureSpec));
}
private int measureSize(int size) {
int mode = MeasureSpec.getMode(size);
int s = MeasureSpec.getSize(size);
if (mode == MeasureSpec.EXACTLY) {
return s;
} else if (mode == MeasureSpec.AT_MOST) {
return Math.min(s, 200);
} else {
return 200;
}
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawColor(Color.WHITE);
canvas.drawPath(path, paint);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
x = event.getX();
y = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
path.moveTo(x, y);
break;
case MotionEvent.ACTION_MOVE:
path.lineTo(x, y);
invalidate();
break;
case MotionEvent.ACTION_UP:
invalidate();
break;
}
return true;
}
public void clear() {
path.reset();
invalidate();
}
public void save() {
setDrawingCacheEnabled(false);
setDrawingCacheEnabled(true);
new Thread(new Runnable() {
@Override
public void run() {
Bitmap drawingCache = getDrawingCache(true);
File file = new File(getContext().getCacheDir() + "123.png");
FileOutputStream fileOutputStream = null;
try {
fileOutputStream = new FileOutputStream(file);
drawingCache.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream);
fileOutputStream.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fileOutputStream != null) {
try {
fileOutputStream.close();
try {
MediaStore.Images.Media.insertImage(getContext().getContentResolver(),
file.getAbsolutePath(), "sad.png", null);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
// 最后通知图库更新
getContext().sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + file.getPath())));
Log.e("测试", "保存成功");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}).start();
}
}