最近一段时间,项目中主要和媒体资源打交道,今天抽时间来将android涂鸦的东西整理一下,并且发布一下,也供自己以后参考,废话不说了,上代码:
首先是一个View类:
package winning.NurseTouch.Multimedia;
import java.util.ArrayList;
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.Bitmap.Config;
import android.view.MotionEvent;
import android.view.View;
public class TuYa extends View {
private Paint paint;
private Canvas cacheCanvas;
private Bitmap cachebBitmap, newBitmap1, newBitmap2;
private float cur_x, cur_y;
private Path path;
private DrawPath dp;
private ArrayList<DrawPath> mpath = null;
private boolean isClear = false;
public class DrawPath {
public Path mPath;// 路径
public Paint paint;// 画笔
}
public TuYa(Context context, int w, int h) {
super(context);
paint = new Paint();
paint.setAntiAlias(true);
paint.setStrokeWidth(5);
paint.setStyle(Paint.Style.STROKE);
paint.setColor(Color.CYAN);
cachebBitmap = Bitmap.createBitmap(w, h, Config.ARGB_8888);
newBitmap1 = Bitmap.createBitmap(cachebBitmap);
mpath = new ArrayList<TuYa.DrawPath>();
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawColor(Color.parseColor("#a7afaf"));
if (isClear) {
cacheCanvas = new Canvas(newBitmap2);
canvas.drawBitmap(newBitmap2, 0, 0, null);
isClear = false;
} else {
//绘画上次内容
cacheCanvas = new Canvas(newBitmap1);
canvas.drawBitmap(newBitmap1, 0, 0, null);
if (path != null) {
canvas.drawPath(path, paint);
}
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
float x = event.getX();
float y = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: {
path = new Path();
dp = new DrawPath();
dp.mPath = path;
dp.paint = paint;
cur_x = x;
cur_y = y;
path.moveTo(cur_x, cur_y);
break;
}
case MotionEvent.ACTION_MOVE: {
// 二次曲线方式绘制
path.quadTo(cur_x, cur_y, x, y);
cur_x = x;
cur_y = y;
break;
}
case MotionEvent.ACTION_UP: {
// 鼠标弹起保存最后状态
cacheCanvas.drawPath(path, paint);
mpath.add(dp);
// path.reset(); //与path = null的区别
path = null;
break;
}
}
// 刷新界面
invalidate();
return true;
}
public ArrayList<DrawPath> getMpath() {
return mpath;
}
public void setMpath(ArrayList<DrawPath> mpath) {
this.mpath = mpath;
}
public void clear() {
isClear = true;
mpath = null;
newBitmap2 = Bitmap.createBitmap(cachebBitmap);
newBitmap1 = Bitmap.createBitmap(cachebBitmap);
mpath = new ArrayList<TuYa.DrawPath>();
invalidate();
}
}
下面是一个调用TuYa这个View的Activity,这个activity是项目的一部分,如果有网友想实现自己的东西,可以参考
package winning.NurseTouch;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import winning.NurseTouch.Multimedia.TuYa;
import winning.NurseTouch.ViewUtil.ViewUtil;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.Toast;
public class TuYaActivity extends Activity {
private TuYa view;
private Button clearBtn, sureBtn;
private LinearLayout layout;
ArrayList<TuYa.DrawPath> list = new ArrayList<TuYa.DrawPath>();
private String tuyaFileName = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.tuya_layout);
if(Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)) {
init();
} else {
Toast.makeText(TuYaActivity.this, "SD卡不可用", 400).show();
Intent intent = new Intent(TuYaActivity.this,
BWLNew.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
MainActivity.act.switchActivity(intent, ViewUtil.MENU_BWLNEW, 2);
finish();
}
}
private void init() {
int screenW = getWindowManager().getDefaultDisplay().getWidth();
int screenH = getWindowManager().getDefaultDisplay().getHeight();
view = new TuYa(this, screenW, screenH - 100);
layout = (LinearLayout) findViewById(R.id.tuya);
clearBtn = (Button) findViewById(R.id.tuya_clear);
sureBtn = (Button) findViewById(R.id.tuya_sure);
clearBtn.setOnClickListener(BtnListener);
sureBtn.setOnClickListener(BtnListener);
layout.addView(view);
view.setDrawingCacheEnabled(true);
}
OnClickListener BtnListener = new OnClickListener() {
@Override
public void onClick(View v) {
if (v == clearBtn) {
view.clear();
} else if (v == sureBtn) {
if (view.getMpath() != null && view.getMpath().size() > 0) {
Bitmap b = view.getDrawingCache();
String path = saveFileToSd(b);
Intent intent = new Intent(TuYaActivity.this,
BWLEditNew.class);//这里是要传递到的对应的activity
MainActivity.act.setType(ViewUtil.MENU_BWLEDITNEW);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra("tuyaPath", path);
intent.putExtra("tuyaFileName", tuyaFileName);
intent.putExtra("lb", "涂鸦");
startActivity(intent);
finish();
} else {
Toast.makeText(TuYaActivity.this, "您没有涂鸦内容", Toast.LENGTH_LONG).show();
}
}
}
};
private String saveFileToSd(Bitmap b) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
b.compress(Bitmap.CompressFormat.JPEG, 100, baos);
tuyaFileName = getPhotoFileName();
String path = getMkDir() + "/"+tuyaFileName;
File file = new File(path);
FileOutputStream fos = null;
if (!file.exists()) {
try {
fos = new FileOutputStream(file);
fos.write(baos.toByteArray(), 0, baos.toByteArray().length);
fos.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if(fos != null) {
fos.close();
fos = null;
}
if(baos != null) {
baos.close();
baos = null;
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
return path;
}
//获取文件名
private String getPhotoFileName() {
Date date = new Date(System.currentTimeMillis());
SimpleDateFormat dateFormat = new SimpleDateFormat(
"'IMG'_yyyyMMdd_HHmmss");
return dateFormat.format(date) + ".jpg";
}
private String getMkDir() {
String saveDir = Environment.getExternalStorageDirectory() + "/nurse";
File dir = new File(saveDir);
if (!dir.exists()) {
dir.mkdir(); // 创建文件夹
}
return saveDir;
}
}
基本就是这样。欢迎批评指正!