android canvas画图、涂鸦断续

Android小程序-涂鸦板 最近android课老师布置了一个课后作业,是实现android涂鸦板的功能, 然后自己写了一个简单的涂鸦板,可以实现选择颜色、尺寸、清屏的功能。 首先是效果图: 主要是使用Canvas和Paint来实现画图,并使用触屏事件处理来获取用户滑动的坐标。 首先,新建一个类HandWrite并继承View 实现画图的主要方法是onDraw()方法。 onDraw():绘图主函数,但是 阅读详情

用mCanvas.drawLine 方法画出来的线可能会断断续续,原因是onTouchEvent中的move方法并不是每个点都调用的,所以需要在点没有调用方法的时候让两点之间生成二次贝塞尔曲线

改进前代码:

    private void initDraw() {
        mIvMode1Anim.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:

                        Log.d(TAG, "onTouch: ==================ACTION_DOWN==================");
                        //创建画纸
                        if (mBitmap == null) {
                            mBitmap = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888);

                            //创建画布
                            mCanvas = new Canvas(mBitmap);
                            //将背景设置为透明
                            mCanvas.drawColor(Color.WHITE);
                            //创建画笔
                            mPaint = new Paint();
                            mPaint.setColor(Color.BLACK);//画笔的颜色
                            mPaint.setStrokeWidth(20);//画笔的粗细
                        }

                        //获取坐标
                        mStartX = event.getX();
                        mStartY = event.getY();
                        break;

                    case MotionEvent.ACTION_MOVE:
                        Log.d(TAG, "onTouch: ==================ACTION_MOVE==================");
                        mCurrentX = event.getX();
                        mCurrentY = event.getY();
                        //绘制直线
                        mCanvas.drawLine(mStartX, mStartY, mCurrentX, mCurrentY, mPaint);
                        //第二条线的起始点,就是上一条的重点
                        mStartX = mCurrentX;
                        mStartY = mCurrentY;

                        //将bitmap展示到界面
                        mIvMode1Anim.setImageBitmap(mBitmap);
                        break;

                    case MotionEvent.ACTION_UP:
                        Log.d(TAG, "onTouch: ==================ACTION_UP==================");
                        break;
                }

                //返回true代表了消费了这个事件,那么down后面的move和up事件才能进来
                //返回false,代表不消费这个事件,那么down后面的move和up就进不来
                return true;
            }
        });
    }

改进后代码:

 private Paint mPaint;
    private Path mPath;

    private float mX;
    private float mY;

    private float[] mDownPoint = new float[2];
    private float[] mUpPoint = new float[2];

    private DrawCallBack mBack;

    public DrawView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initView();
    }

    private void initView() {
        mPaint = new Paint();
        mPath = new Path();

        mPaint.setAntiAlias(true);
        mPaint.setStyle(Style.STROKE);
        mPaint.setStrokeWidth(20);
        mPaint.setColor(Color.BLACK);

        // 抗锯齿
        mPaint.setAntiAlias(true);
        // 防抖动
        mPaint.setDither(true);
    }

    public void setCallBack(DrawCallBack callBack) {
        this.mBack = callBack;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawPath(mPath, mPaint);
    }

    //手指点下屏幕时调用
    private void touchDown(MotionEvent event) {

        //mPath.rewind();  
        //重置绘制路线,即隐藏之前绘制的轨迹  
        mPath.reset();
        float x = event.getX();
        float y = event.getY();

        mX = x;
        mY = y;
        //mPath绘制的绘制起点  
        mPath.moveTo(x, y);
    }

    //手指在屏幕上滑动时调用  
    private void touchMove(MotionEvent event) {
        final float x = event.getX();
        final float y = event.getY();

        final float previousX = mX;
        final float previousY = mY;

        final float dx = Math.abs(x - previousX);
        final float dy = Math.abs(y - previousY);

        //两点之间的距离大于等于3时,生成贝塞尔绘制曲线  
        if (dx >= 3 || dy >= 3) {
            //设置贝塞尔曲线的操作点为起点和终点的一半  
            float cX = (x + previousX) / 2;
            float cY = (y + previousY) / 2;

            //二次贝塞尔,实现平滑曲线;previousX, previousY为操作点,cX, cY为终点  
            mPath.quadTo(previousX, previousY, cX, cY);
            //mPath.lineTo(x, y);

            //第二次执行时,第一次结束调用的坐标值将作为第二次调用的初始坐标值  
            mX = x;
            mY = y;
        }
    }

    public void resetView() {
        mPath.reset();
        invalidate();
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                mDownPoint[0] = event.getX();
                mDownPoint[1] = event.getY();
                touchDown(event);
                break;
            case MotionEvent.ACTION_MOVE:
                touchMove(event);
                break;
            case MotionEvent.ACTION_UP:
                mUpPoint[0] = event.getX();
                mUpPoint[1] = event.getY();
                if (mBack != null) {
                    mBack.drawCompose(mDownPoint, mUpPoint);
                }
                //mPath.reset();
                //postInvalidate();
                //
                //isError();
                break;

            default:
                break;
        }
        invalidate();
        return true;
    }

改进后画图的时候就不会出现断断续续的情况.

RuyiDify如何创建知识库API密钥:让程序安全访问知识库 知识库 API Key 是程序访问知识库的钥匙。创建它很简单,但真正重要的是知道它能做什么、应该放在哪里、不能暴露给谁。RuyiDify 讲这一步,不是为了让大家多记一个按钮,而是为了把知识库从“人工上传资料”推进到“程序化维护资料”。 阅读详情

相关推荐

RT-Thread stm32h7使用串口DMA

stm32h7在rtthread中无法使用串口DMA,通过更改驱动代码使其支持串口DMA

qq_35141454的博客 2284

使用canvas为什么会出现这种情况?

使用canvas为什么会出现这种情况?

weixin_50701798的博客 330

别再到处找数据了!用Python+Tushare Pro免费获取A股行情、财务、龙虎榜数据(附完整代码)

本文详细介绍了如何使用Python和Tushare Pro免费获取A股行情、财务数据和龙虎榜数据,并构建本地金融数据仓库。通过完整的代码示例,帮助读者快速掌握金融数据接口的使用方法,提升量化分析效率。Tushare Pro作为免费、稳定的数据源,覆盖全面且API友好,是个人投资者的理想选择。

weixin_30596343的博客 617

Android在画布上画动态直线,Android通过Canvas手绘一个折线图

简述Android绘制图表,有强大的折线图.jpg这个就是要实现的最终效果定义的Stylename类型描述isShowXBorderLineboolean是否显示X轴方向的分割线isShowYBorderLineboolean是否显示Y轴方向的分割线XBorderLineColorcolorX轴方向分割线显示颜色YBorderLineColorcolorY轴方向分割线显示颜色XBorderLine...

weixin_35975406的博客 470

MOOS-ivp 实验三 MOOS简介(1)

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录系列文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例

weixin_44151170的博客 7434

基于Python+OpenCV中文及符号检测

一、项目背景与意义在图像处理、文档识别、自动翻译等场景中,中文及符号的准确检测是一个重要且复杂的任务。传统的字符检测方法往往对英文等拉丁字母系的识别效果较好,但对中文及特殊符号的识别准确率较低。本项目旨在利用Python编程语言结合OpenCV库,开发一个能够高效、准确地检测图像中中文及符号的系统,为相关领域的研究和应用提供技术支撑。二、技术实现图像预处理:利用OpenCV的图像处理功能,对输入的图像进行灰度化、二值化、滤波去噪等预处理操作,以提高中文及符号检测的准确性[1]。

2301_79809972的博客 1119

canvas写一个简单画板(解决断点问题)

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> canvas {

weixin_44766633的博客 863

PyTorch实战:3D U-Net医学图像分割从零搭建(附完整代码)

本文详细介绍了如何使用PyTorch从零搭建3D U-Net模型进行医学图像分割,涵盖三维卷积实现、模块化架构设计、医学图像专属优化策略及完整训练流程。通过实战代码演示,帮助开发者掌握UNet-3D在CT、MRI等三维医学图像分割中的应用,提升肝脏肿瘤分割、肺结节检测等任务的准确性。

weixin_29061997的博客 328

Canvas绘制线条时断断续续的

globalCompositeOperation 属性设置或返回如何将一个源(新的)图像绘制到目标(已有)的图像上。源图像 = 您打算放置到画布上的绘图。目标图像 = 您已经放置在画布上的绘图。

qq_59625204的博客 2297

Unity游戏开发客户端Lua基础

Unity游戏开发客户端面经之 lua 篇

Sea3752的博客 1万+

Lammps纳米压痕接触面积—Matlab接触面积计算(两种方法)

Lammps纳米压痕接触面积计算

Rockyoung 5447

android 图片字体涂鸦,Android 编辑图片 Canvas画图,涂鸦,马赛克等(一)

需求功能详解单纯的编辑图片的功能,能够在界面上进行图形的绘制,线条的涂鸦,和画马赛克的绘制,并且有撤销的功能。话不多说,直接看一下效果吧:图片编辑效果主要实现思路实现一个自定义View,重写onDraw(),集成这些编辑功能。功能集成该编辑功能有涂鸦,画图形,画文字,和马赛克的功能,这里只对除了文字的内容进行介绍,若想进一步获得文字功能,可在代码库中pull代码,并自己打开该功能:public e...

weixin_31227315的博客 710

基于STM32F1XX 、HAL库的LTR-303ALS-01 环境光传感器驱动应用C语言程序设计

printf("制造商ID: 0x%02X\r\n", LTR303_ReadManufacID());printf("器件ID: 0x%02X\r\n", LTR303_ReadPartID());LTR-303ALS-01是一款数字环境光传感器(ALS),由Lite-On公司生产。printf("LTR-303ALS初始化失败!printf("LTR-303ALS初始化成功!printf("数据无效\r\n");* @param mode: 0-待机, 1-激活。

PP_Cottage的博客 1032

Android屏幕上涂鸦画笔标记的实现

呃,这个名字取得很诡异,大概意思就是Android程序,以当前界面作为背景,用手触控作为一个画笔来进行涂鸦,标记等,和PPT里的画笔差不多一个意思吧。       根据这个需求,做出了以下的思路:首先是要获取一个屏幕大小的bitmap作为底图,设置为透明色。然后将一个canvas放在bitmap上,触控点击事件作为paint,然后就可以实现了。 操作步骤如下: 1.获取当前屏幕的

卡小基的博客 8209

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Android基于Canvas,自定义View实现简单的画图工具

我们要实现的功能:1、点击相应的按钮,在图上画出相应的图形,并实时展现在画布上。2、橡皮檫功能,点击橡皮擦按钮,可以擦除画图上的图形。3、点击确定按钮可以停止当前的绘制。4、点击保存按钮可以把绘制的图形保存为jpg格式的图片文件。具体如下图:具体实现步骤:1、先自定义view,在view里实现各种画图的操作,代码如下:public class TestView extends View { ...

weixin_42058532的博客 697

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

【Android】自定义View、画家(画布)Canvas与画笔Paint的应用——画图、涂鸦板app的实现

利用一个简单的画图app来说明安卓的图形处理类与自定义View的应用。 如下图,有一个供用户自己任意画图、涂鸦的app, 这里不做那么花俏了,仅提供黑白两色,但可以改变笔尖的粗细。 实质上这里的橡皮擦就是白色的画笔,根本不用使用到画笔的setXfermode方法,要搞一堆复杂的工程。 用户画完图之后可以保存图像。图像的文件名是当前的时间,保存的位置是sdcard的根目录。 制作过

编程记录,亲测有效 9105

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

推荐文章:探索创意无限的微信小程序 - “涂鸦”

推荐文章:探索创意无限的微信小程序 - “涂鸦” 项目介绍 在这个充满创意的时代,一款名为“涂鸦”的微信小程序脱颖而出,它赋予了我们随时随地挥洒灵感的空间。无论你是艺术爱好者还是寻找乐趣的普通人,“涂鸦”都能让你在指尖轻松创作。这款小程序提供了基础和进阶的画图功能,不仅支持在空白画板上尽情描绘,还能将你的照片变为涂鸦的画布,释放你的想象力。 项目技术分析 “涂鸦”小程序基于微信小程序平台构建,巧...

gitblog_00255的博客 779

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

前段时间研究了下涂鸦功能的实现,其实单独的涂鸦实现起来还是挺简单的,关键的技术难点是撤销与重做功能的实现。但是这里暂时只说明下涂鸦功能的实现,高手勿喷哈,而且该功能在Android SDK提供的APIDemo当中就有的,但是如果能够将该地方的知识点搞懂的话,我认为View画图基本上是难不倒你了,特别是里面为什么要用一个中间的Bitmap。老规矩,还是先看看效果图吧: 2012-1-13 ...

weixin_30349597的博客 550

Android中在屏幕上涂鸦的例子

这个例子,自定义了一个View,可以接受touch动作,然后在屏幕上即时的显示出touch的轨迹,类似于线条的涂鸦。这个例子主要是演示如何将onTouchEvent与draw配合起来使用。在这个基础上,可以做很多有用的程序。 (注意invalidate()这个方法。这个比较关键。加入这个方法的调用主要是为了强制View进行重画。) package com.arui; import...

mmdev 87

Canvas类的使用

计划项目中有涉及到用户签字确认的功能,想先写写签字模块,要实现的功能是通过判断用户手势在指定模块绘制出轨迹并保存,所以就写个涂鸦板之类的小Demo练手。在写的过程中最重要的是Canvas类的使用,下面对Canvas类的知识进行总结,以备自己日后查阅。 Canvas类(android.graphics.Canvas)就是表示一块画布,你可以在上面画你想画的东西。当然,你还可以设置画布的属性,如画布

TnTlittlefish的博客 3956

android自定义画图,Android简单实现画图功能

如何在图片上画画呢?这里写了一个demo,供大家参考一、先看一眼工程结构工程结构:二、自定义view这个自定义view实现了保留轨迹的功能,代码如下package picturegame.view;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;i...

weixin_30700095的博客 750

以Imageview为画布,在其上涂鸦

Resources r = this.getResources();  Bitmap bmp=BitmapFactory.decodeResource(r, R.drawable.icon);//只读,不能直接在bmp上画      Bitmap newb = Bitmap.createBitmap( 50, 50, Config.ARGB_8888 );           

chichengjunma的专栏 1240

Android 之 绘图类实战示例

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

leyang0910的博客 297

android 画图库 github,GitHub - antwankakki/FabricView: A new canvas drawing library for Android. Aims t...

FabricView - A new canvas drawing library for Android. The library was born as part of a project in SD Hacks (www.sdhacks.io) on October 3rd. It is currently under construction and will be refactored...

weixin_29563497的博客 315

opencv显示中文_wxPython+opencv 打造自己的画图板

作者 |月小水长(某 985 计算机学院大三在校生,熟悉 C++、Java、Python等多种语言,有大型软件项目开发经验,致力于安卓、计算机视觉、爬虫、数据可视化开发,也是业余的前端爱好者。)来源 | 月小水长(ID:inspurer)去年期末因为项目需要,自己动手写代码制作了一款简单的图片处理工具。其效果图如下:整个软件的 GUI 采用 wxPython框架,图像处理模块采用 op...

weixin_39639686的博客 125

Android 图片选取画图案

 最近项目中要有一个需求,从相册中选取照片上传,后服务器返回照片返回宽高,然后在上面画矩形。以下是实现方式:   1:我们要在原有的图片上画东西,因此我们要将图片设置为bitmap,因项目需要图片无压缩。因此只需要简单的读取一下         Bitmap  bitmap=null     File f=new File(filepath);   //filepath是你图片的路径     if...

Bu_siliang的博客 482
上一篇: android studio使用jni ndk会出现的问题
下一篇: android studio Error:(1, 1) 错误: 非法字符: '\ufeff'
missingcall
博客等级 码龄10年 8粉丝 40原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值