Android 实战项目分享(一)用Android Studio绘制贝塞尔曲线的艺术之旅


一、项目概述


欢迎来到创意之源!我们精心打造的绘图应用程序将带你进入一个充满艺术和技术的奇妙世界。通过使用Android Studio,我们实现了绘制贝塞尔曲线的功能,让你能够轻松创作出令人惊叹的艺术作品。不论你是热爱绘画的大学生还是渴望学习的艺术爱好者,这个应用程序将为你点燃创作的激情,让你沉浸在绘画的乐趣中。


二、主要技术点

  1. 贝塞尔曲线的绘制:我们巧妙地利用Android Studio的绘图功能,实现了贝塞尔曲线的绘制。通过简单的操作,你可以自由操控曲线的形状和曲率,为你的艺术作品注入无限可能。

  2. JSON数据解析:我们应用程序支持JSON数据解析,让你能够轻松处理服务器返回的数据。这样,你可以从服务器获取配置文件等信息,并在绘画过程中灵活应用。

  3. 本地文件存取:我们还提供了本地文件存取功能,让你可以保存和管理自己的绘画作品。你可以在应用程序中随时查看、编辑和分享你的艺术杰作。

  4. 全屏启动页实现:我们特别优化了应用程序的启动页,实现了无缝过渡,避免了白屏的尴尬。你将享受到完美的用户体验,让你的创作之旅更加流畅自然。

  1. 动态权限申请:我们重视用户隐私和安全,因此应用程序支持动态权限申请。这意味着在使用过程中,我们将确保你对所需权限的控制,保护你的个人信息和设备安全。

  2. HTTPS通信:我们采用HTTPS通信协议,保证你的数据传输安全和隐私保护。无论是进行GET请求还是POST请求,你都可以放心地与服务器进行安全的数据交互。

  3. 通用隐私协议服务协议弹出窗口:我们关注用户隐私权,为了保障你的合法权益,我们在应用程序中提供了通用隐私协议服务协议弹出窗口。这让你清晰了解我们对你个人信息的处理方式,建立起互信的基础。

  4. 从服务器获取配置文件,并解析:我们的应用程序能够从服务器动态获取配置文件,并进行解析。这使你能够随时更新应用程序的功能和特性,保持与最新技术的同步。

  5. AgentWeb的使用和封装:我们采用了大名鼎鼎的AgentWeb,一行代码即可实现专属浏览器的功能。这为你提供了便捷的网络浏览和搜索功能,让你在创作中获得更多灵感和参考。

  6. 本地日志接口的封装:我们为应用程序封装了本地日志接口,使你可以灵活地记录和管理应用程序的运行情况。在发布版本时,你可以根据需要关闭日志记录,优化代码性能。


在这里插入图片描述

主要演示代码:

//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与你的艺术梦想相遇,一起创造属于你自己的独特世界~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/79625.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

elementui el-dialog 动态生成多个,点击按钮打开对应的 dialog

业务场景: 根据后端返回的数据,动态生成表单,返回的数据中会有表单字段的类型,如果单选、多选、富文本,其它的属性还好说,重点说在富文本,因为我想通过 dialog 弹窗的方式,进行富文…

Unity 性能优化之Shader分析处理函数ShaderUtil.HasProceduralInstancing: 深入解析与实用案例

Unity 性能优化之Shader分析处理函数ShaderUtil.HasProceduralInstancing: 深入解析与实用案例 点击封面跳转到Unity国际版下载页面 简介 在Unity中,性能优化是游戏开发过程中非常重要的一环。其中,Shader的优化对于游戏的性能提升起着至关重要的作用。…

VS2015+opencv 3.4.6开发环境

VS2015+opencv 3.4.6开发环境 一、安装包下载二、安装过程三、VS环境配置四、测试一、安装包下载 这里提供两种下载方法:   1. opencv官网   2. csdn资源下载 二、安装过程 2.1 下载opencv-3.4.6 安装包 2.2 双击开始安装,选择要安装目录,点击Extract。  2.3 等待解…

基于SSM的化妆品配方及工艺管理系统设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

69、Spring Data JPA 的 @Query查询 和 命名查询

Query查询 和 命名查询的区别: 命名查询与直接用Query来定义查询的本质是一样,只不过它们定义SQL或JPQL语句的位置不同。 直接用 Query来定义查询 ,写SQL或JPQL语句的位置在 DAO 组件, 命名查询,写SQL或JPQL语句的位置…

神经网络与强化学习:揭示AI的超能力

文章目录 神经网络:模拟人脑的工具强化学习:通过试错学习结合神经网络和强化学习价值网络策略网络结合训练 应用领域游戏机器人控制金融交易 未来趋势自动化和自主系统个性化和自适应系统跨学科研究 结论 🎉欢迎来到AIGC人工智能专栏~神经网络…

【MATLAB第75期】#源码分享 | 基于MATLAB的不规则间隔数据插值实现时间序列数据扩充(更新中)

【MATLAB第75期】#源码分享 | 基于MATLAB的不规则间隔数据插值实现时间序列数据扩充 代码 %% 清空环境变量 warning off % 关闭报警信息 close all % 关闭开启的图窗 clear % 清空变量 clc % 清空命令行%%…

抽奖系统的设计与实现

1 绪论 随着人类社会步入21世纪,信息技术的飞速发展和社会信息化的不断提高,特别是进入网络信息时代,我们的工作越来越离不开计算机,这个时候就需要更好的运用现代化技术为各联系点服务,不断提高工作效率。计算机就充分体现了在这…

Tomcat修改配置文件

1.Tomcat启动乱码问题 1.1conf目录 说明:找到conf目录下logging.properties文件 1.2打开logging.properties文件 说明:将UTF-8修改成GBK 1.3.效果 2.端口冲突问题 2.1 conf目录 2.2打开 server.xml文件 2.3.修改端口 说明:port指的就是端…

使用node实现websocket

使用node实现websocket 什么是websocket websocket代表了Web应用程序通信方式的根本转变。不同于传统的HTTP请求响应周期,即客户端从服务器请求数据并等待响应,websocket在客户端和服务器之间建立一个持久的全双工连接。这意味着一旦建立了websocket&a…

LeetCode【4. 寻找两个正序数组的中位数】

快乐安康 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (mn)) 。 public double findMedianSortedArrays(int[] nums1, int[] nums2) {if (nums1.length &…

如何实现 pdf 转 word

前言:最直接的方式 wps 充会员可以直接转,但是单纯为了 使用这个功能有没啥必要 pdf转word方法 在线转换wps转换其他收费转换方式 在线转换 介绍在线转换,虽然样式简陋但是可以转换成功,转换以后也没有失真 http://ssyr.mynatap…

linux安装sqoop

一 解压安装包 这里提供了网盘资源 链接: https://pan.baidu.com/s/1QkFqVnlvuOJ_aB2bjn-OKg?pwducsy 提取码: ucsy 这里有两个压缩包,sqoop-1.4.7.tar.gz是 sqoop 的安装包,另一个是我们需要里面的一些 jar 包 解压 安装包 tar -zxf ./sqoop-1.4.7.t…

1-FPGA硬件加速-YUV_YCbCr

这是对《基于Matlab与FPGA的图像处理教程》的学习笔记,代码和内容摘取自书中。 心得: 使用FPGA进行硬件加速的重点是消除或者减少浮点数运算,转换为定点运算,然后通过pipeline流水设计转为并行实现加速。 原理和方法 RGB与&…

使用原生的js实现分享功能,代码非常精简

分享一个原生的js实现移动端分享功能,希望大家喜欢。 兼容性: 实现代码: function share(){ if (!navigator.share) { alert("您当前浏览器不支持分享!"); } else { navigator.share({title: {$title},text: {$introd…

Vue2面试题100问

Vue2面试题100问 Vue2面试题100问1.简述一下你对Vue的理解2.声明式和命令式编程概念的理解3.Vue 有哪些基本特征4.vue之防止页面加载时看到花括号解决方案有哪几种?5.Vue中v-for与v-if能否一起使用?6.vue中v-if与v-show的区别以及使用场景7.v-on可以监听…

Docker--未完结

一.Docker是干什么的 在没亲自使用过之前,再多的术语也仅仅是抽象,只有写的人或者使用过的人能看懂。 所以,作为新手来说,只要知道Docker是用于部署项目就够了,下面展示如何用Docker部署项目及Docker常用命令。 二、…

冠达管理:庄家最怕的8个方法?

在股票商场上,庄家总是短时刻内操控价格,并在一定的时刻内进出股市,以赚取巨额赢利。 假如想在股票商场上盈余,那么就必须站在庄家的对立面,把握一些防护和反击的办法。这里就来介绍一些庄家最怕的办法。 一、技能剖析…

【自学开发之旅】Flask-restful-Jinjia页面编写template-回顾(五)

restful是web编程里重要的概念 – 一种接口规范也是一种接口设计风格 设计接口: 要考虑:数据返回、接收数据的方式、url、方法 统一风格 rest–表现层状态转移 web–每一类数据–资源 资源通过http的动作来实现状态转移 GET、PUT、POST、DELETE path…

使用Docker构建轻量级Linux容器

Docker是一个开源的容器化平台,可以帮助用户快速创建、部署和管理应用程序的轻量级Linux容器。通过Docker,用户可以将应用程序及其所有依赖项打包成一个独立的容器镜像,并在各种环境中运行,无需担心环境差异和依赖冲突。下面将详细…