画画板功能实现
1 获取一张背景图片 BitmpFactory.decodeResource
2 创建一个副本
3 设置imageview的onTouch事件 判断事件的类型, 根据事件的 类型获取 开始和结束的位置 划线 重新设置给imagevie
4 获取imageview被操作的事件类型 event.getAction
5 鼠标按下 抬起 移动操作
6 将图片保存至图库
public classMainActivityextendsAppCompatActivityimplementsView.OnClickListener{
privateBitmapbitmap_copy;//原图 副本
private floatstartX;
private floatstartY;
privatePaintpaint;
@Override
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private voidinitView() {
findViewById(R.id.bt_save).setOnClickListener(this);
findViewById(R.id.bt_strong).setOnClickListener(this);
findViewById(R.id.bt_white).setOnClickListener(this);
finalImageView iv_imageview = (ImageView) findViewById(R.id.iv_imageview);
//将图片资源文件 转化成bitmap
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.bg1);//原图
//将原图cope一份作为 作画的 白纸
bitmap_copy= bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(),bitmap.getConfig());
//创建画笔
paint=newPaint();
paint.setColor(Color.RED);
//创建画板 将白纸铺到 画板上
finalCanvas canvas =newCanvas(bitmap_copy);
//将 原图 画在画板上
canvas.drawBitmap(bitmap,newMatrix(),paint);
//将图片的副本 设置给imageview、
iv_imageview.setImageBitmap(bitmap_copy);
//设置imageview的ontouchevent时间
iv_imageview.setOnTouchListener(newView.OnTouchListener() {
@Override
public booleanonTouch(View v,MotionEvent event) {
switch(event.getAction()){
caseMotionEvent.ACTION_DOWN://按下
//获取按下时的x,y轴
startX= event.getX();
startY= event.getY();
break;
caseMotionEvent.ACTION_UP://抬起
break;
caseMotionEvent.ACTION_MOVE://移动
//获取移动后的x,y轴
floatstopX = event.getX();
floatstopY = event.getY();
for(inti =0;i<3;i++){
canvas.drawLine(startX+i,startY+i,stopX+i,stopY+i,paint);
}
//将结束的 位置 赋值 给开始的位置
startX= stopX;
startY= stopY;
iv_imageview.setImageBitmap(bitmap_copy);
break;
}
//返回false代表 上一个 事件未消耗不能执行事件 例如:返回false时 只能执行按下事件 返回true时则 可以执行下面的事件
return true;
}
});
}
@Override
public voidonClick(View v) {
switch(v.getId()){
caseR.id.bt_save://保存
saveImageToGallery(this,bitmap_copy);
break;
caseR.id.bt_strong://加粗
paint.setStrokeWidth(15);
break;
caseR.id.bt_white://白色
paint.setColor(Color.WHITE);
break;
}
}
public voidsaveImageToGallery(Context context,Bitmap bmp) {
if(bmp ==null){
Toast.makeText(this,"保存出错了",Toast.LENGTH_LONG).show();
return;
}
//首先保存图片
File appDir =newFile(Environment.getExternalStorageDirectory(),"lishuai");
if(!appDir.exists()) {
appDir.mkdir();
}
String fileName = System.currentTimeMillis() +".jpg";
File file =newFile(appDir,fileName);
try{
FileOutputStream fos =newFileOutputStream(file);
bmp.compress(Bitmap.CompressFormat.JPEG,100,fos);
fos.flush();
fos.close();
}catch(FileNotFoundException e) {
Toast.makeText(this,"文件未发现",Toast.LENGTH_LONG).show();
e.printStackTrace();
}catch(IOException e) {
Toast.makeText(this,"保存出错了",Toast.LENGTH_LONG).show();
e.printStackTrace();
}catch(Exception e){
Toast.makeText(this,"保存出错了",Toast.LENGTH_LONG).show();
e.printStackTrace();
}
//最后通知图库更新
try{
MediaStore.Images.Media.insertImage(context.getContentResolver(),file.getAbsolutePath(),fileName, null);
}catch(FileNotFoundException e) {
e.printStackTrace();
}
Intent intent =newIntent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
Uri uri = Uri.fromFile(file);
intent.setData(uri);
context.sendBroadcast(intent);
Toast.makeText(this,"保存成功了",Toast.LENGTH_LONG).show();
}
}