android涂鸦

最近一段时间,项目中主要和媒体资源打交道,今天抽时间来将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;
	}
}

基本就是这样。欢迎批评指正!



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值