用自定义view实现的简单画图板

一个涂鸦画板控件 这次带来一个涂鸦画板控件。之前一个项目里需要做一个功能:用户在屏幕上签名,然后将签名保存成图片。于是就顺手写了这个控件,起个名字叫DrawView,这里拿出来给大家分享一下。首先说一下原理。原理其实很简单,我们在屏幕上画的一笔,本质上就是一堆坐标点的集合,把这个集合保存在Path中,然后调用canvas.drawPath就可以把这条线画出来了。而触控产生的坐标点可以在onTouchEvent里采集 阅读详情
<span style="font-family:KaiTi_GB2312;font-size:18px;"><span style="font-family:KaiTi_GB2312;font-size:18px;">package com.example.clipdrawabledemo;

import android.content.Context;
import android.graphics.Bitmap;
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;
/*
 * 本view实现了一个简单的画图板的功能,当用户在触摸屏上移动时,即可在屏幕上绘制任意的图形
 * 实现手绘其实是一种假象:表面上看起来可以随用户可任意的画曲线,实际上依然利用的是Canvas的DrawLine方法画直线
 * 每条直线都是从上一次拖动事件发生点画到本次拖动时间发生点,当用户在触摸屏上移动时,两次拖动事件的距离很小,多条极短的直线连接起来
 * 肉眼看起来就像是曲线,懂微积分的同学应该清楚
 * 需要指出的是:如果程序每次都只是从上一次拖动事件的发生点绘一条直线到本次事件的发生点,那么用户前面绘制的将会
 * 丢失,为了保留前面绘制的图形,要采用双缓冲技术,
 * <span style="color:#ff6666;">所谓双缓冲技术</span>:当程序在指定View上进行绘制时,程序并不直接绘制到该View上,而是先绘制到
 * 一个内存中的Bitmap图片(这就是缓冲)上,等到内存上的Bitmap绘制完成后,在一次性的绘制到View组件上
 */

public class DrawView extends View {
	float preX;// 前一个点的x坐标
	float preY;// 前一个点的y坐标
	private Path path;// 路径
	private Paint paint = null;// 画笔
	final int VIEW_WITH = 480;// 画面宽度
	final int VIEW_HEIGHT = 800;// 画面高度
	private Bitmap cacheBitmap = null;// 定义内存中的图片,该图片作为缓冲区
	private Canvas cacheCanvas = null;// Bitmap上的Canvas的对象

	public DrawView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		// TODO Auto-generated constructor stub
	}

	public DrawView(Context context, AttributeSet attrs) {
		super(context, attrs);
		// TODO Auto-generated constructor stub
		// 创建一个和屏相适应的缓冲区
		cacheBitmap = Bitmap.createBitmap(VIEW_WITH, VIEW_HEIGHT,
				Config.ARGB_8888);
		cacheCanvas = new Canvas();
		path = new Path();
		// 设置cacheCanvas绘制到内存中的cacheBitmap
		cacheCanvas.setBitmap(cacheBitmap);
		setPaint();
	}

	private void setPaint(){
		paint = new Paint(Paint.DITHER_FLAG);// 防抖动,与setDither相对应
		paint.setColor(Color.GREEN);// 设置画笔颜色
		paint.setStyle(Paint.Style.STROKE);// 设置样式为空心
		paint.setStrokeWidth(10);// 设置宽度
		paint.setAntiAlias(true);// 反锯齿
		paint.setDither(true);// 防抖
	}
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		float x = event.getX();
		float y = event.getY();
		//setPaint();
		System.out.println("onTouchEvent---"+"x="+x+";y="+y);
		// TODO Auto-generated method stub
		switch (event.getAction()) {
		case MotionEvent.ACTION_DOWN:
			System.out.println("ACTION_DOWN");
			path.moveTo(x, y);
			preX = x;
			preY = y;
			break;
		case MotionEvent.ACTION_MOVE:
			System.out.println("ACTION_MOVE");
			//该方法的实现是当我们不仅仅是画一条线甚至是画弧线时会形成平滑的曲线,该曲线又称为"贝塞尔曲线"
			//这里也可是使用path.lineTo(x, y);
			path.quadTo(preX, preY, x, y);
			preX = x;
			preY = y;
			break;
		case MotionEvent.ACTION_UP:
			System.out.println("ACTION_UP");
			cacheCanvas.drawPath(path, paint);
			//清除画笔设置
			//paint.reset();
			break;
		}
		invalidate();//刷新View
		return true;// 返回true表示事件响应完成,不会扩展
	}

	@Override
	protected void onDraw(Canvas canvas) {
		// TODO Auto-generated method stub
		super.onDraw(canvas);
		System.out.println("onDraw");
		Paint Bitpaint = new Paint();
		canvas.drawBitmap(cacheBitmap, 0, 0, Bitpaint);// 将cacheBitmap绘制到该View上
		canvas.drawPath(path, paint);// 沿着path绘制
	}
}
</span></span>

Android笔记二十一. 一款简易画图板开发 一款简易画图板开发                                                   转载请表明出处:http://blog.youkuaiyun.com/u012637501(嵌入式_小J的天空) 一、画图板原理 1.直线效果     画图板表面上看起来可以随用户在触摸屏上自由的绘制任意图形,但是实际上当用户在触摸屏上移动时,两次拖动事件发生点的距离很小,多 阅读详情

相关推荐

Android画图板简易代码实现指南

图形绘制的基本流程通常涉及创建一个自定义View,在其onDraw()方法中通过Canvas进行绘图操作。接着,使用Paint对象来定义绘制的颜色、样式、字体等属性,最后通过Bitmap来保存和处理图像数据。Canvas类是Android图形系统中一个非常重要的组成部分,它为绘图操作提供了一个画布。可以将Canvas理解为一个实际的绘画板,在这个板上,可以使用各种画笔(Paint类)来绘制图形、文本和位图等。

weixin_33205138的博客 520

Away3d学习笔记4-View3D(视口)

前面<<三维世界的四个基本构件>>将Flash3D影片比喻成电视,力求能形象地阐述Away3D三维世界四个必备"物件"之间逻辑关系。其中"视口"被比喻成电视机屏幕。我们观众就是通过这个屏幕才能看到用摄影机拍摄下来的景物(3D物体)。本篇进一步讲解View3D几个重要的参数设置。 创建View3D Away3D里视口的类名是View3D。与as里创建任何实例...

dnukjz5627的博客 279

CodeBuddy 接入 MCP,一键生成网站!

2024 年 11 月,Anthropic 公司搞了个挺有意思的新玩意 - Model Context Protocol(模型上下文协议)简称为 MCP 协议。简单来说,它就是给 AI 和各类工具数据之间搭了个标准化的”桥梁”,让开发者不用再为对接问题头疼了。mcp.so如下图所示,这是 mcp.so 网站中的 MCP Server。使用百度/高德地图分析旅线计算时间接 Puppeteer 自动操作网页使用 Github/Gitlab 让大模型接管代码仓库。

悟空聊架构的专栏 1943

Android自定义View--简易画板

自定义VIew实现简易画板效果,功能包括清空、选择颜色,选择大小,效果如下 画板布局: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"

xqppw111的博客 2000

工业自动化进阶:西门子 S7-1200 PLC 调度 AGV 实现精确定点移动

本文介绍了基于西门子S7-1200PLC的AGV调度控制系统设计,包括系统架构、硬件选型和PLC程序设计。系统通过PROFINET通信实现PLC与AGV的数据交互,采用状态机控制逻辑实现任务管理、运动控制和闭环位置校正。重点阐述了通信协议实现、梯形图核心逻辑及系统调试优化方法。实际应用案例显示,该系统定位精度达±3mm,显著提升了物料配送效率。该方案为工业自动化升级提供了可靠的技术支持。

qq_52407556的博客 1886

Vivaldi天线HFSS建模实战:从参数化曲线到辐射优化的完整流程

本文详细介绍了Vivaldi天线在HFSS中的建模与优化全流程,涵盖参数化曲线绘制、馈电系统设计及性能验证等关键步骤。通过实战案例分享,帮助工程师掌握超宽带天线的HFSS建模技巧,提升雷达探测和通信系统设计效率。重点解析了指数渐变曲线建模、微带馈电优化等核心技术要点。

weixin_29228781的博客 273

使用双缓冲技术实现简单画图板

随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666) 所谓双缓冲技术其实很简单:当程序需要在指定的View上进行绘制时,程序并不直接绘制到该View组件上,而是先绘制到一个内存中的Bitmap图片上(缓冲)上,等到内存中的Bitmap绘制好了之后,再一次性地将Bitm...

孤云博客 2079

别再瞎改网络结构了!解决YOLO小目标检测痛点,我用这招把mAP提了15%

本文基于我7年工业PCB缺陷检测、无人机航拍、安防监控项目的一线落地经验,针对YOLO小目标检测最痛的「漏检率高、特征丢失、精度难提升」三大核心问题,拆解出。本文全程配套小目标特征丢失原理图、分块训练流程图、切图前后效果对比图、mAP提升柱状图、多方案性能对比表等可视化内容,从YOLO天生不擅长小目标的底层根源、方案核心原理、可直接复制的代码实现,到工业场景实测验证、新手必踩的10个坑位避坑指南,全链路讲透。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 387

绘图类实战示例

本节引言: 前两节我们学了Bitmap和一些基本的绘图API的属性以及常用的方法,但心里总觉得有点 不踏实,总得写点什么加深下映像是吧,嗯,本节我们就来写两个简单的例子: 1.简单画图板的实现 2.帮美女擦衣服的简单实现 嘿嘿,第二个例子是小猪刚学安卓写的一个小Demo~嘿嘿~ 开始本节内容~ 1.实战示例1:简单画图板的实现: 这个相信大家都不陌生,很多手机都会自带一个给用...

android开发笔记 317

从Overleaf上导出Latex论文发布到arxiv详细教程(常见问题与解决)

如果是做cv的论文请选择“Computer Vision and Pattern Recognition”,选择“Artificial Intelligence”可能会被on hold,貌似这个指的是传统的人工智能?我用公司邮箱注册发布一篇论文,一个多月还是“on hold”状态,换成edu邮箱第二天就被发布了。3、有可能是subject class选错了,编辑会帮你手动选择,然后发一封邮件告知你解除……报错缺失bbl等文件,这是因为从Menu中下载的话,是没有bbl文件的。论文被on hold。

沉迷单车的追风少年 3584

基于STM32L4XX、HAL库的STS40-CD1B-R3温度传感器 驱动程序设计

/ HAL库需要左移一位。// 每2秒读取一次。// 等待测量完成 - 高精度模式大约需要15ms。// 执行软复位确保传感器处于已知状态。温度测量范围:-40°C ~ +125°C。湿度测量范围:0% ~ 100% RH。// 复位后需要等待至少1ms。// 初始化STS40传感器。// 读取温湿度数据。// 转换原始数据为实际值。// 发送读取序列号命令。// 读取序列号数据。湿度精度:±1.5% RH。

zhusl6688的博客 287

Android 之 绘图类实战示例

答:一只画笔(Paint),一块画布(Canvas),一个路径(Path)记录用户绘制路线;答:View里,我们自定义一个View,在onDraw()里完成绘制,另外View还有个onTouchEvent的方法, 我们可以在获取用户的手势操作!最后到我们的Activity,也很简单,无非是为gallery设置onSelected事件,点击按钮后把,当前选中的 Position传递给下一个页面!核心思路是: 利用帧布局,前后两个ImageView,前面的显示未擦掉衣服的情况,后面的显示擦掉衣服后的情况!

leyang0910的博客 297

数据分析必问:Pandas面试题及参考答案

DataFrame是Pandas库中的一个核心数据结构,它类似于Excel中的表格,可以存储不同类型的数据。在Pandas中,抽样操作通常很简单,但是需要根据数据的特点和分析的需求来选择合适的抽样方法。数据标准化和归一化是数据预处理中常用的技术,目的是将数据调整到一个合适的范围内,以消除不同特征量纲和数值范围的差异,从而保证模型训练的有效性。CSV文件是一种文本文件,其中的数据以逗号分隔。不平衡数据集指的是数据集中各类别样本的数量差异较大的情况,这可能导致模型训练出现偏差,影响模型的泛化能力。

大模型大数据攻城狮的专栏 3005

实现界面跳转以及简单画图板的实现

实现界面跳转几个简单的步骤: 找到当前界面所在的文件夹–&amp;gt;src文件夹–&amp;gt;com.example.文件名这个包–&amp;gt;右键–&amp;gt;new–&amp;gt;other–&amp;gt;Android–&amp;gt;Android Activity–&amp;gt;next–&amp;gt;next–&amp;gt;修改Activity Name为DrawActivity(自己随意

Juily家的小蜜果 640

基于Simulink的永磁同步电机三闭环(位置/速度/电流)伺服仿真

本文详细介绍了基于Simulink的永磁同步电机三闭环伺服控制系统的设计与实现,针对机器人关节控制场景。系统采用位置环(外环)、速度环(中环)和电流环(内环)的嵌套结构,通过精确的带宽匹配(电流环1kHz、速度环200Hz、位置环20Hz)实现亚微米级位置跟踪。文中提供了完整的Simulink建模步骤,包括主电路搭建、三环PI控制器实现及坐标变换模块,并验证了系统性能:阶跃响应时间35ms,位置误差<0.05°,正弦跟踪误差<0.15°,负载突加恢复时间0.08s。最后提出了参数自适应整定、前馈

amy_mhd的博客 279

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

android 自定义绘画,Android 自定义view:画图板实现

本文重在对自定义view,以及其常用类,常用方法的初步了解,提供一个思路,效果是其次,画板只是例子。看效果:中间一个画图板上方小控件用来显示实时画出的图形下方小控件用来做一些画图的控制2个小控件都能移动画图板.jpg顺带还有一个刮刮卡效果,只需要改一个参数:刮刮卡.jpg自定义view首先要自定义属性:在values下面创建attrs.xml: //画笔颜色 ...

weixin_28997879的博客 611

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

android 自定义画图,Android 自定义view,画图板练习

项目中想要推动一个简易画图板的需求,功能并不复杂,就是6个很常见的功能画图板陈小默同学有一个比较复杂,强大,高效的CrazyPalette,同学间商业互吹下,哈哈。里面基本常见的操作都有,代码写的很高,只是用的Kotlin,不过我应该的也是一个简单的绘图板,我参考了他的一些想法以及另外一篇android项目 之 记事本 ----- 画板功能之撤销、恢复和清空,做了一个简单的PaintView之前在...

weixin_34739646的博客 378

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

安卓入门,简单画图板的实现

安卓简单画图板的实现 之前已经做了一个登录界面,现在,让我们一起做一个简单画图板吧。因为安卓画图板和之前学的java的步骤都差不多,所以我们实现画圆就行了(可以画圆之后,我们就基本上可以画其他形状了)。 首先,我们要了解画笔和画布:paint,canvas paint是安卓的画笔,和java一样,我们要先实例化对象,然后设置它的各种属性。canvas是画布,要添加到一个空白的imageview上。...

weixin_43331223的博客 518

eclipse安卓画图板(简单画条线)

Android 简单画图板界面(附有代码) 进行Android画图板实现,我们对比一下在Java界面中画图板所需要的内容 1.JFrame ———— ImageView 组件,显示画图的内容 2.BufferedImage ———— Bitmap 缓存,画图的位置 3.Graphics ———— 画图形 Canvas 设置绘图样式 Paint(在安卓中,画图与前者略有不同,分为了两个部分) 4.MouseListener ———— OnTouchListener 监听器(鼠标监听

qq_49639550的博客 2107

Android 自定义view:画图板实现

本文重在对自定义view,以及其常用类,常用方法的初步了解,提供一个思路,效果是其次,画板只是例子。 看效果: 中间一个画图板 上方小控件用来显示实时画出的图形 下方小控件用来做一些画图的控制 2个小控件都能移动 顺带还有一个刮刮卡效果,只需要改一个参数: 自定义view首先要自定义属性: 在values下面创建attrs.xml: &lt;!--画图板--&gt; &lt;d...

weixin_33981932的博客 195

Android 自定义view画图板练习

项目中想要实现一个简易画图板的需求,功能并不复杂,就是6个很常用的功能 画图板 陈小默同学有一个比较复杂,强大,高效的CrazyPalette,同学间商业互吹下,哈哈。里面基本常用的操作都有,代码写的很好,只是用的Kotlin,不过我需要的只是一个简单的绘图板,我参考了他的一些思路以及另外一篇android项目 之 记事本 ----- 画板功能之撤销、恢复和清空,做了一个简单的PaintV...

mm_name_zhang的博客 482

Android自定义view之简易的画图板

package com.vision.myapplicationtest; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; impo...

u010629285的专栏 159

Android 自定义view,画图板练习

项目中想要实现一个简易画图板的需求,功能并不复杂,就是6个很常用的功能 画图板 陈小默同学有一个比较复杂,强大,高效的CrazyPalette,同学间商业互吹下,哈哈。里面基本常用的操作都有,代码写的很好,只是用的Kotlin,不过我需要的只是一个简单的绘图板,我参考了他的一些思路以及另外一篇android项目 之 记事本 ----- 画板功能之撤销、恢复和清空,做了一个简单的PaintV...

qq_32138419的博客 339

Android自定义view之简易的画图板(画板)

package com.vision.myapplicationtest; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; impo...

张雨的博客 1219
上一篇: android JNI的编写最全过程
下一篇: 弹球小游戏(自定义view应用)
android_xc
博客等级 码龄12年 15粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值