Android 实战项目分享(一)用Android Studio绘制贝塞尔曲线的艺术之旅
一、项目概述
欢迎来到创意之源!我们精心打造的绘图应用程序将带你进入一个充满艺术和技术的奇妙世界。通过使用Android Studio,我们实现了绘制贝塞尔曲线的功能,让你能够轻松创作出令人惊叹的艺术作品。不论你是热爱绘画的大学生还是渴望学习的艺术爱好者,这个应用程序将为你点燃创作的激情,让你沉浸在绘画的乐趣中。
二、主要技术点
- 贝塞尔曲线的绘制:我们巧妙地利用Android Studio的绘图功能,实现了贝塞尔曲线的绘制。通过简单的操作,你可以自由操控曲线的形状和曲率,为你的艺术作品注入无限可能。
- JSON数据解析:我们应用程序支持JSON数据解析,让你能够轻松处理服务器返回的数据。这样,你可以从服务器获取配置文件等信息,并在绘画过程中灵活应用。
- 本地文件存取:我们还提供了本地文件存取功能,让你可以保存和管理自己的绘画作品。你可以在应用程序中随时查看、编辑和分享你的艺术杰作。
- 全屏启动页实现:我们特别优化了应用程序的启动页,实现了无缝过渡,避免了白屏的尴尬。你将享受到完美的用户体验,让你的创作之旅更加流畅自然。
-
动态权限申请:我们重视用户隐私和安全,因此应用程序支持动态权限申请。这意味着在使用过程中,我们将确保你对所需权限的控制,保护你的个人信息和设备安全。
-
HTTPS通信:我们采用HTTPS通信协议,保证你的数据传输安全和隐私保护。无论是进行GET请求还是POST请求,你都可以放心地与服务器进行安全的数据交互。
-
通用隐私协议服务协议弹出窗口:我们关注用户隐私权,为了保障你的合法权益,我们在应用程序中提供了通用隐私协议服务协议弹出窗口。这让你清晰了解我们对你个人信息的处理方式,建立起互信的基础。
-
从服务器获取配置文件,并解析:我们的应用程序能够从服务器动态获取配置文件,并进行解析。这使你能够随时更新应用程序的功能和特性,保持与最新技术的同步。
-
AgentWeb的使用和封装:我们采用了大名鼎鼎的AgentWeb,一行代码即可实现专属浏览器的功能。这为你提供了便捷的网络浏览和搜索功能,让你在创作中获得更多灵感和参考。
-
本地日志接口的封装:我们为应用程序封装了本地日志接口,使你可以灵活地记录和管理应用程序的运行情况。在发布版本时,你可以根据需要关闭日志记录,优化代码性能。
主要演示代码:
//PanelView.java
package com.csw.luck33;
import android.content.Context;
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;public class PanelView extends View {private static final String TAG = "PanelView";private Board mBoard;private Dot mDotStart;private Dot mDotControl1;private Dot mDotControl2;private Dot mDotEnd;private Paint mControlPaint;private Paint mBezierPaint;private Paint mTextPaint;public PanelView(Context context, AttributeSet attrs) {super(context, attrs);mBoard = new Board();mDotStart = new Dot(this, mBoard, true);mDotControl1 = new Dot(this, mBoard, false);mDotControl2 = new Dot(this, mBoard, false);mDotEnd = new Dot(this, mBoard, true);mControlPaint = new Paint(Paint.ANTI_ALIAS_FLAG);mControlPaint.setColor(Color.GREEN);mControlPaint.setStyle(Paint.Style.STROKE);mControlPaint.setStrokeWidth(5f);mBezierPaint = new Paint(Paint.ANTI_ALIAS_FLAG);mBezierPaint.setColor(Color.BLUE);mBezierPaint.setStyle(Paint.Style.STROKE);mBezierPaint.setStrokeWidth(6f);mTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG);mTextPaint.setColor(Color.BLACK);mTextPaint.setStyle(Paint.Style.FILL_AND_STROKE);mTextPaint.setStrokeWidth(2);mTextPaint.setTextSize(30);}@Overridepublic boolean onTouchEvent(MotionEvent event) {//Log.d(TAG, "onTouchEvent:" + event.getAction() + "(" + event.getX() + "," + event.getY() + ")");return mDotStart.touchEvent(event)|| mDotControl1.touchEvent(event)|| mDotControl2.touchEvent(event)|| mDotEnd.touchEvent(event);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);mBoard.computeWidthAndHeight(this);mDotStart.setCenterPoint(mBoard.getTopLeft());mDotControl1.setCenterPoint(mBoard.getTopCenter());mDotControl2.setCenterPoint(mBoard.getBottomCenter());mDotEnd.setCenterPoint(mBoard.getBottomRight());}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);mBoard.draw(canvas);drawBezierText(mDotStart, mDotControl1, mDotControl2, mDotEnd, canvas);drawLine(mDotStart, mDotControl1, canvas);drawLine(mDotControl1, mDotEnd, canvas);drawLine(mDotStart, mDotControl2, canvas);drawLine(mDotControl2, mDotEnd, canvas);drawBezier(mDotStart, mDotControl1, mDotControl2, mDotEnd, canvas);mDotStart.draw(canvas);mDotControl1.draw(canvas);mDotControl2.draw(canvas);mDotEnd.draw(canvas);}private void drawLine(Dot start, Dot end, Canvas canvas) {canvas.drawLine(start.getX(), start.getY(), end.getX(), end.getY(), mControlPaint);}private Path mBezierPath = new Path();private void drawBezier(Dot start, Dot control1, Dot control2, Dot end, Canvas canvas) {mBezierPath.reset();mBezierPath.moveTo(start.getX(), start.getY());mBezierPath.cubicTo(control1.getX(), control1.getY(), control2.getX(), control2.getY(), end.getX(), end.getY());canvas.drawPath(mBezierPath, mBezierPaint);}private void drawBezierText(Dot start, Dot control1, Dot control2, Dot end, Canvas canvas) {canvas.drawText("moveTo( " + start.mCenterPointVirtual.x + " , " + start.mCenterPointVirtual.y + " );"+ " cubicTo(" + control1.mCenterPointVirtual.x + " , " + control1.mCenterPointVirtual.y + " , "+ control2.mCenterPointVirtual.x + " , " + control2.mCenterPointVirtual.y + " , "+ end.mCenterPointVirtual.x + " , " + end.mCenterPointVirtual.y+ " );", mBoard.getTopLeft().x / 2f, mBoard.getTopLeft().y / 2f, mTextPaint);}
}
三、开发环境
开发环境是 Android Studio 最新版本,只要从官网下载最新的即可编译运行 。
jdk 版本是 17 ,sdk 版本31,gradle plugin version 4.2.2 ,gradle version 版本6.7.1 。
四、运行演示
1、启动程序,首先是1s的启动界面。
2、进入主界面
现在下载源码,让Android Studio与你的艺术梦想相遇,一起创造属于你自己的独特世界~
相关文章:
Android 实战项目分享(一)用Android Studio绘制贝塞尔曲线的艺术之旅
一、项目概述 欢迎来到创意之源!我们精心打造的绘图应用程序将带你进入一个充满艺术和技术的奇妙世界。通过使用Android Studio,我们实现了绘制贝塞尔曲线的功能,让你能够轻松创作出令人惊叹的艺术作品。不论你是热爱绘画的大学生还是渴望学习…...
Windows系统关机后自动重启的解决方法
打开控制面板,找到【电源选项】; 方式一,打开Windows终端(管理员),输入“powercfg /h on”然后回车; 方式二,键盘按下开始键,搜索“控制面板”然后打开; 点击…...
微服务如何改变软件开发:实战经验与最佳实践分享
文章目录 什么是微服务?微服务实战经验1. 定义明确的服务边界2. 使用API网关3. 自动化部署和持续集成4. 监控和日志记录 微服务最佳实践1. 文档和通信2. 弹性设计3. 安全性4. 版本控制5. 监控和警报 微服务的未来 🎉欢迎来到架构设计专栏~微服务如何改变…...
安装深度(Deepin)系统
Deepin系统安装 Deepin是和Ubuntu一样,是一个基于Debian的Linux的发型版本。 Deepin相对于Ubuntu,Deepin更适合中国用户的使用习惯。 一 官网工具制作启动盘 制作启动盘、和安装系统,操作非常简单,nice! 官网提供了…...
Leetcode: 645.错误的集合 题解【超详细】
题目 集合 s 包含从 1 到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数字重复 。 给定一个数组 nums 代表了集合 S 发生错误后的结果。 请你找出重复…...
闲鱼自动化软件——筛选/发送系统 V22已经测试完毕
更新 因为闲鱼版本更新,以及闲鱼整个程序维护记录,又增加了一些优化和提升的代码,所以又一次在整体上更新了一版闲鱼的此款软件。 主要更新点: 1、添加显示自定义按钮,可以自动显示最新数据,也可以手动翻…...
数学建模__动态规划
动态规划就是,将任务每一步均记录下来,以便将来重复使用时能够直接调用 问题描述:给定n个物品,每个物品的重量是Wi,价值是Vi,但是背包最多能装下capacity重量的物品,问我们如何选择才能利益最大化。 这里涉…...
【IoT】生产制造:锅仔片上机做 SMT 加工吗?
目录 简介 锅仔片 简介 由于最近做产品用到了锅仔按键,由于单品用量过多,但是成品锅仔按键价格又太高,不适合量产。 这个时候就想到了锅仔片,问题又来了,锅仔片是否可以上机呢? 答案是肯定的。 锅仔片…...
Stable Diffusion代码简介
Stable Diffusion是一个开源的实时数据流处理引擎,用于处理流式数据。其web UI提供了一个可视化界面来展示数据流的处理过程。 以下是Stable Diffusion web UI的详细代码说明: 1. 界面设计 Stable Diffusion web UI使用React框架进行开发,…...
操作系统的运行机制
1.程序的运行原理: 1.CPU执行指令的过程 C语言代码在编译器上“翻译”,得到二进制的机器指令。一条高级语言的代码翻译过来可能会对应多条机器指令。对于CPU来说,机器指令才是"能看得懂"的语言。程序运行的过程其实就是CPU执行一…...
分布式事务解决方案之2PC
分布式事务解决方案之2PC 前面已经学习了分布式事务的基础理论,以理论为基础,针对不同的分布式场景业界常见的解决方案有2PC、 TCC、可靠消息最终一致性、最大努力通知这几种。 什么是2PC 2PC即两阶段提交协议,是将整个事务流程分为两个阶段…...
发现某设备 adb shell ps 没有输出完整信息
某错误示例 并不是都使用 -ef 参数查找都能够返回完整信息,某些版本设备不适用 -ef 也不会返回完整信息。 简单兼容 简单兼容不同版本 Android 设备查找进程列表,没有通过脚本判断 Android 版本,如有兴趣可以自己修改。 :loop adb shell…...
qt模拟鼠标事件
模拟鼠标事件 1、模拟鼠标按下事件2、模拟鼠标松开事件3、模拟鼠标点击事件4、模拟鼠标移动事件 1、模拟鼠标按下事件 QPoint p this->rect().center();QMouseEvent *pressEvent new QMouseEvent(QEvent::MouseButtonPress,p,Qt::LeftButton,Qt::LeftButton,Qt::NoModifie…...
Linux运维基础知识大全
一. Linux组成 1. 内核 内核:系统空间的代码和数据的集合称为内核(Kernel);kernel是操作系统内部最核心的软件,和硬件打交道的 1.对cpu进行管理,进程调度到cpu里进行管理 2.对内存进行空间的分配࿰…...
西门子S7-1200F或1500F系列安全PLC的组态步骤和基础编程(一)
西门子S7-1200F或1500F系列安全PLC的组态步骤和基础编程(一) 第一部分:组态配置 具体步骤可参考以下内容: 如下图所示,新建一个项目后,添加一个安全型PLC,这里以1516F-3 PN/DP为例进行说明, 如下图所示,添加CPU完成后,可以看到左侧的项目树中比普通的PLC多了几个选项…...
负载均衡-ribbon源码解析
负载均衡-ribbon源码解析 1 LoadBalanced注解 /*** 基于ribbon调用服务及负载均衡* return*/ LoadBalanced Bean public RestTemplate restTemplate(){return new RestTemplate(); }Bean ConditionalOnMissingBean public RestTemplateCustomizer restTemplateCustomizer(fin…...
SideBar 侧边导航与内容区域交互重写【Ant Design Mobile】
需求:SideBar 侧边导航与内容区域交互 点击侧边栏某一项时,相对应内容区域滚动到视口顶部滚动视口区域,到某一项内容区域,侧边栏选中状态也会跟着变化 const SideBarAgain: React.FC<PopupProps> (props) > {// 父组件…...
JavaEE初阶(5)多线程案例(定时器、标准库中的定时器、实现定时器、线程池、标准库中的线程池、实现线程池)
接上次博客:JavaEE初阶(4)(线程的状态、线程安全、synchronized、volatile、wait 和 notify、多线程的代码案例:单例模式——饿汉懒汉、阻塞队列)_di-Dora的博客-CSDN博客 目录 多线程案例 定时器 标准…...
SpringCLoud——Nacos配置中心
Nacos实现配置管理 统一配置管理 配置更新热更新 统一配置的创建是在UI界面中完成的: 首先我们点击【配置管理】然后点击【配置列表】: 然后我们就看到了配置管理界面,但是此时这里是空的,我们可以创建一些配置文件:…...
05目标检测-区域推荐(Anchor机制详解)
目录 一、问题的引入 二、解决方案-设定的anchor boxes 1.高宽比(aspect ratio)的确定 2.尺度(scale)的确定 3.anchor boxes数量的确定 三、Anchor 的在目标检测中是怎么用的 1、anchor boxes对真值bounding box编码的步骤 2、为什么要回归偏移量…...
SpringBoot如何保证接口安全?
对于互联网来说,只要你系统的接口暴露在外网,就避免不了接口安全问题。如果你的接口在外网裸奔,只要让黑客知道接口的地址和参数就可以调用,那简直就是灾难。 举个例子:你的网站用户注册的时候,需要填写手…...
构建可扩展的应用:六边形架构详解与实践
面试题分享 云数据解决事务回滚问题 点我直达 2023最新面试合集链接 2023大厂面试题PDF 面试题PDF版本 java、python面试题 项目实战:AI文本 OCR识别最佳实践 AI Gamma一键生成PPT工具直达链接 玩转cloud Studio 在线编码神器 玩转 GPU AI绘画、AI讲话、翻译,GPU点亮…...
error: RPC failed; HTTP 413 curl 22 The requested URL returned error: 413 解决方案
error: RPC failed; HTTP 413 curl 22 The requested URL returned error: 413 解决方案 使用Git提交时报错,代码如下: $ git push -u origin "master" Counting objects: 100% (95/95), done. Delta compression using up to 12 threads Compressing ob…...
基于ssm智能停车场031
大家好✌!我是CZ淡陌。一名专注以理论为基础实战为主的技术博主,将再这里为大家分享优质的实战项目,本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目,希望你能有所收获,少走一些弯路…...
【Git】万字git与gitHub
🎄欢迎来到边境矢梦的csdn博文🎄 🎄本文主要梳理在git和GitHub时的笔记与感言 🎄 🌈我是边境矢梦,一个正在为秋招和算法竞赛做准备的学生🌈 🎆喜欢的朋友可以关注一下🫰&…...
C++版本的OpenCV实现二维图像的卷积定理(通过傅里叶变换实现二维图像的卷积过程,附代码!!)
C版本的OpenCV库实现二维图像的卷积定理过程详解 前言一、卷积定理简单介绍二、不同卷积过程对应的傅里叶变换过程1、“Same”卷积2、“Full”卷积3、“Valid”卷积 三、基于OpenCV库实现的二维图像卷积定理四、基于FFTW库实现的二维图像卷积定理五、总结与讨论 前言 工作中用…...
打开深度学习的锁:(1)入门神经网络
打开深度学习的锁 导言PS:神经网络的训练过程一、导入的包和说明二、数据的预处理2.1 数据集说明2.2 数据集降维度并且转置2.3 数据预处理完整代码 三、逻辑回归3.1 线性回归函数公式3.2 sigmoid函数公式 四、初始化函数五、构建逻辑回归的前向传播和后向传播5.1 损…...
02- pytorch 实现 RNN
一 导包 import torch from torch import nn from torch.nn import functional as F import dltools 1.1 导入训练数据 batch_size, num_steps 32, 35 # 更改了默认的文件下载方式,需要将 article 文件放入该文件夹 train_iter, vocab dltools.load_data_time_…...
算法课作业1
https://vjudge.net/contest/581138 A - Humidex 模拟题 题目大意 给三个类型数字通过公式来回转化 思路 求e的对数有log函数,不懂为什么不会出精度错误,很迷,给的三个数字也没有顺序,需要多判断。 #include<cstdio>…...
linux文本处理 两行变一行
linux简单文本处理 [rootkvm ~]# cat test 1.1.1.1 test1 2.2.2.2 test2 3.3.3.3 test3 192.168.1.2 test4 10.23.9.19 test5 cat test | awk /^[0-9]/{T$1;next;}{print T,$1}1.1.1.1 test1 2.2.2.2 test2 3.3.3.3 test3 192.168.1.2 test4 10.23.9.19 test5 cat test | …...
电子商务网站建设流程图/营销课程
今天开始学习Vue.js的使用,但是在学习过程中发现一个问题,那就是页面加载数据时,原始代码会闪现一下。查访各方资料,终的解决方法。第一步、加入一段css代码[v-cloak] {display: none;}第二步、在view上引用css模块{{message}}{{n…...
做一个网站的基本步骤/一个新品牌如何推广
Q1. 环境预准备 绝大多数MON创建的失败都是由于防火墙没有关导致的,亦或是SeLinux没关闭导致的。一定一定一定要关闭每个每个每个节点的防火墙(执行一次就好,没安装报错就忽视): CentOS sed -i s/SELINUX.*/SELINUXdisabled/ /etc/selinux…...
ssh安装wordpress/百度投放平台
#把其他静止的数转化为10进制 ainput(‘需要被转化的数’) bint(input(转化前,数的进制是: )) aint(a,b) print(str(a))...
安徽建设委员会网站/百度学术搜索
文章目录一、第一阶段:前三年二、第二阶段:第五年三、第三阶段:第十年总结如果你还没有自己清晰的职业规划,他的建议可以帮助你思考一下自己的将来。 程序员的职业未来分为三个阶段,每个阶段都会遇到一个区分门槛。 程…...
wordpress统计插件下载/网络营销主要有哪些特点
智慧树知到_大数据可视化_2020章节测试答案更多相关问题(103)5______.计算:(-3)332______.计算:(-3)332______.若m为正整数,且a-1,则-(࿰…...
石岩网站建设/百度seo优化排名客服电话
国内四大单机数据库:武汉达梦DM人大金仓 Kingbase南大通用Gbase神通OSCAR国产分布式数据库:蚂蚁金服 OceanBase腾讯 TDSQL中兴 GoldenDB华为 GaussDB200巨杉 SequoiaDB易鲸捷 EsgynDB万里开源 GreatDB星环科技 KunDB国产云数据库:阿里 Analyt…...