Android RecyclerChart其它图表绘制示例详解

 更新时间:2022年12月14日 08:56:25   作者:cxy107750  
这篇文章主要为大家介绍了Android RecyclerChart其它图表绘制示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

正文

之前章节介绍了RecyclerChart 中一些通用的图表的相关绘制逻辑,本章节介绍两种Special的Chart的绘制,一种是心电图,一种是睡眠图。首先我们来看下心电图EcgChart的绘制。

1. 心电图

EcgChart 跟LineChart形态上是相似的,但是EcgChart的点相对于LineChart密集的多,之前的LineChart相当于每个RecyclerView的Itemview 中的Model对应的value值,而心电图的ItemDataModel背后有一个List的value值与之对应,针对1080px width的手机而言,极大可能地超出了1px一个Point,所以这里的绘制逻辑换成每个Item中对应一段path, path 是由ItemDataModel的List,注意处理前后两个Path的衔接处即可, 这里具体List的大小可根据需求来定,原始的每个Item中是20个Point。首先先看下横屏无线右滑的EcgChart动图gif:

绘制的逻辑代码, 因为每个ItemView的width也很小就没有像之前的LineChart单独处理边界的绘制问题了。

private <T extends BarEntry> void drawLineChartWithoutPoint(Canvas canvas, RecyclerView parent, YAxis mYAxis) {
  final float parentRightBoard = parent.getWidth() - parent.getPaddingRight();
  final float parentLeft = parent.getPaddingLeft();
  //BaseBarChartAdapter adapter = (BaseBarChartAdapter) parent.getAdapter();
  final int childCount = parent.getChildCount();
  for (int i = 0; i < childCount; i++) {
    View child = parent.getChildAt(i);
    T barEntry = (T) child.getTag();
    float preValue = Integer.MIN_VALUE;
    if (i > 0){
      View pointF1Child = parent.getChildAt(i - 1);
      T barEntryLeft = (T) pointF1Child.getTag();
      if (barEntryLeft instanceof  EcgEntry){
        List<Float> values = ((EcgEntry) barEntryLeft).values;
        if (values.size() > 0){
          preValue =  values.get(values.size() - 1);
        }
      }
    }
    if (barEntry instanceof EcgEntry){
      List<Float> values = ((EcgEntry) barEntry).values;
      RectF rectF = ChartComputeUtil.getBarChartRectF(child, parent, 
                                                      mYAxis, mLineChartAttrs, barEntry);
      if (rectF.left < parentLeft || rectF.right > parentRightBoard){
        continue;
      }
      float innerItemWidth = rectF.width()/values.size();
      float startX = rectF.left;
      // preValue 用来衔接两个ItemView中的path,防止断连的问题。
      preValue = preValue == Integer.MIN_VALUE?values.get(0): preValue;
      float firstPosition = ChartComputeUtil.getYPosition(preValue, parent,
                                                          mYAxis, mLineChartAttrs);
      Path pathItem = new Path();
      pathItem.moveTo(startX, firstPosition);
      for (int j = 0; j < values.size(); j++) {
        float yPosition = ChartComputeUtil.getYPosition(values.get(j), 
         parent, mYAxis, mLineChartAttrs);
        pathItem.lineTo(startX + j * innerItemWidth, yPosition );
      }
      canvas.drawPath(pathItem, mLineChartPaint);
    }
  }
}

EcgChart整体的绘制逻辑还是比较简单的, 这里的Entry对象也如上所述的包含一个List

public class EcgEntry extends BarEntry{
    public List<Float> values = new ArrayList<>();
    public EcgEntry(int i, float value, long timestamp, int type) {
        super(i, value, timestamp, type);
    }
}

2. 睡眠图

之前在MPChart的绘制中有介绍过睡眠泳道图的绘制,不同与之前的Chart图表,每个Itemview 是等宽的,这里的Item是根据睡眠时长然后睡眠的Type来确定不同的高度、颜色等。这里先看下睡眠泳道动图gif:

看下代码在SleepChartAdapter中设置不同的ItemView的宽度,setLinearLayout函数设置:

以上代码里通过SleepItemEntry计算出ItemWidth的宽度,然后传给setLinearLayout函数:

介绍完设置 Sleep泳道图 ItemView 不一致的宽度,下边就是如何绘制了, 因为Adpter里ItemView已经设置了它的width了,所以拿到ItemView的宽度之后,就可以直接根据它的宽度,然后不同的type确定其高度。

确定每一个RectF之后,绘制即可:

本文主要介绍在除了基本的BarChart、LineChart、BezierChart等之外,可以看到RecyclerChart 可以绘制更多的可能性的图表,在RecyclerView的 Adapter, dataModel, Render的配合下会有不同的可能性,能够解决各种不同的需求,同样例如之前的MPChart中介绍的SegmentBarChart这种变种的柱状图等,都可以实现的。

以上就是Android RecyclerChart其它图表绘制示例详解的详细内容,更多关于RecyclerChart图表绘制的资料请关注脚本之家其它相关文章!

相关文章

  • Flutter开发之动态权限的使用

    Flutter开发之动态权限的使用

    众所周知,Android在6.0版本后将权限修改成了动态权限,而iOS则一直使用的是动态权限,所以在Flutter应用开发中如果涉及到一些危险权限,就需要进行动态申请,本文就详细的介绍一下,感兴趣的可以了解一下
    2021-09-09
  • Android使用百度地图出现闪退及定位时显示蓝屏问题的解决方法

    Android使用百度地图出现闪退及定位时显示蓝屏问题的解决方法

    这篇文章主要介绍了Android使用百度地图出现闪退及定位时显示蓝屏问题的解决方法,需要的朋友可以参考下
    2018-01-01
  • 解析Android 如何获得已安装应用大小

    解析Android 如何获得已安装应用大小

    本篇文章是对Android获得已安装应用大小的解决方法进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • Android实现带圆环的圆形头像

    Android实现带圆环的圆形头像

    这篇文章主要为大家详细介绍了Android实现带圆环的圆形头像,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-08-08
  • Android判断服务是否运行及定位问题实例分析

    Android判断服务是否运行及定位问题实例分析

    这篇文章主要介绍了Android判断服务是否运行及定位问题,以实例形式较为详细的分析了Android判断服务运行状态及获取经纬度的相关实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-09-09
  • Android 抽屉效果的导航菜单实现代码实例

    Android 抽屉效果的导航菜单实现代码实例

    本篇文章主要介绍了Android 抽屉效果的导航菜单实现代码实例,这种侧滑的抽屉效果的菜单很好,有兴趣的可以了解一下。
    2016-12-12
  • Android自定义控件基本原理详解(一)

    Android自定义控件基本原理详解(一)

    这篇文章主要为大家详细介绍了Android自定义控件基本原理,了解一下自定义控件的要求和实现的基本原理,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • Android 删除指定包名的App实例代码

    Android 删除指定包名的App实例代码

    这篇文章主要介绍了Android 删除指定包名的App实例代码,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-07-07
  • Android APK 32位和64位的区别及说明

    Android APK 32位和64位的区别及说明

    这篇文章主要介绍了Android APK 32位和64位的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • Android开发常见问题总结

    Android开发常见问题总结

    这篇文章主要介绍了Android开发常见问题,总结分析了诸如界面设计、多媒体调用、图片、动画操作等开发中常见的问题解决方法与相关注意事项,需要的朋友可以参考下
    2016-08-08

最新评论