首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在android中撤消/重做画布上绘制的形状

在Android中撤销/重做画布上绘制的形状,可以通过以下步骤实现:

  1. 使用自定义View或SurfaceView来处理绘制操作。在自定义View的onDraw()方法中,记录绘制的形状和绘制顺序。
  2. 创建一个数据结构(例如栈)来保存绘制操作的历史记录。每当绘制一个新形状时,将该形状添加到历史记录中。
  3. 实现撤销操作:当需要撤销绘制操作时,从历史记录中弹出最近绘制的形状,并在自定义View的onDraw()方法中重新绘制剩下的形状。
  4. 实现重做操作:当需要重做已撤销的绘制操作时,将上一步撤销的形状重新添加到历史记录中,并在自定义View的onDraw()方法中重新绘制它。

以下是一个简单示例代码,用于在Android中实现撤销/重做绘制操作:

代码语言:txt
复制
public class MyDrawingView extends View {
    private List<Shape> shapes; // 保存绘制的形状
    private Stack<Shape> undoStack; // 撤销栈
    private Stack<Shape> redoStack; // 重做栈

    public MyDrawingView(Context context) {
        super(context);
        shapes = new ArrayList<>();
        undoStack = new Stack<>();
        redoStack = new Stack<>();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        for (Shape shape : shapes) {
            shape.draw(canvas);
        }
    }

    public void addShape(Shape shape) {
        shapes.add(shape);
        undoStack.push(shape);
        redoStack.clear(); // 新增绘制操作后清空重做栈
        invalidate(); // 重新绘制
    }

    public void undo() {
        if (!undoStack.isEmpty()) {
            Shape shape = undoStack.pop();
            redoStack.push(shape);
            invalidate(); // 重新绘制
        }
    }

    public void redo() {
        if (!redoStack.isEmpty()) {
            Shape shape = redoStack.pop();
            undoStack.push(shape);
            invalidate(); // 重新绘制
        }
    }
}

public abstract class Shape {
    public abstract void draw(Canvas canvas);
}

// 示例:绘制一个矩形形状
public class RectangleShape extends Shape {
    private int left, top, right, bottom;

    public RectangleShape(int left, int top, int right, int bottom) {
        this.left = left;
        this.top = top;
        this.right = right;
        this.bottom = bottom;
    }

    @Override
    public void draw(Canvas canvas) {
        Paint paint = new Paint();
        paint.setColor(Color.RED);
        canvas.drawRect(left, top, right, bottom, paint);
    }
}

在上述示例中,MyDrawingView是自定义的View类,用于绘制形状。Shape是形状的抽象类,可以根据需要扩展其他形状(例如圆形、线条等)。addShape()方法用于添加新的形状,并将其记录到历史记录和绘制列表中。undo()redo()方法用于执行撤销和重做操作。

这只是一个简单的示例,您可以根据具体需求进行修改和扩展。对于更复杂的绘图应用,可能需要考虑更高级的撤销/重做管理,例如支持多层撤销/重做、保存绘图历史到文件等。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

鼠标教鞭:Presentify for mac

想要注释任何屏幕,突出显示光标,Presentify Mac版绝对是您首选,该软件拥有随时随地画画、高亮显示鼠标指针、撤消/重做支持等强大功能,简便易用非常不错。...许多绘图形状可供选择。按住Shift键同时,可以用一只手在绘制时获得一条直线。您可以在绘制时按住Shift键,以半透明颜色填充矩形和圆形。自动删除您注释。非常适合强调特定内容或解释您想法。...即使其他应用程序以全屏模式运行,您也可以绘制。非常适合现场演示和远程工作时视频通话。在通过Sidecar或Astropad连接到MacbookiPad运行。与XP笔一起使用。...3、键盘快捷键您可以使用简单键盘快捷键在任何应用程序中注释屏幕,突出显示光标,更改绘图颜色和形状等。4、撤消/重做支持注释时不必担心错误。5、多屏支持在多个屏幕上进行注释,而不必打开/关闭注释。...为每个屏幕保存会话,因此在屏幕之间切换时无需切换控件,颜色等。每个屏幕都有自己撤消/重做堆栈,因此您会意外擦除看不见内容。6、白板如果需要,可以在白板绘制(不要在其他应用程序绘制)。

86140

如何用Scratch 3绘制矢量图形 【Gaming】

我将通过解释如何绘制苹果来演示在Scratch绘制矢量精灵所有要点,但是您可以将此方法应用于任何要创建对象。...绘图工具 Scratch矢量绘图工具箱是您找到绘制对象所需工具地方: 图片7.png 下面是一些与绘制矢量图形相关词汇: 画布Canvas:你画地方;白色和灰色盘是透明 节点Node:沿对象路径确定对象形状点...为了改变现有精灵外观,点击右下角精灵图标使其活动,然后单击工具箱箭头工具,点击画布精灵,并进行所需更改。...图片10.png 移动任何节点都会改变圆形状单击圆边可以添加更多节点。如果移动节点过多或意外添加节点,可以通过单击屏幕顶部后退箭头图标来撤消最后一步。也可以通过按Ctrl+Z撤消。 4....现在以类似的方式向圆顶部添加两个节点。稍微向下降低原始止点节点以创建缩进。 7. 继续调整和添加节点,直到对苹果形状满意为止。 绘制茎 1. 选择矩形工具。

5.6K00
  • PHP在线图像编辑器 Pixie v3.0.3

    前言 Pixie是一款完全可定制高性能照片编辑器,可在任何地方使用,并且可以轻松集成到现有项目中或使用独立应用程序。 功能介绍 集成–轻松将pixie集成到任何现有项目或应用程序。...形状–只需指定svg图像路径,即可轻松添加自定义形状。 贴纸–可以添加或删除自定义贴纸。任何类型图像都可以用作标签。 角–只需单击一下即可调用API角,从而对图像角进行四舍五入。...空画布– Pixie不必编辑现有照片,也可以轻松地从头开始创建自定义图像。 历史记录–所有编辑器操作都是非破坏性,可以通过历史记录工具轻松撤消重做。...对象–所有对象(贴纸,形状和文本)都位于各自图层,可以通过更改其颜色,添加阴影,背景等内容轻松地移动,调整大小,删除和修改。 模式和渐变–所有对象都可以使用许多内置或自定义模式和渐变填充。...保存–修改后图像可以通过API或接口轻松保存在本地设备或服务器。 缩放和平移–可以使用鼠标,鼠标滚轮或移动设备触摸和捏合手势来缩放和平移画布

    2.9K70

    Android开发笔记(一百五十三)OpenGL绘制三维图形流程

    不过对于初次接触OpenGL开发者来说,三维绘图概念可能过于抽象,所以为了方便读者理解,下面就以Android二维图形绘制为参考,亦步亦趋地逐步消化OpenGL相关知识点。...从前面的学习可以得知,每个Android界面上控件,其实都是在某个视图上绘制规定文字(TextView),或者绘制指定图像(ImageView)。...然后还要有绘画作品载体,比如显示生活黑板漆面,以及用于国画宣纸、用于油画油布等等,在Android系统,这个绘画载体便是画布Canvas。...正如前面介绍Android自定义控件那样,有了视图View、画布Canvas、画笔Paint,方能绘制炫彩多姿各种控件。...和onLayout两个函数功能; 3、onDrawFrame顾名思义跟自定义控件onDraw函数差不多,onDraw函数用于绘制二维图形具体形状,而onDrawFrame函数用于绘制三维图形具体形状

    1.9K20

    了解 Android 矢量图片格式:`VectorDrawable`

    因此,对于固定分辨率位图,我们只了解每个像素颜色,却不理解其中包含内容。然而,矢量图像是通过在抽象大小画布定义一系列形状来描绘图像。 为什么使用矢量图?...矢量资源有三大好处,分别是: 好用 占用资源少 动态 好用 矢量图可以优雅调整大小;这是因为它们将图像绘制在抽象大小画布,你可以放大或缩小画布,然后重新绘制对应尺寸图像。...Android 在受限制移动设备运行,因此支持整个 SVG 规范并不是一个现实目标。 然而,SVG 包含一个 路径规范,它定义了如何描述和绘制形状。使用此 API,您可以表达大多数矢量形状。...第二个 视口 大小定义虚拟画布,或者定义所有后续绘制命令空间坐标。固有和视口尺寸可以不同(但应该以相同比例)— 如果你需要,可以在 1*1 画布定义矢量。...它们可以被命名(以供稍后参考,例如动画),但至关重要是必须指定描述形状 pathData 元素。这个神秘字符串可以被认为是控制虚拟画布一系列命令: ?

    2.5K30

    Python学习总结(1)—turtle海龟作图

    size是点大小,为整型;缺省为默认值 *color是点颜色英文单词,为字符串类型 stamp() 印章 在海龟当前位置绘制一个海龟形状【需要提前设置海龟形状,缺省为箭头形状】,并返回该印章...撤消 (或连续撤消) 最近一个 (或多个) 海龟动作。可撤消次数由撤消缓冲区大小决定。 speed(Vnum) 速度 Vnum取值为0-10。...clear() 清空图案 从屏幕删除指定海龟绘图。不移动海龟。海龟状态和位置以及其他海龟绘图不受影响。...如果 fun 值为 None,则移除现有的绑定 fun – 一个函数,调用时将传入两个参数表示在画布上点击坐标。...add=None) 当鼠标释放 将 fun 指定函数绑定到在此海龟释放鼠标按键事件。

    1.6K10

    带你快速掌握Flutter视图(Widgets)

    通过这篇文章学习,将为你揭开这些答案。 谁是FlutterView? 在Android,View是屏幕显示所有内容基础, 按钮、工具栏、输入框等一切都是View。...在Android,可以使用Canvas 与 Drawable 在屏幕绘制出自定义形状和图片; 在 iOS ,可以通过 CoreGraphics 来在屏幕绘制线条和形状; 在RN我们通常是由react-native-canvas...因此,对于Android开发人员来说,在Flutter绘制画布是一项非常熟悉任务。...Flutter有两个类可以帮助我们绘制画布,CustomPaint和CustomPainter,它们实现您算法以绘制画布。...要了解如何在Flutter实现签名Painter,可参阅Collin在StackOverflow答案。 ?

    11K10

    66K star!这个开源白板不一般!

    大家好,我是「前端实验室」爱分享了不起~ 作为开发者,无论是工作还是学习都少不了要画流程图,一款高颜值画图工具,有利于提升自己工作效率,让人越画越想画,今天给大家推荐一款高颜值开源虚拟手绘风格白板...——Excalidraw excalidraw Excalidraw 是近两年新起一款画图工具,主要包含白板、流程图能力,它简单好用有画图界 Markdown 之称。...可共享链接(导出为可与他人共享只读链接)。 免费和开源。 基于画布无限白板。 ✍️ 手绘风格。 ️ 定制,图像支持。 本地化 (i18n) 支持。 ️ 导出到PNG,SVG和剪贴板。...⚒️ 各种工具 - 矩形、圆形、菱形、箭头、线条、自由绘制、橡皮擦...... ➡️ 箭头绑定和标记箭头,撤消/重做。 支持缩放和平移。...安装使用 node版本要>=18 // 安装 yarn // 运行 yarn start 也可以使用docker启动 在素材库还有大量素材 手绘流程图效果 手绘图表效果 插件 excalidraw

    36210

    Excalidraw:开源虚拟手绘风格白板

    无限画布 Excalidraw 提供了一个无限大小画布,用户可以不受限制地绘制和扩展他们作品。...手绘风格 Excalidraw 手绘风格给图表和图形带来了一种亲切和自然感觉,这在传统数字化工具是难以实现。 暗模式和自定义 支持暗模式,以及用户可以根据自己喜好对界面进行自定义。...图像和形状库支持 用户可以导入图像,并且有多种形状库可供选择,这大大提高了创作灵活性。 多语言和导出功能 支持多语言,用户可以根据需要选择语言。...工具多样性 提供了包括矩形、圆形、菱形、箭头、线条、自由绘制和橡皮擦在内多种工具。 撤销/重做和缩放功能 支持撤销和重做操作,以及缩放和平移视图,使得编辑过程更加流畅。.../excalidraw 社区和支持 Excalidraw 拥有一个活跃社区,您可以在 GitHub 找到项目的源代码和文档,提出问题或贡献代码。

    27510

    2014-10-27Android学习------布局处理(六)------26个字母布局列表实现-----城市列表应用程序

    ,是因为有些地方Paint是没法画,就直接给canvas加抗锯齿,更方便 //其实这个抗锯齿很好解释,就是画布边缘用paint画笔去画它,会出现一些波浪线吧,可以这么叫它,形状像锯齿一样,很 /...Android Paint类介绍 /** * Paint类介绍 * * Paint即画笔,在绘图过程起到了极其重要作用,画笔主要保存了颜色,...* 样式等绘制信息,指定了如何绘制文本和图形,画笔对象有很多设置方法, * 大体可以分为两类,一类与图形绘制相关,一类与文本绘制相关。...* 设置绘制路径效果,点画线等 * * setShader(Shader shader); * 设置图像效果,使用Shader可以绘制出各种渐变效果...Android下可以利用 sdk 已经提供Paint measureText(String text) 方法 至此 字母列表这种现实效果就已经基本实现了, 接下来重要工作就是可以点击

    74330

    android使用Path绘制出多边形

    activity压入栈,translate()是画布平移,其实每次画布还是同一个画布,通过paint绘制图形都是在这同一个canvas,但是绘制内容跟你是否使用了translate()有关系,下面通过简单...,默认都是透明,否则你draw…2次,上次绘制内容就被覆盖了,文字太苍白无力,就好像你对一个女孩说一千篇我爱你,还不如说你在杭州买了套房来实际,就好像香港有一个电影台词是这么说,这是一个最好时代...android.util.AttributeSet; import android.view.View; /** * 绘制多边形 */ public class PathmMultiView extends...还有一个问题就是如果所绘制是多边形,但是好像形状不一样,怎么修改,这个时候只要旋转画布就行了,比如这张图片: ? 使用canvas.rotate(30);旋转30度后是这样 ?...当然你要在绘制这个图形之前对画布进行旋转,不然不起作用,网上有些五角星效果,是怎么实现呢?比如这样效果: ? 这是正6变形所形成星星形状,分析如图: ?

    1.4K20

    Android各种Drawable类详解

    下面是Drawable基类一些常用方法介绍: Drawable类核心是draw函数实现,这个函数是一个抽象函数,派生类必须要实现他,函数入参是一个Canvas画布对象,所有需要绘制东西都最终绘制画布上面去...你需要为位图指定绘制画布位置以及缩放到区域方式: //这里android.view.Gravity参考值。...(Shape s) public void setShape(Shape s) 设置需要显示形状。...通过类提供构造方法来设置一个Picture图像对象。并将图像对象内容绘制画布中去。Picture类是一个抽象图像对象,他可以从一个流构造出来,也可以写到流。...这样就可以在这个返回画布绘制东西了,记得绘制完成后需要调用: public void endRecording() 来结束绘制

    1.6K20

    仅2MB截图贴图小工具 ScreenCapture 0.2.6

    用不同颜色(填充或不填充)绘制圆形、椭圆形、正方形、矩形、箭头、数字(有序)。 绘制不透明线、自由曲线、马赛克、橡皮擦。 撤消重做支持(可以编辑历史形状)。 保存到文件或剪贴板。...只有一个小可执行文件(没有任何 dll)。...可以轻松集成到任何程序 因为太简洁了,所以只能通过外部程序调用,当然双击程序也能运行,但用于截图就太麻烦了, 程序作者推荐使用AutoHotkey启动程序,你也可以使用其他快捷键增强工具来调用; 在下面链接里我已经放了一个...A::Run "H:\test\ScreenCapture.exe" 把 H:\test\ScreenCapture.exe 这个路径修改成你电脑中ScreenCapture.exe 路径, 如果想修改启动...ScreenCapture快捷键,请参考AutoHotkey热键修饰符说明:https://wyagd001.github.io/v2/docs/Hotkeys.htm#Symbols ,其中#表示

    10210

    Android显示原理

    一、概要 Android应用程序显示过程:Android应用程序调用SurfaceFlinger服务把经过测量、布局和绘制Surface渲染到显示屏幕。...Surface:android应用每个窗口对应一个画布(Canvas),即Surface,可以理解为android应用程序一个窗口。...测量:递归(深度优先)确定所有视图大小(宽、高) 布局:递归(深度优先)确定所有视图位置(左上角坐标) 绘制:在画布canvas绘制应用程序窗口所有视图 三、系统侧渲染 android应用程序在图形缓冲区绘制好...android图像在绘制时候,首先是CPU计算出图像形状,计算完成CPU会将图像交给GPU渲染出颜色,如果这一切都能够在16ms内完成,那么在下一个VSync出现时,就能显示刚刚渲染出来那一帧图像了...四、进程间通讯机制 android应用程序为了能够将自己UI绘制在系统帧缓冲区,它们就必须要与Surface服务进行通信。

    65130

    一款支持手绘风格开源图表工具—Excalidraw

    前言 在文章撰写,我们常常需要配以图表或者图形来更加丰富呈现。...Excalidraw是一个虚拟白板应用,专门用于绘制类似手绘图表。它提供了一个无限、基于画布白板,具有手绘风格,支持多种功能。 新更新允许用户输入文本描述,将其自动转换为相应图表或图形。...使用Excalidraw,你可以创建美观手绘风格图表、线框图等 主要特点: •Excalidraw编辑器(npm包)支持以下功能:• 免费且开源。•无限、基于画布白板。•✍️ 手绘风格。...• 支持形状库。• 支持本地化(国际化i18n)。•️ 可导出为PNG、SVG和剪贴板。• 开放格式 - 可将绘图导出为.excalidraw json文件。...•⚒️ 提供广泛工具 - 矩形、圆形、菱形、箭头、线条、自由绘制、橡皮擦等。•️ 支持箭头绑定和标签箭头。• 支持撤销/重做。•支持缩放和平移。

    83710

    可视化拖拽组件库一些技术要点原理分析

    sss ddf sss fdsaf 本文主要对以下技术要点进行分析: 编辑器 自定义组件 拖拽 删除组件、调整图层层级 放大缩小 撤消重做 组件属性设置 吸附 预览、保存代码 绑定事件 绑定动画 导入...这一节要讲编辑器其实就是中间画布。它作用是:当从左边组件列表拖拽出一个组件放到画布时,画布要把这个组件渲染出来。...这个编辑器实现思路是: 用一个数组 componentData 维护编辑器数据。 把组件拖拽到画布时,使用 push() 方法将新组件数据添加到 componentData。...propValue: '文字', // 组件所使用值 icon: 'el-icon-edit', // 左侧组件列表显示名字 animations: [], // 动画列表...当然,你这个组件也要提前注册到 Vue 。 如果你想了解更多 is 属性资料,请查看官方文档。

    96740

    Carson带你学Android:自定义View Canvas类使用教程

    前言 自定义View是Android开发者必须了解基础;而Canvas类使用在自定义View绘制中发挥着非常重要作用 网上有大量关于自定义ViewCanvas类文章,但存在一些问题:内容不全...简介 定义:画布,是一种绘制规则 是安卓平台2D图形绘制基础 作用:规定绘制内容时规则 & 内容 记住:绘制内容是根据画布规定绘制在屏幕 理解为:画布只是绘制规则,但内容实际绘制在屏幕...Canvas本质 请务必记住: 绘制内容是根据画布(Canvas)规定绘制在屏幕 画布(Canvas)只是绘制规则,但内容实际绘制在屏幕 为了更好地说明绘制内容本质和Canvas,...总结 绘制内容是根据画布规定绘制在屏幕 内容实际绘制在屏幕画布,即Canvas,只是规定了绘制内容时规则; 内容位置由坐标决定,而坐标是相对于画布而言 注:关于对画布操作(缩放...); // 缩放本质是:把形状先画到画布,然后再缩小/放大。

    2.4K10

    流程图绘制软件visio中文版激活工具下载安装

    简便易用:用户可以根据需要拖动元素到画布,然后连接它们,即可创建自己想要流程图。...选择流程图类型:根据需要选择所要创建流程图类型,基础流程图、网络拓扑图等。 绘制流程图:在画布拖动形状,然后连接它们以构建流程图。可以使用工具栏各种工具进行形状调整和修改。...添加文本:可以在形状内添加文本描述、注释等信息。 数据导入:如果需要将数据导入流程图,可以通过“导入数据”功能将 Excel 表格等数据源连接到流程图中,自动在画布生成相应形状和连接线。...绘制图形:在画布绘制各个阶段形状,包括可行性调研、项目立项、任务分解、进度管理、质量检查等。 添加文本:在各个形状内添加文字描述,任务分解阶段可以添加“任务分解汇总表”等信息。...数据导入:如果有现成数据,可以通过“导入数据”功能将其导入到流程图中。比如,在进度管理阶段,可以将 Excel 表格任务列表导入到相应形状

    1.7K20
    领券