文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Android编程实现手绘及保存为图片的方法(附demo源码下载)

2022-06-06 09:25

关注

本文实例讲述了Android编程实现手绘及保存为图片的方法。分享给大家供大家参考,具体如下:

运行效果图预览:

应 yzuo_08 要求做了此Demo,跟以前那个手写板Demo不同的是可以将画布的内容保存为图片。

附上关键代码:

MainView.java


package com.tszy.views; 
import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.Bitmap.CompressFormat; 
import android.graphics.Bitmap.Config; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.Path; 
import android.util.AttributeSet; 
import android.view.MotionEvent; 
import android.view.View; 
public class MainView extends View { 
 private Paint paint; 
 private Canvas cacheCanvas; 
 private Bitmap cachebBitmap; 
 private Path path; 
 private int clr_bg, clr_fg; 
 public MainView(Context context, AttributeSet attrs) { 
  super(context, attrs); 
  clr_bg = Color.WHITE; 
  clr_fg = Color.CYAN; 
  paint = new Paint(); 
  paint.setAntiAlias(true); // 抗锯齿 
  paint.setStrokeWidth(3); // 线条宽度 
  paint.setStyle(Paint.Style.STROKE); // 画轮廓 
  paint.setColor(clr_fg); // 颜色 
  path = new Path(); 
  // 创建一张屏幕大小的位图,作为缓冲 
  cachebBitmap = Bitmap.createBitmap(480, 800, Config.ARGB_8888); 
  cacheCanvas = new Canvas(cachebBitmap); 
  cacheCanvas.drawColor(clr_bg); 
 } 
 public MainView(Context context) { 
  super(context); 
 } 
 @Override 
 protected void onDraw(Canvas canvas) { 
  canvas.drawColor(clr_bg); 
  // 绘制上一次的,否则不连贯 
  canvas.drawBitmap(cachebBitmap, 0, 0, null); 
  canvas.drawPath(path, paint);
 } 
  
 public void clear() { 
  path.reset(); 
  cacheCanvas.drawColor(clr_bg); 
  invalidate(); 
 } 
  
 public void saveToFile(String filename) throws FileNotFoundException { 
  File f = new File(filename); 
  if(f.exists()) 
   throw new RuntimeException("文件:" + filename + " 已存在!"); 
  FileOutputStream fos = new FileOutputStream(new File(filename)); 
  //将 bitmap 压缩成其他格式的图片数据 
  cachebBitmap.compress(CompressFormat.PNG, 50, fos); 
  try { 
   fos.close(); 
  } catch (IOException e) { 
   // TODO Auto-generated catch block 
   e.printStackTrace(); 
  } 
 } 
 private float cur_x, cur_y; 
 private boolean isMoving; 
 @Override 
 public boolean onTouchEvent(MotionEvent event) { 
  // TODO Auto-generated method stub 
  float x = event.getX(); 
  float y = event.getY(); 
  switch (event.getAction()) { 
   case MotionEvent.ACTION_DOWN : { 
    cur_x = x; 
    cur_y = y; 
    path.moveTo(cur_x, cur_y); 
    isMoving = true; 
    break; 
   } 
   case MotionEvent.ACTION_MOVE : { 
    if (!isMoving) 
     break; 
    // 二次曲线方式绘制 
    path.quadTo(cur_x, cur_y, x, y); 
    // 下面这个方法貌似跟上面一样 
    // path.lineTo(x, y); 
    cur_x = x; 
    cur_y = y; 
    break; 
   } 
   case MotionEvent.ACTION_UP : { 
    // 鼠标弹起保存最后状态 
    cacheCanvas.drawPath(path, paint); 
    path.reset(); 
    isMoving = false; 
    break; 
   } 
  } 
  // 通知刷新界面 
  invalidate(); 
  return true; 
 } 
}

Activity 代码:


@Override 
public void onClick(View v) { 
  // TODO Auto-generated method stub 
  switch (v.getId()) { 
   case R.id.iv_btn_clear : 
    view.clear(); 
    break; 
   case R.id.iv_btn_save : { 
    try { 
     String sdState = Environment.getExternalStorageState(); // 判断sd卡是否存在 
     // 检查SD卡是否可用 
     if (!sdState.equals(android.os.Environment.MEDIA_MOUNTED)) { 
      Toast.makeText(this, "SD卡未准备好!", Toast.LENGTH_SHORT).show(); 
      break; 
     } 
     //获取系统图片存储路径 
     File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); 
     // Make sure the Pictures directory exists. 
     path.mkdirs(); 
     //根据当前时间生成图片名称 
     Calendar c = Calendar.getInstance(); 
     String name = "" 
       + c.get(Calendar.YEAR) + c.get(Calendar.MONTH) + c.get(Calendar.DAY_OF_MONTH) 
       + c.get(Calendar.HOUR_OF_DAY) + c.get(Calendar.MINUTE) + c.get(Calendar.SECOND) 
        + ".png"; 
     //合成完整路径,注意 / 分隔符 
     String string = path.getPath() + "/" + name; 
     view.saveToFile(string); 
     Toast.makeText(this, "保存成功!\n文件保存在:" + string, Toast.LENGTH_LONG).show(); 
    } catch (FileNotFoundException e) { 
     Toast.makeText(this, "保存失败!\n" + e, Toast.LENGTH_LONG).show(); 
    } 
    break; 
   } 
  } 
}

没什么难度,主要是将Bitmap转PNG图片那里,找了一会发现 Canvas 没有直接或间接保存的方法,刚好这里我使用了双缓冲,另一块画布的内容位图自己创建的,很自然想到将这个画布的位图保存为文件即可。

再查看 Bitmap 有个 compress(CompressFormat format, int quality,OutputStream stream) 方法,很明显将文件输出流传给这个方法就OK


@Override 
public void onClick(View v) { 
  // TODO Auto-generated method stub 
  switch (v.getId()) { 
   case R.id.iv_btn_clear : 
    view.clear(); 
    break; 
   case R.id.iv_btn_save : { 
    try { 
     String sdState = Environment.getExternalStorageState(); // 判断sd卡是否存在 
     // 检查SD卡是否可用 
     if (!sdState.equals(android.os.Environment.MEDIA_MOUNTED)) {
      Toast.makeText(this, "SD卡未准备好!", Toast.LENGTH_SHORT).show(); 
      break; 
     } 
     //获取系统图片存储路径 
     File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); 
     // Make sure the Pictures directory exists. 
     path.mkdirs(); 
     //根据当前时间生成图片名称 
     Calendar c = Calendar.getInstance(); 
     String name = "" 
       + c.get(Calendar.YEAR) + c.get(Calendar.MONTH) + c.get(Calendar.DAY_OF_MONTH) 
       + c.get(Calendar.HOUR_OF_DAY) + c.get(Calendar.MINUTE) + c.get(Calendar.SECOND) 
        + ".png"; 
     //合成完整路径,注意 / 分隔符 
     String string = path.getPath() + "/" + name; 
     view.saveToFile(string); 
     Toast.makeText(this, "保存成功!\n文件保存在:" + string, Toast.LENGTH_LONG).show(); 
    } catch (FileNotFoundException e) { 
     Toast.makeText(this, "保存失败!\n" + e, Toast.LENGTH_LONG).show(); 
    } 
    break; 
   } 
  } 
}

完整实例代码点击此处本站下载。

希望本文所述对大家Android程序设计有所帮助。

您可能感兴趣的文章:Android中Glide实现超简单的图片下载功能Android使用okHttp(get方式)下载图片Android中使用HttpURLConnection实现GET POST JSON数据与下载图片Android 利用ViewPager实现图片可以左右循环滑动效果附代码下载Android使用缓存机制实现文件下载及异步请求图片加三级缓存Android中使用七牛云存储进行图片上传下载的实例代码Android 下载网络图片并显示到本地Android编程滑动效果之Gallery+GridView实现图片预览功能(附demo源码下载)Android编程实现图片的上传和下载功能示例SimpleCommand实现图片下载(二)


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯