package com.ivan.healthcare.healthcare_android.view.chart;
import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import com.ivan.healthcare.healthcare_android.AppContext;
import com.ivan.healthcare.healthcare_android.view.chart.provider.ChartAdapter;
import com.ivan.healthcare.healthcare_android.view.chart.theme.ChartTheme;
import com.ivan.healthcare.healthcare_android.util.Compat;
import java.util.ArrayList;
/**
* <h3>图表抽象类</h3>
* <p>Created by Ivan on 16/3/19.</p>
* <p>该抽象类已经实现了绘制图表坐标系,图例,x轴和y轴的标签的工作,实现类只需要绘制数据即可。</p>
* <p>绘制数据时,实现类只需要调用Chart类提供的api绘制数据即可,不用关心转换过程。</p>
* <p>绘制数据有一些这样的api:<p/>
* <p>{@link #drawLine(Canvas, Paint, float, float, float, float, boolean)}</p>
* <p>{@link #drawPoint(Canvas, Paint, float, float, float)}</p>
* <p>{@link #drawRect(Canvas, Paint, float, float, float, float)}</p>
* <P>{@link #drawRect(Canvas, Paint, float, float, float)}</P>
* <p/>
* <p>实现该图表类的时候,需要注意一些预定义的规则。</p>
* <p>1. 图表的横坐标从编程意义上来说,其步进为1,从0开始,只有正坐标;</p>
* <p>2. Chart类提供了两个变量及其set与get方法
* {@link #getAnimateRate()},{@link #getAnimateType()},{@link #setAnimateRate(float)},{@link #setAnimateType(int)}
* 来作为动画绘图的依据。做动画时调用者可以自行定义其规则并调用之,也可以自己实现一套变量。
* 实现动画应该实现Chart类的抽象动画方法。
* 动画类型预定义有两种:{@link #ANIMATE_X_FLAG}和{@link #ANIMATE_Y_FLAG};</p>
*
* @see LineChart
* @see StackedColumnChart
* @see ParallelColumnChart
*/
public abstract class Chart extends View {
protected final int ANIMATE_X_FLAG = 1;
protected final int ANIMATE_Y_FLAG = 0;
protected final int ANIMATE_NON_FLAG = -1;
protected int animateType = ANIMATE_NON_FLAG;
/**
* 动画的计时器
*/
protected float animateRate = 1.f;
protected ValueAnimator valueAnimator;
private final int X_LABEL_TEXT_SIZE = AppContext.dp2px(11);
private final int Y_LABEL_TEXT_SIZE = AppContext.dp2px(13);
private final int X_LABEL_LINE_SPACE = AppContext.dp2px(2);
public final int MODE_LINE_CHART = 0x31;
public final int MODE_COLUMN_CHART = 0x32;
/**
* 图表种类
*/
private int mode;
/**
* 图表默认间距
*/
private int gridGap = AppContext.dp2px(30);
/**
* x轴标签高度
*/
private final int xLabelHeight = AppContext.dp2px(35);
/**
* y轴标签宽度
*/
private final int yLabelWidth = AppContext.dp2px(43);
/**
* x轴标签上页距
*/
private final int xLabelMargin = AppContext.dp2px(20);
/**
* 图表上页距
*/
private final int topMargin = AppContext.dp2px(10);
/**
* 高亮标签边距
*/
private final int highlightMargin = AppContext.dp2px(3);
/**
* 高亮标签圆角弧度
*/
private final int circleRadius = AppContext.dp2px(2.5f);
/**
* y轴右侧与图表坐标系的水平距离
*/
private final int yLabelDistanceToChart = AppContext.dp2px(5);
/**
* 图例的属性
*/
private final float LINE_WIDTH = AppContext.dp2px(2.5f);
private final float LINE_LENGTH = AppContext.dp2px(25);
private final float CIRCLE_RADIUS = AppContext.dp2px(2.5f);
private final float RECT_WIDTH = AppContext.dp2px(25);
private final float RECT_HEIGHT = AppContext.dp2px(10);
private final float TEXT_SIZE = AppContext.dp2px(13);
private final float OFF_SET = AppContext.dp2px(10);
private final static int LEGEND_HEIGHT = AppContext.dp2px(25);
private final int LEFT_MARGIN = AppContext.dp2px(10);
/**
* 是否自适应调整图表Y轴最大值和分格
*/
public Boolean selfAdaptive = true;
private Paint paint;
/**
* x轴分割线数量
*/
private int xGridLineCount;
/**
* y轴分割线数量
*/
private int yGridLineCount;
/**
* 图表宽度
*/
private int chartWidth = -1;
/**
* y轴标签
*/
private ArrayList<Float> yLabels;
/**
* y轴最大/最小值
*/
private float maxYValue;
private float minYValue;
/**
* y轴标签格式化工具
*/
private YAxisValueFormatter yf = new YAxisValueFormatter(){
@Override
public String yValuesString(float v) {
return v+"";
}
};
/**
* 列宽
*/
private float rectWidth;
/**
* view宽度
*/
private float viewWidth;
/**
* view高度
*/
private float viewHeight;
/**
* 所有图例占据的空间高度
*/
private float allLegendsHeight;
/**
* 图表高度
*/
private float chartHeight;
/**
* 列高
*/
private float rectHeight;
/**
* 行宽
*/
private float yLineSep;
/**
* 图表主题
*/
private ChartTheme theme;
/**
* 背景颜色,优先于theme
*/
private int backgroundColor = 0;
/**
* 数据源适配器
*/
private ChartAdapter mAdapter;
/**
* 检测滑动手势的监听器
*/
private GestureDetector gestureDetector;
/**
* 滑动的偏移
*/
private float scrollOffset;
/**
* 当前图表偏移
*/
private float curOffset;
private Context context;
public Chart(Context context) {
super(context);
init(context);
}
public Chart(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
private void init(Context context) {
this.context = context;
paint = new Paint();
theme = new ChartTheme(context, ChartTheme.THEME_LIGHT);
gestureDetector = new GestureDetector(context, new OnGestureDetector());
setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
getParent().requestDisallowInterceptTouchEvent(true);
return gestureDetector.onTouchEvent(event);
}
});
scrollOffset = 0;
curOffset = 0;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(widthMeasureSpec, heightMeasureSpec);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
xGridLineCount = mAdapter.getXLabelsCount();
chartWidth = gridGap * xGridLineCount;
rectWidth = gridGap;
// view宽度
viewWidth = getWidth();
// view高度
viewHeight = getHeight();
// 图例占据的空间高度
allLegendsHeight = LEGEND_HEIGHT * mAdapter.getLegendCount();
// 图表高度
chartHeight = viewHeight - (mAdapter.drawXLabels()?(xLabelHeight):0) - topMargin - allLegendsHeight - xLabelMargin/2;
// 列高
rectHeight = chartHeight;
// 行宽
yLineSep = (chartHeight /((float)yGridLineCount-1.f));
drawChart(canvas);
drawYAxis(canvas);
drawLegends(canvas);
}
@Override
public boolean onTouchEvent(MotionEvent e) {
if (e.getActionMasked() == MotionEvent.ACTION_UP && e.getPointerCount() == 1) {
curOffset += scrollOffset;
scrollOffset = 0;
return true;
}
return false;
}
/**
* �
没有合适的资源?快使用搜索试试~ 我知道了~
基于JAVA开发的血压实时监控app源码+项目说明.7z
共265个文件
png:106个
java:70个
xml:57个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 32 浏览量
2022-12-07
17:30:48
上传
评论 2
收藏 654KB 7Z 举报
温馨提示
基于JAVA开发的血压实时监控app源码+项目说明 毕设:一个血压实时监控app,该app主要功能为与测量设备进行通信,获取测量数据并在客户端进行处理,由服务器进行数据分析,为用户提供健康评估及建议。 蓝牙功能 可以打开蓝牙并连接到指定设备获取数据流。 数据图表 已完成图表UI设计以及模块功能搭建,已实现图表数据的数据库读取功能。 个人设置 已搭建好UI,完成个人信息页面全部功能。已完成全部网络通信接口。 搭建好数据库模块以及网络通信模块 数据库功能已经实现并抽象,网络通信功能也已实现并抽象,服务器初步搭建了框架。 服务器和客户端已完成了关于User数据和测量数据的上传下载以及清空等一系列操作,本机已通过花生壳映射到外网作为测试服务器。 服务器已有比较简单的UI可供查询指定用户的测量数据。 状态计算 根据监控数据(振动,屏幕控制)计算用户状态,客户端算法已初步完成。 一些附加功能 已完成监听加速度计获取振动数据;已完成监听屏幕亮灭解锁功能;已完成上述两种数据的数据库读写以及图表呈现功能。 服务器 服务器已完成所有与客户端通信的功能,已初步构建了一个可视化的网页对数据进行初步
资源推荐
资源详情
资源评论
收起资源包目录
基于JAVA开发的血压实时监控app源码+项目说明.7z (265个子文件)
gradlew.bat 2KB
HCUtil.c 4KB
base64.c 3KB
HCUtil.o.d 5KB
HCUtil.o.d 5KB
HCUtil.o.d 5KB
healthcare_android.db 15KB
.gitignore 91B
.gitignore 7B
build.gradle 2KB
build.gradle 686B
settings.gradle 15B
gradlew 5KB
com_ivan_healthcare_healthcare_android_util_crypt_Crypter.h 969B
base64.h 259B
app.iml 11KB
HealthCare_Android.iml 949B
gradle-wrapper.jar 49KB
Chart.java 26KB
PersonalInfoActivity.java 23KB
MeasureFragment.java 20KB
DataAccess.java 18KB
ChartActivity.java 17KB
MonitorHistoryActivity.java 15KB
ProfileFragment.java 15KB
QueryBuilder.java 14KB
MonitorFragment.java 14KB
CalendarView.java 11KB
MainActivity.java 9KB
LoginDialog.java 9KB
BluetoothCommUtil.java 9KB
User.java 9KB
Sync.java 8KB
LineChart.java 8KB
OkHttpUtil.java 8KB
Compat.java 7KB
BaseStringRequest.java 7KB
CalendarAdapter.java 7KB
AlarmActivity.java 7KB
ShadowLineChart.java 6KB
Constellation.java 5KB
Tabbar.java 5KB
Button.java 5KB
CropImageActivity.java 5KB
StackedColumnChart.java 4KB
DialogBuilder.java 4KB
ChangePwdDialog.java 4KB
Preference.java 4KB
ParallelColumnChart.java 4KB
ButtonFlat.java 4KB
CalendarFragment.java 4KB
NotifyUtil.java 3KB
TabViewController.java 3KB
AppContext.java 3KB
CircleProgressView.java 3KB
DayView.java 3KB
UserInfoBean.java 3KB
ChartTheme.java 2KB
AlarmView.java 2KB
AbsBaseRequest.java 2KB
BackupActivity.java 2KB
TimeUtils.java 2KB
CalendarTheme.java 2KB
ChartAdapter.java 2KB
AIToast.java 2KB
CustomViewPager.java 2KB
Alarm.java 2KB
Configurations.java 2KB
Time.java 1KB
CustomView.java 1KB
MeasureDataBean.java 1KB
WeekDayView.java 1KB
Day.java 941B
DatabaseOpenHelper.java 817B
NotifyReceiver.java 811B
L.java 794B
SimpleChartAdapter.java 759B
Result.java 749B
LineChartAdapter.java 518B
BaseBean.java 504B
MeasureComm.java 444B
ColumnChartAdapter.java 395B
Database.java 394B
ApplicationTest.java 369B
InfoBean.java 354B
ExampleUnitTest.java 331B
Crypter.java 311B
BaseActivity.java 220B
项目说明.md 2KB
.name 18B
HCUtil.o 25KB
HCUtil.o 25KB
HCUtil.o 24KB
device-2016-04-29-134802.png 79KB
device-2016-05-07-191410.png 75KB
device-2016-05-07-191120.png 67KB
device-2016-05-07-195911.png 65KB
device-2016-05-07-195935.png 61KB
device-2016-05-07-191436.png 58KB
device-2016-05-07-191915.png 52KB
共 265 条
- 1
- 2
- 3
资源评论
Make程序设计
- 粉丝: 5628
- 资源: 3567
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- QuestionTwo.java
- QuestionOne.java
- OA办公自动化管理系统(Struts1.2+Hibernate3.0+Spring2+DWR).rar
- 简历-求职简历-word-文件-简历模版免费分享-应届生-高颜值简历模版-个人简历模版-简约大气-大学生在校生-求职-实习
- 南京邮电大学数学实验:熟练掌握 Matlab 软件的基本命令和操作
- 简历-求职简历-word-文件-简历模版免费分享-应届生-高颜值简历模版-个人简历模版-简约大气-大学生在校生-求职-实习
- 2017校招真题校园招聘真题算法题(37道)Python源码.zip
- 基于单片机protues仿真的多功能自动饮水机系统设计(仿真图、源代码、演示视频)
- 论文《一种修复流程挖掘事件日志中缺失活动标签的深度学习方法》翻译
- 智慧电厂相关资料发电控制的方式
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功