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

相关文章

Android kotlin语言实现删除文件的解决方案

《Androidkotlin语言实现删除文件的解决方案》:本文主要介绍Androidkotlin语言实现删除文件的解决方案,在项目开发过程中,尤其是需要跨平台协作的项目,那么删除用户指定的文件的... 目录一、前言二、适用环境三、模板内容1.权限申请2.Activity中的模板一、前言在项目开发过程中,尤

使用DeepSeek API 结合VSCode提升开发效率

《使用DeepSeekAPI结合VSCode提升开发效率》:本文主要介绍DeepSeekAPI与VisualStudioCode(VSCode)结合使用,以提升软件开发效率,具有一定的参考价值... 目录引言准备工作安装必要的 VSCode 扩展配置 DeepSeek API1. 创建 API 请求文件2.

基于Python开发电脑定时关机工具

《基于Python开发电脑定时关机工具》这篇文章主要为大家详细介绍了如何基于Python开发一个电脑定时关机工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 简介2. 运行效果3. 相关源码1. 简介这个程序就像一个“忠实的管家”,帮你按时关掉电脑,而且全程不需要你多做

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

SpringBoot 自定义消息转换器使用详解

《SpringBoot自定义消息转换器使用详解》本文详细介绍了SpringBoot消息转换器的知识,并通过案例操作演示了如何进行自定义消息转换器的定制开发和使用,感兴趣的朋友一起看看吧... 目录一、前言二、SpringBoot 内容协商介绍2.1 什么是内容协商2.2 内容协商机制深入理解2.2.1 内容

C#图表开发之Chart详解

《C#图表开发之Chart详解》C#中的Chart控件用于开发图表功能,具有Series和ChartArea两个重要属性,Series属性是SeriesCollection类型,包含多个Series对... 目录OverviChina编程ewSeries类总结OverviewC#中,开发图表功能的控件是Char

Android WebView的加载超时处理方案

《AndroidWebView的加载超时处理方案》在Android开发中,WebView是一个常用的组件,用于在应用中嵌入网页,然而,当网络状况不佳或页面加载过慢时,用户可能会遇到加载超时的问题,本... 目录引言一、WebView加载超时的原因二、加载超时处理方案1. 使用Handler和Timer进行超