更改路径颜色而不更改以前的路径

2024-03-28

我想创建一个小型绘画应用程序,我可以在其中使用一些颜色进行绘制,但我只测试了一种颜色更改,直到现在它无法正常工作。当我单击按钮并开始使用新颜色进行绘图时,我之前所做的所有绘图也会更改颜色。有人能帮我吗?

public class MyTouchEventView extends View {

    private Paint paint = new Paint();
    private Path path = new Path();



    public Button btnChange;
    public LayoutParams params;

    public MyTouchEventView(Context context) {
        super(context);

        paint.setAntiAlias(true);
        paint.setColor(Color.BLACK);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeJoin(Paint.Join.ROUND);
        paint.setStrokeWidth(1f);


        btnChange = new Button(context);
        btnChange.setText("Chaneg color");

        params = new LayoutParams(LayoutParams.WRAP_CONTENT,
                LayoutParams.WRAP_CONTENT);
        btnChange.setLayoutParams(params);

        btnChange.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {


                paint.setColor(Color.GREEN);
            }
        });


    }

    @Override
    protected void onDraw(Canvas canvas) {

        canvas.drawPath(path, paint);

    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        float pointX = event.getX();
        float pointY = event.getY();

        // Checks for the event that occurs
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            path.moveTo(pointX, pointY);

            return true;
        case MotionEvent.ACTION_MOVE:
            path.lineTo(pointX, pointY);

            break;
        default:
            return false;
        }


        postInvalidate();
        return true;
    }

}

这里的问题是你只使用一个路径。

您应该在每个 ACTION_DOWN 上创建一个新路径。对于每条路径,您还必须存储 Paint。

例如,您可以定义一个包含两个元素作为成员的类:

public class Stroke {
    private Path _path;
    private Paint _paint;
}// add constructor(Path, Paint) and accessors

以及您的上下文中的中风列表:

List<Stroke> allStrokes = new ArrayList<Stroke>();

所以对每一个ACTION_DOWN,您创建一个新的描边(因此一个新的路径,以及一个具有您选择的颜色的新油漆)。

并且在每一个ACTION_MOVE,你已经检索到了最后添加的Path,那么你可以lineTo最后一点。

然后在 onDraw 上,绘制所有创建的 Stroke:

for (Stroke s : allStrokes) {
     canvas.drawPath(s.getPath(), s.getPaint());
}

请注意,使用这个简单的解决方案,您无法进行多点触控绘图。为此,您还必须存储和处理 MotionEvent ID。

EDIT:这是一个有效的多点触控绘画示例,它创建填充随机颜色的笔画:

绘制区域.java:

import android.content.Context;
import android.graphics.*;
import android.util.SparseArray;
import android.view.MotionEvent;
import android.view.View;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class DrawArea extends View {

    private List<Stroke> _allStrokes; //all strokes that need to be drawn
    private SparseArray<Stroke> _activeStrokes; //use to retrieve the currently drawn strokes
    private Random _rdmColor = new Random();

    public DrawArea(Context context) {
        super(context);
        _allStrokes = new ArrayList<Stroke>();
        _activeStrokes = new SparseArray<Stroke>();
        setFocusable(true);
        setFocusableInTouchMode(true);
        setBackgroundColor(Color.WHITE);
    }

    public void onDraw(Canvas canvas) {
        if (_allStrokes != null) {
            for (Stroke stroke: _allStrokes) {
                if (stroke != null) {
                    Path path = stroke.getPath();
                    Paint painter = stroke.getPaint();
                    if ((path != null) && (painter != null)) {
                        canvas.drawPath(path, painter);
                    }
                }
            }
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        final int action = event.getActionMasked();
        final int pointerCount = event.getPointerCount();

        switch (action) {
            case MotionEvent.ACTION_DOWN: {
                pointDown((int)event.getX(), (int)event.getY(), event.getPointerId(0));
                break;
            }
            case MotionEvent.ACTION_MOVE: {
                for (int pc = 0; pc < pointerCount; pc++) {
                    pointMove((int) event.getX(pc), (int) event.getY(pc), event.getPointerId(pc));
                }
                break;
            }
            case MotionEvent.ACTION_POINTER_DOWN: {
                for (int pc = 0; pc < pointerCount; pc++) {
                    pointDown((int)event.getX(pc), (int)event.getY(pc), event.getPointerId(pc));
                }
                break;
            }
            case MotionEvent.ACTION_UP: {
                break;
            }
            case MotionEvent.ACTION_POINTER_UP: {
                break;
            }
        }
        invalidate();
        return true;
    }

    private void pointDown(int x, int y, int id) {
        //create a paint with random color
        Paint paint = new Paint();
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(10);
        paint.setColor(_rdmColor.nextInt());

        //create the Stroke
        Point pt = new Point(x, y);
        Stroke stroke = new Stroke(paint);
        stroke.addPoint(pt);
        _activeStrokes.put(id, stroke);
        _allStrokes.add(stroke);
    }

    private void pointMove(int x, int y, int id) {
        //retrieve the stroke and add new point to its path
        Stroke stroke = _activeStrokes.get(id);
        if (stroke != null) {
            Point pt = new Point(x, y);
            stroke.addPoint(pt);
        }
    }
}

中风.java:

import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Point;

public class Stroke {
    private Path _path;
    private Paint _paint;

    public Stroke (Paint paint) {
        _paint = paint;
    }

    public Path getPath() {
        return _path;
    }

    public Paint getPaint() {
        return _paint;
    }

    public void addPoint(Point pt) {
        if (_path == null) {
            _path = new Path();
            _path.moveTo(pt.x, pt.y);
        } else {
            _path.lineTo(pt.x, pt.y);
        }
    }
}

我的活动.java:

import android.app.Activity;
import android.os.Bundle;

public class MyActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        DrawArea da = new DrawArea(this);
        setContentView(da);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

更改路径颜色而不更改以前的路径 的相关文章

  • Realm 中的更新语句

    I have VisitingCardPOJO表格 我想更新单个条目说在哪里no 3 VisitingCardPOJO java public class VisitingCardPOJO extends RealmObject Prima
  • Android版本App更新代码

    我读到如果我们想更新Google Play中的应用程序 版本代码应该高于以前的apk文件 我有一个版本代码为 20 且版本名称为 1 0 的应用程序 那么要更新app 应该如何增加版本号呢 应该增加10吗 或者仅仅 1 就足够了 即版本代码
  • 多种语言的多种字体

    我最近在开发应用程序时遇到了一种情况 我必须在文本视图中显示不同的语言 目前我正在展示一些使用字体 字体像这样 Typeface tf Typeface createFromAsset this getAssets DroidHindi t
  • 如何使用 runOnUiThread 而不出现“无法对非静态方法进行静态引用”编译器错误

    我有一个主课 ClientPlayer extends Activity 和一项服务 LotteryServer extends Service implements Runnable 当尝试在此服务的 run 方法中使用 RunOnUiT
  • 是否可以将自定义属性添加到 Android 资源的样式中?

    我在我的项目中使用视图流组件 它允许开发人员覆盖一些属性 例如
  • 如何向 Android Studio 中的现有项目添加新活动?

    在 Eclipse 中 您只需单击 新建 按钮并选择 Android 活动即可添加新活动 但 Android Studio 有点不同 我无法找到如何向项目添加新活动 要添加一个Activity使用 Android Studio 此步骤与添加
  • 表面视图+gl表面视图+框架布局

    我是 java 和 OpenGL 的新手 我正在尝试获得一个相机预览屏幕 能够 同时显示 3D 对象 浏览完样本后 api 演示 我想结合示例的代码 api 演示就足够了 但不知何故它不起作用 迫使我 启动时关闭 错误被称为空指针 例外 有
  • Android Gradle 问题 - Flutter / Dart

    我的 Gradle 同步有问题 我使用 IntelliJ 和 Android Studio 构建 Flutter Dart 应用程序 我添加了 2 个新的依赖项 现在 Gradle 出现了问题 在 Android Studio 中一切正常
  • 将非 Android 项目添加到 Android 项目

    我在 Eclipse 中有三个项目 Base Server 和 AndroidClient Base和Server是Java 1 7项目 而AndroidClient显然是一个android项目 基础项目具有在服务器和 Android 客户
  • Android NDK 支持区域设置吗?

    我真正想做的就是使用格式化日期strftime x 以正确的顺序 在大多数平台上调用setlocale 足够 在 Android 上 我不断收到 美国日期 那么 Android 不支持语言环境吗 No setlocale and strft
  • Android:canvas.drawBitmap() 方法无法正常工作

    我已经发布了两个与此相关的问题 请参考此自定义饼图 1 https stackoverflow com questions 28343600 customize pie chart in quarter shape at the botto
  • 如何仅从 Firestore 获取最新更新的数据?

    在 Firestore 上发现任何更改时始终获取整个文档 如何只获取最近更新的数据 这是我的数据 我需要在第一次加载时在聊天中按对象顺序 例如 2018 09 17 30 40 msg和sendby 并且如果数据更新则仅获取新的msg和se
  • Android:如何创建模态进度“轮”叠加层?

    我想在我的视图上显示模式进度 轮子 叠加层 ProgressDialog 很接近 但我不想要对话框背景或边框 我尝试设置对话框窗口的背景可绘制 this progressDialog new ProgressDialog Main this
  • 以编程方式向 LinearLayout 添加边框

    我该如何添加以编程方式LinearLayout 的边框 假设我们创建了这个布局 LinearLayout TitleLayout new LinearLayout getApplicationContext TitleLayout setO
  • 更改特定字符串的颜色

    有谁知道如果将特定单词输入文本区域 我如何更改它的颜色 例如 如果用户输入 你好我的朋友 它会动态地将 你好 更改为绿色 在google上花了很多时间 找不到任何相关的东西 谢谢 textareas 的设计目的不是选择性着色
  • React Native HTTPS Api 调用在 IOS 中有效,但在 Android 中无效

    所以基本上我所做的就是简单地对启用了 HTTPS 的 UAT 服务器进行简单的 Axios 调用 我已经在 IOS 中测试了整个应用程序 API 调用工作正常 但一旦我在 Android 中测试了相同的应用程序 在真正的 Android 设
  • 如何解决 greenDAO 在执行 InsertOrReplace 时“不存在这样的表错误”?

    我正在使用 greenDAO 并且已成功生成所有必需的类和实体 并且我可以看到我的表已创建 但是在要替换的行上放置断点后 我收到一条错误消息 告诉我 不存在这样的表错误 try appTimeUsageDao insertOrReplace
  • 简单的颜色变化

    我正在创建一个用户界面 用户可以在其中更改页面的颜色值 我想要的是获取分配给其背景颜色的值并将其变亮一定程度 我只是想获得一条亮点线 而不必每次都制作新图像 示例 用户将背景颜色设置为 ECECEC 现在我希望某个元素边框变成 F4F4F4
  • ARM Chromebook 上的 Android 开发环境?

    我尝试了多次安装和使用安卓工作室 https developer android com studio index html on an ARM Chromebook C100P https archlinuxarm org platfor
  • Keystore getEntry 在 Android 9 上返回 NULL

    c我已对存储在 Android 密钥库中的登录密码进行了加密和解密 在 Android 9 上 我观察到应用程序在尝试解密密码时崩溃 我无法重现它 但拥有 Pixel 3 的用户是崩溃的设备之一 下面是我如何从密钥库解密密码 private

随机推荐

  • 无法解析导入 android.support.v7.app.MediaRouteActionProvider

    我正在尝试使用 GoogleMap V2 但是我在导入这些时遇到错误 import android support v7 app MediaRouteActionProvider import android support v7 medi
  • sys.exc_info() 是如何工作的?

    sys exc info 的行为描述于蟒蛇文档 http docs python org 2 library sys html and on SO https stackoverflow com questions 1611561 pyth
  • 在 Git 中管理多项目分支

    Maven项目 SCM场景中是否有工具可以实现以下抽象操作 给定一个应用程序项目 为应用程序及其使用的所有快照库创建分支 这些分支应该可以作为一个逻辑分支进行管理 参见下一篇 给定应用程序项目的逻辑分支 发布它 通过运行Maven发布 这意
  • 在 Vim 中突出显示光标下的变量,就像在 NetBeans 中一样

    我在 NetBeans 工作并喜欢这个功能 当您将光标放在变量名称上时 所有出现的变量都会突出显示 这对于快速搜索变量的所有出现非常有用 是否可以将这种行为添加到 Vim 中 该自动命令将执行您想要的操作 autocmd CursorMov
  • 通过将数组传递给 MySQL PHP 中的查询来动态创建 OR 条件

    我正在尝试使用数组动态创建 OR 条件 给定一个数组 当然是名称 courses array Eng Deu Bio Chemi 我想要一个 SQL 查询 该查询在其 AND 子句中使用数组的值以及 OR 条件 例如 SELECT FROM
  • JavaScript 对象上的复杂 SQL 查询

    我有以下 JS 对象 var groups id 4 name abcd id group 1 id 5 name efgh id group 1 id 6 name ijkl id group 1 id 4 name abcd id gr
  • 由于缺少 ._ufuncs dll,Python scipy 模块导入错误

    我在 python 中从 scipy 集成子模块时遇到了一些麻烦 我有一个 64 位架构 并且根据 python 解释器的第一行 见下文 我似乎还在将 64 位版本的 Python 与 Anaconda 一起使用 下面是问题 我只是编写了最
  • Backbone 中仅限客户端的属性

    我有一个相当通用的模型和该模型的集合 见下文 我正在将其作为一系列视图的基础 在几个视图上 选择其中一个模型会生成操作 通过 selected 属性 并且我需要能够仅在客户端跟踪选择 然而 在 Backbone 中似乎没有干净的方法来做到这
  • 身份验证/授权 MVC 5 和 Web API - Katana/Owin

    我在尝试决定执行我的项目的路线时遇到问题 我一直在阅读 OWIN 规范和 Katana 在 NET 中的实现 我之所以选择 Katana 路线 是因为与 ADFS 和令牌 Cookie 生成相关的 owin 组件 我有两个项目 一个用于 M
  • 我可以通过编程方式更改应用程序图标吗

    我内置了两个应用程序图标 免费和高级 在应用程序内购买成功完成后 是否可以以编程方式将免费图标替换为高级图标 对于这种情况有一个新的解决方案 您可以使用 setAlternateIconName completionHandler iOS
  • Codeigniter 基准测试,这些 ms 来自哪里?

    我正在对我的网站进行基准测试 class Home extends Controller function Home parent Controller this gt benchmark gt mark Constructor start
  • 为什么当“%s”之外的任何内容与变体一起使用时,格式会崩溃?

    我正在与SysUtils Format http docwiki embarcadero com VCL en SysUtils Format功能和variant值 我发现该函数仅在格式字符串为 s 我检查了有关的文档Format函数 但不
  • 在 Ionic 框架中通过 JavaScript 从 PHP 获取 JSON 数组

    我正在尝试从服务器端 PHP 文件获取 JSON 数组 我将 PHP 设置为查询 MySQL 数据库并将结果作为 JSON 数组返回 我正在使用离子框架来开发应用程序 目前 我的应用程序使用硬编码的 JSON 数组 这需要用从 PHP 获得
  • 如何在循环中创建对象文字数组?

    我需要创建一个对象文字数组 如下所示 var myColumnDefs key label sortable true resizeable true key notes sortable true resizeable true 在这样的
  • 无法从待办事项列表中删除 li

    我正在创建一个待办事项列表应用程序 当用户单击他 她创建的待办事项时 我希望将其删除 但我测试的时候并没有删除 document ready gt input input on keypress check todo output ul l
  • 交换位置 (HC11)

    我只是在玩我的MC 68HC11 在 C 中 我可以通过执行以下操作来执行简单的字节交换 swapped num gt gt 24 0xff move byte 3 to byte 0 num lt lt 8 0xff0000 move b
  • Java Grpc:使 dns 缓存无效

    我有一个 grpc 客户端指向一个解析为 2 个 IP 地址的 url 问题是 当一个服务器节点出现故障然后恢复时 grpc 客户端不会选择它 所有负载都会转移到单个节点 我尝试建议改变networkaddress cache ttl财产
  • 如何从 Maya 事件中获取场景中高亮对象的变化?

    我正在使用 Maya2014 pyqt4 8 python2 7 我正在开发一个应用程序 它可以让您加快并简化 Maya 中项目的选择 是一个选择器 用户可以将其附加到场景中的对象 选择窗口中的对象会导致场景中对象的分离 但相反我找不到怎么
  • 用于匹配带有尾随空格的字符串的正则表达式在 Perl 中有效,但在 Python 中无效

    我试图找到具有尾随空格的字符串 即 foo 而不是 foo 在 Perl 中 我会使用 str foo print Match n if str s 当我在 Python 2 6 中尝试这个时 例如 import re str foo if
  • 更改路径颜色而不更改以前的路径

    我想创建一个小型绘画应用程序 我可以在其中使用一些颜色进行绘制 但我只测试了一种颜色更改 直到现在它无法正常工作 当我单击按钮并开始使用新颜色进行绘图时 我之前所做的所有绘图也会更改颜色 有人能帮我吗 public class MyTouc