• 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);
        }
    
        @Override
        public 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);
        }
    
        @Override
        protected 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());
    
        }
    
    
        @Override
        protected 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);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115

    三、开发环境

    开发环境是 Android Studio 最新版本,只要从官网下载最新的即可编译运行 。

    jdk 版本是 17 ,sdk 版本31,gradle plugin version 4.2.2 ,gradle version 版本6.7.1 。

    在这里插入图片描述

    在这里插入图片描述

    四、运行演示

    1、启动程序,首先是1s的启动界面。

    2、进入主界面

    在这里插入图片描述

    在这里插入图片描述

    现在下载源码,让Android Studio与你的艺术梦想相遇,一起创造属于你自己的独特世界~

  • 相关阅读:
    linux常用命令记录
    关于pbr中镜面IBL低差异序列中的 Van Der Corput 序列
    渗透测试-目录遍历漏洞
    linux入门---信号的保存和捕捉
    Python语言:元组的使用
    docker安装最新版lastest
    async...await在tcp通讯中的正确用法
    Vue页面使用Vue3语法
    学会 Python yield 关键词,此文就够了
    Solidity之变量数据存储和作用域
  • 原文地址:https://blog.csdn.net/lizhong2008/article/details/132896303