android 画板(选择图片作为背景并保存)
2016-11-03 16:28
323 查看
我看了一下网上画板的写法有很多种,这篇文章的写法就是简单便捷,个人觉得不错,大家可以参考一下,
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;
}
});
}
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;
}
}
好了,这样就大功告成了,写起来感觉很简单,但是花费了我一天的时间才搞出来,如果大家有什么更好的方法,希望能分享一下
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;
}
}
好了,这样就大功告成了,写起来感觉很简单,但是花费了我一天的时间才搞出来,如果大家有什么更好的方法,希望能分享一下
相关文章推荐
- Android画板开发(四) 添加背景和保存画板内容为图片
- Android从图库中选择图片并作为Activity的背景(主题)
- android 选择本地图片上传到服务端并保存
- android 选择本地图片并截剪图片保存到,sdcard指定目录中
- android 选择图片以及拍照,保存图片
- Android中相机拍摄照片,以及相册选择图片压缩上传(压缩后保存进SD中)(可用于修改头像等)
- android 比较靠谱的选择图片以及拍照,保存图片
- android 透明背景黑色字图片 保存得到本地 显示黑色图片
- android 选择本地图片并截剪图片保存到,sdcard指定目录中
- Android开发中,9-patch (九宫格)图片作为背景带来的问题
- winform 打开文件管理 选择图片作为 panel的背景
- android 比较靠谱的选择图片以及拍照,保存图片
- 【android】把view保存为图片的方法以及解决保存后图片背景变黑色的问题
- android 选择本地图片并截剪图片保存到,sdcard指定目录中
- Android在程序中启动拍照/摄像或选择一张图片/视频,并制作缩略图后保存
- Android在程序中启动拍照/摄像或选择一张图片/视频,并制作缩略图后保存
- android canvas读取背景图片,涂鸦之后保存
- android canvas读取背景图片,涂鸦之后保存
- android 从手机自带图库选取图片作为应用背景图
- Android实现拍照,以及从相册选择图片裁剪功能同时保存在本地