Android开发--自定义时频域折线绘制图

2024-01-24 13:44

本文主要是介绍Android开发--自定义时频域折线绘制图,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

直接上干货!!!

1.XML

            <com.afison.newfault.view.CustomViewandroid:id="@+id/customView"android:layout_width="match_parent"android:layout_height="200dp" /><Buttonandroid:id="@+id/generateButton"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:layout_centerHorizontal="true"android:text="Generate Data"android:onClick="generateData"/>

2.测试函数

    public void generateData(View view) {// 生成随机数据float timeDomainData = (float) Math.random();float frequencyDomainData = (float) Math.random();// 更新视图customView.setTimeDomainData(timeDomainData);customView.setFrequencyDomainData(frequencyDomainData);}

3.CustomView实现

public class CustomView extends View {private Paint timeDomainPaint;private Paint frequencyDomainPaint;private Paint axisPaint; // 坐标轴画笔private Paint textPaint; // 文本画笔private LinkedList<Float> timeDomainDataList;private LinkedList<Float> frequencyDomainDataList;private int maxDataCount;private float minValue;private float maxValue;public CustomView(Context context, AttributeSet attrs) {super(context, attrs);timeDomainPaint = new Paint();timeDomainPaint.setColor(Color.BLUE);timeDomainPaint.setStrokeWidth(2f);timeDomainPaint.setAntiAlias(true);frequencyDomainPaint = new Paint();frequencyDomainPaint.setColor(Color.RED);frequencyDomainPaint.setStrokeWidth(2f);frequencyDomainPaint.setAntiAlias(true);axisPaint = new Paint();axisPaint.setColor(Color.WHITE);axisPaint.setStrokeWidth(2f);axisPaint.setAntiAlias(true);textPaint = new Paint();textPaint.setColor(Color.WHITE);textPaint.setTextSize(24f);textPaint.setAntiAlias(true);maxDataCount = 100;timeDomainDataList = new LinkedList<>();frequencyDomainDataList = new LinkedList<>();}public void setTimeDomainData(float data) {if (timeDomainDataList.size() >= maxDataCount) {timeDomainDataList.removeFirst();}timeDomainDataList.addLast(data);updateMinMaxValue();invalidate();}public void setFrequencyDomainData(float data) {if (frequencyDomainDataList.size() >= maxDataCount) {frequencyDomainDataList.removeFirst();}frequencyDomainDataList.addLast(data);updateMinMaxValue();invalidate();}private void updateMinMaxValue() {minValue = Float.MAX_VALUE;maxValue = -Float.MAX_VALUE;for (float value : timeDomainDataList) {minValue = Math.min(minValue, value);maxValue = Math.max(maxValue, value);}for (float value : frequencyDomainDataList) {minValue = Math.min(minValue, value);maxValue = Math.max(maxValue, value);}}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);int width = getWidth();int height = getHeight();int halfHeight = height / 2;int dataSize = Math.min(timeDomainDataList.size(), frequencyDomainDataList.size());// 绘制坐标轴canvas.drawLine(0, halfHeight, width, halfHeight, axisPaint); // x 轴canvas.drawLine(0, 0, 0, height, axisPaint); // y 轴// 绘制坐标轴标注canvas.drawText(String.format(Locale.getDefault(), "%.2f", maxValue), 4, 24, textPaint); // 最大值canvas.drawText(String.format(Locale.getDefault(), "%.2f", minValue), 4, height - 4, textPaint); // 最小值canvas.drawText("时域", width - 200, halfHeight - 12, textPaint); // x 轴标注canvas.drawText("频域", width - 200, halfHeight + 24, textPaint); // y 轴标注// 绘制时域波形for (int i = 0; i < dataSize - 1; i++) {float x1 = (float) i * width / dataSize;float y1 = halfHeight - (timeDomainDataList.get(i) - minValue) / (maxValue - minValue) * halfHeight;float x2 = (float) (i + 1) * width / dataSize;float y2 = halfHeight - (timeDomainDataList.get(i + 1) - minValue) / (maxValue - minValue) * halfHeight;canvas.drawLine(x1, y1, x2, y2, timeDomainPaint);}// 绘制频域波形for (int i = 0; i < dataSize - 1; i++) {float x1 = (float) i * width / dataSize;float y1 = height - (frequencyDomainDataList.get(i) - minValue) / (maxValue - minValue) * height;float x2 = (float) (i + 1) * width / dataSize;float y2 = height - (frequencyDomainDataList.get(i + 1) - minValue) / (maxValue - minValue) * height;canvas.drawLine(x1, y1, x2, y2, frequencyDomainPaint);}}
}

4.效果展示

这篇关于Android开发--自定义时频域折线绘制图的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/639883

相关文章

Java实现自定义table宽高的示例代码

《Java实现自定义table宽高的示例代码》在桌面应用、管理系统乃至报表工具中,表格(JTable)作为最常用的数据展示组件,不仅承载对数据的增删改查,还需要配合布局与视觉需求,而JavaSwing... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

一文详解Java Stream的sorted自定义排序

《一文详解JavaStream的sorted自定义排序》Javastream中的sorted方法是用于对流中的元素进行排序的方法,它可以接受一个comparator参数,用于指定排序规则,sorte... 目录一、sorted 操作的基础原理二、自定义排序的实现方式1. Comparator 接口的 Lam

SpringBoot开发中十大常见陷阱深度解析与避坑指南

《SpringBoot开发中十大常见陷阱深度解析与避坑指南》在SpringBoot的开发过程中,即使是经验丰富的开发者也难免会遇到各种棘手的问题,本文将针对SpringBoot开发中十大常见的“坑... 目录引言一、配置总出错?是不是同时用了.properties和.yml?二、换个位置配置就失效?搞清楚加

Android DataBinding 与 MVVM使用详解

《AndroidDataBinding与MVVM使用详解》本文介绍AndroidDataBinding库,其通过绑定UI组件与数据源实现自动更新,支持双向绑定和逻辑运算,减少模板代码,结合MV... 目录一、DataBinding 核心概念二、配置与基础使用1. 启用 DataBinding 2. 基础布局

Python中对FFmpeg封装开发库FFmpy详解

《Python中对FFmpeg封装开发库FFmpy详解》:本文主要介绍Python中对FFmpeg封装开发库FFmpy,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、FFmpy简介与安装1.1 FFmpy概述1.2 安装方法二、FFmpy核心类与方法2.1 FF

Android ViewBinding使用流程

《AndroidViewBinding使用流程》AndroidViewBinding是Jetpack组件,替代findViewById,提供类型安全、空安全和编译时检查,代码简洁且性能优化,相比Da... 目录一、核心概念二、ViewBinding优点三、使用流程1. 启用 ViewBinding (模块级

基于Python开发Windows屏幕控制工具

《基于Python开发Windows屏幕控制工具》在数字化办公时代,屏幕管理已成为提升工作效率和保护眼睛健康的重要环节,本文将分享一个基于Python和PySide6开发的Windows屏幕控制工具,... 目录概述功能亮点界面展示实现步骤详解1. 环境准备2. 亮度控制模块3. 息屏功能实现4. 息屏时间

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

使用Python开发一个现代化屏幕取色器

《使用Python开发一个现代化屏幕取色器》在UI设计、网页开发等场景中,颜色拾取是高频需求,:本文主要介绍如何使用Python开发一个现代化屏幕取色器,有需要的小伙伴可以参考一下... 目录一、项目概述二、核心功能解析2.1 实时颜色追踪2.2 智能颜色显示三、效果展示四、实现步骤详解4.1 环境配置4.

Python使用smtplib库开发一个邮件自动发送工具

《Python使用smtplib库开发一个邮件自动发送工具》在现代软件开发中,自动化邮件发送是一个非常实用的功能,无论是系统通知、营销邮件、还是日常工作报告,Python的smtplib库都能帮助我们... 目录代码实现与知识点解析1. 导入必要的库2. 配置邮件服务器参数3. 创建邮件发送类4. 实现邮件