android 画板(选择图片作为背景并保存)

我看了一下网上画板的写法有很多种,这篇文章的写法就是简单便捷,个人觉得不错,大家可以参考一下,

http://blog.csdn.net/qq_31530015/article/details/51115680  

当然这篇文章只是描述了以白色背景作为画板底色,如果是要选择图片作为背景并且保存呢,下面是我自己在这个基础上修改的,代码有点粗糙,但是能实现我们所需要的功能,废话不多说了,直接上代码吧

1、利用drawable(mimap)中的图片资源作为背景

package com.example.viewtest;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Environment;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.Button;
import android.widget.ImageView;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class SecondActivity extends Activity {

	private ImageView img,imageTwo;
	private Bitmap mBitmap;
	private Canvas canvas;
	private Paint paint;
	// 重置按钮
	private Button reset_btn,save_btn;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_second);

		img = (ImageView) findViewById(R.id.img);
		imageTwo = (ImageView) findViewById(R.id.img_two);


		reset_btn = (Button) findViewById(R.id.reset_btn);
		save_btn = (Button) findViewById(R.id.save_btn);

		reset_btn.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				img.setImageBitmap(null);
				showImage();

			}
		});

		save_btn.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View view) {
				setmBitmap();
			}
		});
		// 绘图
		showImage();

	}

	private void showImage() {
		int height = getWindow().getWindowManager().getDefaultDisplay().getHeight();
		int wehit = getWindow().getWindowManager().getDefaultDisplay().getWidth();
		// 创建一张图片
		mBitmap = drawableToBitamp(getResources().getDrawable(R.drawable.siji));   //drawable中的图片
		// 创建一张画布
		canvas = new Canvas(mBitmap);
		// 创建画笔
		paint = new Paint();
		// 画笔颜色为蓝色
		paint.setColor(Color.BLUE);
		// 宽度5个像素
		paint.setStrokeWidth(5);
		// 先将背景画上
		canvas.drawBitmap(mBitmap, new Matrix(), paint);
		img.setImageBitmap(mBitmap);

		img.setOnTouchListener(new OnTouchListener() {
			int startX;
			int startY;

			@Override
			public boolean onTouch(View v, MotionEvent event) {
				switch (event.getAction()) {
				case MotionEvent.ACTION_DOWN:
					// 获取手按下时的坐标
					startX = (int) event.getX();
					startY = (int) event.getY();
					break;
				case MotionEvent.ACTION_MOVE:
					// 获取手移动后的坐标
					int endX = (int) event.getX();
					int endY = (int) event.getY();
					// 在开始和结束坐标间画一条线
					canvas.drawLine(startX, startY, endX, endY, paint);
					// 刷新开始坐标
					startX = (int) event.getX();
					startY = (int) event.getY();
					img.setImageBitmap(mBitmap);
					break;
				}
				return true;
			}
		});

	}
<span style="white-space:pre">	</span>//保存到内存卡中

	 public void setmBitmap(){
		 File file = new File(Environment.getExternalStorageDirectory(),
				 "/test" + ".png");
		 if(!file.exists()){
			 OutputStream stream;
			 try {
				 file.createNewFile() ;
				 stream = new FileOutputStream(file);
				 mBitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
				 stream.close();
			 } catch (IOException e) {
				 e.printStackTrace();
			 }
		 }else {
			 OutputStream stream;
			 try {
				 stream = new FileOutputStream(file);
				 mBitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
				 stream.close();
			 } catch (IOException e) {
				 e.printStackTrace();
			 }
		 }
		 readSdPic();
	 }
<span style="white-space:pre">	</span>//读取出图片并显示
	public void readSdPic(){
		File file = new File(Environment.getExternalStorageDirectory(),
				"/test" + ".png");
		Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
		imageTwo.setImageBitmap(bitmap);   //显示图片
	}
<span style="white-space:pre">	</span>//<span style="font-family: Arial, Helvetica, sans-serif;">drawable转换为bitmap</span>
	private Bitmap bitmap;
	private Bitmap drawableToBitamp(Drawable drawable)
	{
		int w = drawable.getMinimumWidth();
		int h = drawable.getMinimumHeight();
//		int height = getWindow().getWindowManager().getDefaultDisplay().getHeight();
		int wehit = getWindow().getWindowManager().getDefaultDisplay().getWidth();
		System.out.println("Drawable转Bitmap");
		Bitmap.Config config =
				drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
						: Bitmap.Config.RGB_565;
		bitmap = Bitmap.createBitmap(wehit,500,config);
		//注意,下面三行代码要用到,否在在View或者surfaceview里的canvas.drawBitmap会看不到图
		Canvas canvas = new Canvas(bitmap);
		drawable.setBounds(0, 0, w, h);
		drawable.draw(canvas);
		return bitmap;
	}
}
这样就可以实现图片的保存了,这种方式相对来说要简单一些,下面第二种通过读取手机图片或者拍照就要麻烦一点了

2、我们获取到的图片大小不一,有的能显示全屏,有的则不能显示。上面的代码如果试过就知道,只有当你点击到图片原来尺寸上的时候才能够绘画,如果强行让imageview全屏显示,那么就会出现错位的情况,因为画笔只监听了bitmap(获取图片)原来的尺寸,超出的部分则不会画到图片上,相当于无效的绘图,这样就出现了错位的感觉

package com.house.checkhouse.activity;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.os.Bundle;
import android.os.Environment;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.Button;
import android.widget.ImageView;

import com.house.checkhouse.R;
import com.house.checkhouse.model.message.ImageInfo;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Calendar;

public class SecondActivity extends Activity {
	public static final String IMAGE = "images";
	private ImageView img;
	private Bitmap mBitmap,nowBitmap;
	private Canvas canvas;
	private Paint paint;
	private ImageInfo imageInfo;
	private String fileUri;
	// 重置按钮
	private Button reset_btn,save_btn;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_second);
		imageInfo = getIntent().getParcelableExtra("image");   //通过打开相册或者照相传递过来的bitmap图片

		fileUri = getNowFileName();

		mBitmap = imageInfo.getBitmap();
		nowBitmap = mBitmap;

		img = (ImageView) findViewById(R.id.img);


		reset_btn = (Button) findViewById(R.id.reset_btn);
		save_btn = (Button) findViewById(R.id.save_btn);

		reset_btn.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				img.setImageBitmap(null);
				showImage();
			}
		});

		save_btn.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View view) {
//				setmBitmap();
			}
		});
		// 绘图
		showImage();

	}

	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		System.gc();
		setmBitmap();
		Intent intent = new Intent();
		intent.putExtra(IMAGE,fileUri);
		setResult(RESULT_OK, intent);
		return super.onKeyDown(keyCode, event);

	}

	private void showImage() {
		// 创建一张图片
		nowBitmap = mBitmap.copy(Bitmap.Config.ARGB_8888,true);
		nowBitmap = big(nowBitmap);   //放大bitmap
		// 创建一张画布
		canvas = new Canvas(nowBitmap);
		// 创建画笔
		paint = new Paint();
		// 画笔颜色为蓝色
		paint.setColor(Color.BLUE);
		// 宽度1个像素
		paint.setStrokeWidth(3);
		// 先将背景画上
		canvas.drawBitmap(nowBitmap, new Matrix(), paint);
		img.setImageBitmap(nowBitmap);

		img.setOnTouchListener(new OnTouchListener() {
			int startX;
			int startY;

			@Override
			public boolean onTouch(View v, MotionEvent event) {
				switch (event.getAction()) {
				case MotionEvent.ACTION_DOWN:
					// 获取手按下时的坐标
					startX = (int) event.getX();
					startY = (int) event.getY();
					break;
				case MotionEvent.ACTION_MOVE:
					// 获取手移动后的坐标
					int endX = (int) event.getX();
					int endY = (int) event.getY();
					// 在开始和结束坐标间画一条线
					canvas.drawLine(startX, startY, endX, endY, paint);
					// 刷新开始坐标
					startX = (int) event.getX();
					startY = (int) event.getY();
					img.setImageBitmap(nowBitmap);
					break;
				}
				return true;
			}
		});

	}

	/**
	 * 获取文件路径和名字(保存路径)
	 * @return
     */
	public String getNowFileName(){
		SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMdd");//格式大小写有区别
		String sysDatetime = fmt.format(Calendar.getInstance().getTime());//2016年02月25日  13:23:40
		String fileName = Environment.getExternalStorageDirectory()+File.separator+"com.house"+File.separator+sysDatetime+".png";
		return fileName;
	}

	 public void setmBitmap(){

		 File file = new File(fileUri);
		 if(!file.exists()){
			 OutputStream stream;
			 try {
				 file.createNewFile() ;
				 stream = new FileOutputStream(file);
				 nowBitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
				 stream.close();
			 } catch (IOException e) {
				 e.printStackTrace();
			 }
		 }else {
			 OutputStream stream;
			 try {
				 stream = new FileOutputStream(file);
				 nowBitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
				 stream.close();
			 } catch (IOException e) {
				 e.printStackTrace();
			 }
		 }
	 }
	/**
	 * 放大bitmap(放大到全屏显示,这样才不会出现错位情况,完全可以指哪儿画哪儿)
	 * @param bitmap
	 * @return
     */
	private Bitmap big(Bitmap bitmap) {
		int height = bitmap.getHeight();
		int width = bitmap.getWidth();
		int heightWon = getWindow().getWindowManager().getDefaultDisplay().getHeight();
		int widthWon = getWindow().getWindowManager().getDefaultDisplay().getWidth();
		float sizeW = (float) widthWon/width;
		float sizeH = (float) heightWon/height;
		Matrix matrix = new Matrix();
		float size = sizeH<sizeW?sizeH:sizeW;  //(按照一长或宽的比例来缩放)
		matrix.postScale(size,size); //长和宽放大缩小的比例
		Bitmap resizeBmp = Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true);
		return resizeBmp;
	}

}

好了,这样就大功告成了,写起来感觉很简单,但是花费了我一天的时间才搞出来,如果大家有什么更好的方法,希望能分享一下




  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值