1.自定义View,用来涂鸦,签名

/**
* 自定义View
* @author VanishMagic
*
*/
public class DrawView extends View{
//笔触当前坐标
float preX;
float preY;
//路径
private Path path;
//画笔
public Paint paint = null;
//想要保存成的图片的背景大小
final int VIEW_WIDTH = 1000;
final int VIEW_HEIGHT = 1000;
//笔迹图像
Bitmap cacheBitmap = null;
//画布
Canvas cacheCanvas = null;
public DrawView(Context context, AttributeSet attrs) {
super(context, attrs);
cacheBitmap = Bitmap.createBitmap(VIEW_WIDTH, VIEW_HEIGHT,
Config.ARGB_8888);
cacheCanvas = new Canvas();
path = new Path();
cacheCanvas.setBitmap(cacheBitmap);
//Paint.DITHER_FLAG为抗抖动常量
paint = new Paint(Paint.DITHER_FLAG);
//设置笔触颜色
paint.setColor(Color.BLACK);
//设置笔触粗细
paint.setStrokeWidth(3);
//设置画笔类型
paint.setStyle(Paint.Style.STROKE);
//设置抗锯齿
paint.setAntiAlias(true);
//抗抖动
paint.setDither(true);
}
public void clear(){
//清除画布
cacheBitmap = Bitmap.createBitmap(VIEW_WIDTH, VIEW_HEIGHT,
Config.ARGB_8888);
cacheCanvas.setBitmap(cacheBitmap);
//更新View  invalidate vt. 使无效;使无价值
invalidate();
}
/**
* 为了保存成图片
* @return
*/
public Bitmap save(){
return cacheBitmap;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
//获得当前笔触位置
float x = event.getX();
float y = event.getY();
switch (event.getAction()) {
//当按下时
case MotionEvent.ACTION_DOWN:
//路径起始点移动到此处,并记录
path.moveTo(x, y);
preX = x;
preY = y;
break;
//当移动时
case MotionEvent.ACTION_MOVE:
//平滑曲线连接
path.quadTo(preX, preY, x, y);
preX = x;
preY = y;
path.moveTo(x, y);
break;
//当抬起时
case MotionEvent.ACTION_UP:
//在画布上画出路径
cacheCanvas.drawPath(path, paint);
//重置路径
path.reset();
break;
}
//更新View
invalidate();
return true;
}
@Override
protected void onDraw(Canvas canvas) {
Paint bmpPaint = new Paint();
canvas.drawBitmap(cacheBitmap, 0, 0, bmpPaint);
canvas.drawPath(path, paint);
}
}

2.将自定义View添加到布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<view
android:id="@+id/draw"
android:layout_width="fill_parent"
android:layout_height="360dp"
class="com.suning.electronicsignature.DrawView" />
<Button
android:id="@+id/clear"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="清除" />
<Button
android:id="@+id/save"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="保存" />
</LinearLayout>

3.Activity中定义清除,保存图片等功能

public class MainActivity extends Activity {
//自定义的View
DrawView drawView;
//清除与保存按钮
Button buttonClear;
Button buttonSave;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
drawView = (DrawView) findViewById(R.id.draw);
buttonClear = (Button) findViewById(R.id.clear);
buttonClear.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//调用自定义View的清除方法
drawView.clear();
}
});
buttonSave = (Button) findViewById(R.id.save);
buttonSave.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
/* 直接保存自定义View的Bitmap的话,会是黑色的背景,这里是为了添加自己的背景图片
* 我的想法是将把背景图片转换成Bitmap 与画好的笔迹Bitmap合成一张图片来保存
*/
//把背景图片转换成Bitmap,这里把背景图片做成了1000*1000的白色背景了
InputStream is = getResources().openRawResource(R.drawable.bg);
Bitmap background = BitmapFactory.decodeStream(is);
//获得笔迹Bitmap
Bitmap foreground = drawView.save();
//存成图片
saveBitmap(toConformBitmap(background, foreground));
Toast.makeText(MainActivity.this, "签名已成功保存到SD卡根目录", Toast.LENGTH_LONG).show();
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
/**
* 将两个Bitmap合成一个Bitmap
* @param background
* @param foreground
* @return
*/
private Bitmap toConformBitmap(Bitmap background, Bitmap foreground) {
if (background == null) {
return null;
}
//获取屏幕分辨率
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
int screenWidth = dm.widthPixels;
int screenHeight = dm.heightPixels;
int bgWidth = background.getWidth();
int bgHeight = background.getHeight();
Bitmap newbmp = Bitmap
.createBitmap(bgWidth, bgHeight, Config.ARGB_8888);
Canvas cv = new Canvas(newbmp);
//先画背景,再画笔迹,然后保存,合成
cv.drawBitmap(background, 0, 0, null);// 在 0,0坐标开始画入bg
/**
* 1000是我再自定义的View里面设置的Bitmap的大小,
* 在 (1000 - screenWidth) / 2,(1000 - screenHeight) / 2坐标开始画入笔迹Bitmap ,
* 是为了让笔迹能在背景的接近中间处显示
* 可以从任意位置画入
* */
cv.drawBitmap(foreground, (1000 - screenWidth) / 2,
(1000 - screenHeight) / 2, null);
cv.save(Canvas.ALL_SAVE_FLAG);// 保存
cv.restore();// 存储
return newbmp;
}
/**
* 把Bitmap转换成图片,并保存到相应路径
* @param bitmap
* @return
*/
private String saveBitmap(Bitmap bitmap) {
String imagePath = Environment.getExternalStorageDirectory().toString()
+ "/test.jpg";
File file = new File(imagePath);
if (file.exists()) {
file.delete();
}
try {
FileOutputStream out = new FileOutputStream(file);
if (bitmap.compress(Bitmap.CompressFormat.PNG, 100, out)) {
out.flush();
out.close();
}
} catch (Exception e) {
Toast.makeText(this, "保存失败", 1).show();
e.printStackTrace();
}
return imagePath;
}
}

4.AndroidManifest.xml中添加向SD卡写权限

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.suning.electronicsignature"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.suning.electronicsignature.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>

5.项目结构图

Android实现涂鸦功能相关推荐

  1. Android图片涂鸦功能,Android之给图片添加涂鸦(文字)

    原图: 效果图: 代码如下: public class GraffitiView extends View { private Paint paint = null; /* * 源图 */ priva ...

  2. android涂鸦板保存功能,Android 使用Path实现涂鸦功能

    今天实现一个涂鸦效果,会分几步实现,这里有一个重要的知识点就是图层,要理解这个,不然你看这篇博客,很迷茫,迷茫的苍茫的天涯是我的爱,先从简单的需求做起,绘制一条线,代码如下: package com. ...

  3. Android App内截屏监控及涂鸦功能实现

    Android App内截屏监控及涂鸦功能实现 Android截屏功能是一个常用的功能,可以方便的用来分享或者发送给好友,本文介绍了如何实现app内截屏监控功能,当发现用户在我们的app内进行了截屏操 ...

  4. android图片涂鸦,具有设置画笔,撤销,缩放移动等功能(一)

    该项目的代码已经重构,采用了新框架,强烈建议查看<Android全新图片涂鸦框架Doodle--多功能.可自定义.可扩展> (旧代码暂时不维护了,所以推荐还是使用最新框架吧!也希望大伙支持 ...

  5. 有道云笔记android手写,有道云笔记Android1.1.0发布:新增手写涂鸦功能

    有道笔记是网易旗下有道搜索推出的笔记类知识管理软件,已于12月6日正式改名有道云笔记,同时发布了PC平台上的1.4版,并于12月8日发布了Android版有道云笔记1.1.0.新版有道云笔记(Andr ...

  6. php图片涂鸦,IOS_详解iOS App中图片的线段涂鸦功能的添加方法,接下来我们要讲图片的涂鸦, - phpStudy...

    详解iOS App中图片的线段涂鸦功能的添加方法 接下来我们要讲图片的涂鸦,我们分开一点一点拓展,先给图片上划线 创建项目 起名testAddLine 接下来我们在默认生成的ViewControlle ...

  7. Android简单涂鸦以及撤销、重做的实现方法

    前段时间研究了下涂鸦功能的实现,其实单独的涂鸦实现起来还是挺简单的,关键的技术难点是撤销与重做功能的实现.但是这里暂时只说明下涂鸦功能的实现,高手勿喷哈,而且该功能在Android SDK提供的API ...

  8. Android 实现闹钟功能

      原文地址:Android 实现闹钟功能作者:Android_Learners 一.手机闹钟主要用到了AlarmManager类,AlarmManager类提供了访问系统定时服务的途径,开发人员可以 ...

  9. android 添加附件功能,Android实现带附件的邮件发送功能

    本文实例讲解了基于基于jmail实现android邮件发送功能,分享给大家供大家参考,具体内容如下 在android上发送邮件方式: 第一种:借助gmail app客户端,缺点是必须使用gmail帐号 ...

最新文章

  1. 微软学者 | 郭达雅:瞄准科研目标主动出击,挑战“不可思议”
  2. linux怎么修改grub引导顺序,我如何更改GRUB引导顺序?
  3. SQL Server 2012 AlwaysOn高可用配置之八:新建可用性组
  4. IOS 获取农历方法(转)
  5. littlevgl 透明按钮_张家港3-10吨叉车日租价格透明2020
  6. 【java】java 协程
  7. 10个大数据领域的杰出公司
  8. Mybatis if标签
  9. 大华监控摄像机接入到小程序、公众号、网站视频直播配置流程
  10. mysql 读写分离配置
  11. POJ-1144 Network——Trajan+割点
  12. ios和Android的PK
  13. Android布局优化之TextView、ImageView合二为一
  14. 三只松鼠营收持续下滑:市值两天缩水28亿元,能否熬过漫漫转型路
  15. 校招22届大疆 嵌入式面经/23届投递可私戳内推!
  16. Stanford Alpaca (羊驼):ChatGPT 学术版开源实现
  17. ur机器人编程-坐标系
  18. 【逗老师带你学IT】PRTG安装教程-部署简单功能强大的监控软件
  19. 基于tomcat的javaweb在线教学网站的开发--完成登录、注册以及考试页面
  20. python红楼梦人物词频统计_通过数据挖掘能分析《红楼梦》各回的真伪吗?

热门文章

  1. 【Android】二进制图片和Bitmap的getPixel方法解析
  2. 数据挖掘十大经典算法(详解)
  3. 通过 InnoSetup 美化安装界面
  4. 流程审批: 有个人不走申请人直属领导审批,审批流程设定(设定条件,矩阵相关)
  5. 无需设置路由器,无需公网ip 实现永久免费内网穿透
  6. 提升程序员工作效率的6个工具利器
  7. 一些学习编程的优质网站
  8. 第5章 远程控制软件的编写
  9. 艺展中国-一代名家刘泽仲作品展
  10. DML、DDL、DCL、CRUD指什么?