Android手绘手写图DrawableView

简介: Android手绘手写图DrawableViewAndroid上的第三方开源DrawableView支持手写,类似于写字板。


Android手绘手写图DrawableView

Android上的第三方开源DrawableView支持手写,类似于写字板。DrawableView支持改变画笔颜色,画笔线条粗细,画布的手势缩放和拖曳显示部分区域。并最终支持将手绘的图保存到本地。
在github上的项目主页:https://github.com/PaNaVTEC/DrawableView
先把布局文件中写一个DrawableView:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <Button
            android:id="@+id/strokeWidthPlusButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="画笔宽度+" />

        <Button
            android:id="@+id/strokeWidthMinusButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="画笔宽度-" />

        <Button
            android:id="@+id/changeColorButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="画笔颜色" />

        <Button
            android:id="@+id/undoButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="撤销上一步" />
        
         <Button
            android:id="@+id/saveButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="保存成图片" />
        
    </LinearLayout>

    <me.panavtec.drawableview.DrawableView
        android:id="@+id/paintView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>


Java代码:

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Random;
import me.panavtec.drawableview.DrawableView;
import me.panavtec.drawableview.DrawableViewConfig;

public class MainActivity extends Activity {

	private DrawableView drawableView;
	private DrawableViewConfig config = new DrawableViewConfig();

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

		drawableView = (DrawableView) findViewById(R.id.paintView);
		

		// 画笔宽度-
		Button strokeWidthMinusButton = (Button) findViewById(R.id.strokeWidthMinusButton);

		// 画笔宽度+
		Button strokeWidthPlusButton = (Button) findViewById(R.id.strokeWidthPlusButton);

		// 改变画笔颜色
		Button changeColorButton = (Button) findViewById(R.id.changeColorButton);

		// 撤销上一步绘画操作
		Button undoButton = (Button) findViewById(R.id.undoButton);

		Button saveButton = (Button) findViewById(R.id.saveButton);

		// 画笔颜色
		config.setStrokeColor(Color.RED);

		// 画布边界
		config.setShowCanvasBounds(true);

		// 设置画笔宽度
		config.setStrokeWidth(10.0f);

		// 缩放
		config.setMinZoom(1.0f);
		config.setMaxZoom(3.0f);

		// 高和宽
		config.setCanvasHeight(500);
		config.setCanvasWidth(700);

		drawableView.setConfig(config);

		strokeWidthPlusButton.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				// 增宽则每次增加10
				config.setStrokeWidth(config.getStrokeWidth() + 10);
			}
		});

		strokeWidthMinusButton.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				// 减宽则每次减小10
				config.setStrokeWidth(config.getStrokeWidth() - 10);
			}
		});

		changeColorButton.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				// 测试期间,随机生成一些颜色
				Random random = new Random();
				config.setStrokeColor(Color.argb(255, random.nextInt(256), random.nextInt(256), random.nextInt(256)));
			}
		});

		undoButton.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				drawableView.undo();
			}
		});

		saveButton.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				try {
					saveBitmapToSDCard();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		});
	}

	// 将用户手绘的DrawableView转化为图片保存到本地系统默认的图片库中。
	private void saveBitmapToSDCard() throws IOException {

		// 从DrawableView获得Bitmap
		Bitmap bmp = drawableView.obtainBitmap();

		File parent_path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);

		File f = new File(parent_path.getAbsoluteFile(), "myDrawableView.png");
		f.createNewFile();

		Log.d("保存图片的路径", f.getAbsolutePath());

		FileOutputStream fos = new FileOutputStream(f);
		bmp.compress(Bitmap.CompressFormat.PNG, 100, fos);
		fos.flush();
		fos.close();

		Log.d("保存图片", "成功");
	}
}



运行结果如图:



默认的,在未发布的debug阶段,DrawableView会在画布上添加一些log日志输出。如果不打算在画布中显示log,可以修改DrawableView的源代码去掉DrawableView默认的log日志。关键代码有两行,在CanvasDrawer的库文件源代码中:

initLogger();

...

canvasLogger.log(canvas, canvasRect, viewRect, scaleFactor);

将这两行注释掉即可,如图:


附录参考文章:
【文章1】《Android写文件到SDCard的一般过程和代码》链接地址:http://blog.csdn.net/zhangphil/article/details/49976687
【文章2】《Android View转换成图片保存》链接地址:http://blog.csdn.net/zhangphil/article/details/44217539


相关文章
|
6月前
|
Android开发
Android仿天眼查人物关系图
Android仿天眼查人物关系图
61 1
|
8月前
|
XML 编解码 Android开发
Android 自定义坐标曲线图(二)
继上一篇文章,本次改进了折线图点击显示提示信息的方式。原来使用popupwindow或dialog,但这种方式控制位置困难,特别是当需要精确显示在点击点上方时。现在,作者通过自定义XML布局实现了更灵活的提示框。
Android 自定义坐标曲线图(二)
|
API Android开发 iOS开发
Android 自定义坐标曲线图
自定义View,使用paint、point、path,画点、点与点连接成线、然后闭合起来就是一个多边形,画坐标,实现坐标曲线图
Android 自定义坐标曲线图
|
Android开发
android Jetpack Navigation组件—— 之嵌套导航图
android Jetpack Navigation组件—— 之嵌套导航图
840 0
android Jetpack Navigation组件—— 之嵌套导航图
|
XML 算法 安全
❤️Android Apk 的打包过程 ❤️ 只需两幅图
官方介绍 在分析安装过程之前,需要先了解一下 Android 项目是如何经过编译->打包生成最终的 .apk 格式的安装包。谷歌有一张官方图片来描述 apk 的打包流程,如下图所示。
469 0
❤️Android Apk 的打包过程 ❤️ 只需两幅图
|
移动开发 测试技术 Android开发
一分钟教你Android、iOS如何实现自动化截长图功能,超实用!
在移动端自动化测试过程中经常会遇到需要截长图的场景,比如大促活动的H5页面、动态信息流页面等,但是目前在网上检索只能搜到关于截长图的软件推荐,没有讲关于如何通过自动化脚本的方式实现的文章,今天就来给大家分享一个简单的实现方案。
780 0
一分钟教你Android、iOS如何实现自动化截长图功能,超实用!
|
前端开发 Android开发
Android实现无序树形结构图,类似思维导图和级联分层图(无序,随机位置)
众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中会产生很多对于人生的质疑和思考,于是我决定将自己的思考,经验和故事全部分享出来,以此寻找共鸣!!!
1185 0
|
算法 Android开发 数据安全/隐私保护
【Android 逆向】IDA 工具使用 ( 函数窗口 Function window | 创建引用图 Xrefs graph to | 创建调用图 Xrefs graph from )
【Android 逆向】IDA 工具使用 ( 函数窗口 Function window | 创建引用图 Xrefs graph to | 创建调用图 Xrefs graph from )
515 0
【Android 逆向】IDA 工具使用 ( 函数窗口 Function window | 创建引用图 Xrefs graph to | 创建调用图 Xrefs graph from )
|
前端开发 Android开发
Android 进阶自定义View(5)图表统计PieChartView圆饼图的实现
今天讲图表统计中比较常用的一个,像支付宝的月账单啥的,都是用圆饼图来做数据统计的,先看一下我最终实现的效果图: image.png 该效果实际上是两个实心圆叠加后的效果。
3958 0
|
前端开发 Android开发
Android自定义无压缩加载超清大图
版权声明:本文为博主原创文章,转载请注明出处http://blog.csdn.net/u013132758。 https://blog.csdn.net/u013132758/article/details/80878256 自定义无压缩加载超清大图 前言   已经很久没有写博客了,前段时间做项目就遇到加载超大图时系统内存溢出,我们一般处理加载图片时OOM的方法都是对图片进行压缩。
1322 0

热门文章

最新文章