Git Product home page Git Product logo

suitlines's Introduction

SuitLines Download

suitline是一个小巧且高效的线性图表组件。

image image

image image

更新历史

  • 2018/7/9

从本次提交开始,不再支持通过compile形式集成,建议直接拷贝源码到项目,方便自定义;

1. 修复被detach的情况下,重新attach到View时没有绘制的情况;
2. 支持显示y为负数的情况;
3. 新增y轴刻度辅助线显示,通过方法`setShowYGrid(boolean showYGrid)`开启或关闭;
  • 2017/5/21(v1.1.0)

    1. 修复BUG:#1,#7;
    2. 新增FILL形态时显示图表上边框线的属性coverLine,具体效果已添加至demo,通过方法setCoverLine(boolean enable)开启或关闭;

功能特性

suitline基于实用性目的而打造,相较于其它图表库,suitlines在多线段、性能体验以及视觉反馈等几个方面进行了支持和优化,使其更适合用于实际项目中。suitLines的所有特性如下:

  • 可以为line指定一或多种颜色;

  • 支持多条line;

  • 支持线段 / 曲线 / 虚线 相互切换;

  • 支持边缘拖动反馈效果;

  • 支持y轴自定义分隔区间、x轴自定义文本;

  • 支持点击反馈;

  • 美而不腻的动画;

使用步骤

注意:SuitLines需要项目的 API >= 14

1.集成

  • 第一种:通过build.gradle方式集成 [DEPRECATED]

    compile 'tech.linjiang:suitlines:1.1.0'
  • 第二种:直接下载源文件到项目。(推荐

    由于所有的逻辑代码都在SuitLines.java中且拥有丰富的注释,所以可以方便地按照实际业务需求来调整或改造。

2.在xml布局中调用:

<tech.linjiang.suitlines.SuitLines
    xmlns:line="http://schemas.android.com/apk/res-auto"
    android:id="@+id/suitlines"
    android:layout_width="match_parent"
    android:layout_height="200dp"
    line:xySize="8"
    line:xyColor="@color/colorAccent"
    line:lineType="curve"
    line:Style="solid"
    line:needEdgeEffect="true"
    line:colorEdgeEffect="@color/colorPrimaryDark"
    line:needClickHint="true"
    line:colorHint="@color/colorPrimary"
    line:maxOfVisible="7"
    line:countOfY="6"/>

所有可静态配置的属性如上,以下是其对应的动态设置方法及其它API:

静态属性 对应API 说明
xySize setXySize xy轴文字大小
xyColor setXyColor xy轴文字的颜色,包含轴线
lineType setLineType 指定line类型:CURVE / SEGMENT(曲线/线段)
Style setLineStyle 指定line的风格:DASHED / SOLID(虚线/实线)
needEdgeEffect disableEdgeEffect 关闭边缘效果,默认开启
colorEdgeEffect setEdgeEffectColor 指定边缘效果的颜色,默认为Color.GRAY
needClickHint disableClickHint 关闭点击提示信息,默认开启
colorHint setHintColor 设置提示辅助线、文字颜色
maxOfVisible / 一组数据在可见区域中的最大可见点数,至少>=2
countOfY / y轴刻度数,至少>=1
/ setLineSize 设置line在非填充形态时的大小
/ setLineForm 设置line的形态:是否填充,默认为false
/ setCoverLine 设置当line是FILL形态时,是否现在上边框线,默认false

3.填充数据

对于一条line,可以直接调用feed或feedWithAnim方法:

List<Unit> lines = new ArrayList<>();
for (int i = 0; i < 14; i++) {
    lines.add(new Unit(new SecureRandom().nextInt(48), i + ""));
}
suitLines.feedWithAnim(lines);

如果是多条数据,则需要通过Builder来实现:

SuitLines.LineBuilder builder = new SuitLines.LineBuilder();
for (int j = 0; j < count; j++) {
    List<Unit> lines = new ArrayList<>();
    for (int i = 0; i < 50; i++) {
        lines.add(new Unit(new SecureRandom().nextInt(128), "" + i));
    }
    builder.add(lines, new int[]{...});
}
builder.build(suitLines, true);

说明

感谢star或fork,若需要了解具体实现,请直接clone本工程,源码拥有丰富的注释说明。

有任何Bug或建议欢迎提issue或pull request,或者直接 反馈给我.

License

Apache 2.0

suitlines's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

suitlines's Issues

不能自动加载多条线段?

除了按BUTTON点击才能添加线段以外,页面加载完无法自动显示多条线段?如果写在oncreate onresume方法中会报空指针异常,如果写在界面加载完成的监听里只能显示一条(多条),这是什么原因呢?

画多条线时崩溃

Caused by: java.lang.NullPointerException: Attempt to read from field 'float android.graphics.RectF.left' on a null object reference
at tech.linjiang.suitlines.SuitLines.buildPaintColor(SuitLines.java:776)
at tech.linjiang.suitlines.SuitLines.access$1000(SuitLines.java:58)

请教一个问题

你好,我想问下在布局xml中或者在代码中如何设置图表的线段或者线段构成的整个区域的颜色。
我在你的例子中找到的方法是setDefaultOneLineColor(colors);
但是用的过程中发现报了空指针的错误,也许是我把这句代码的位置写错了,分析应该是这个方法执行的时候suitlines对象还没有创建完成吧。
最后我在Activity中的onWindowFocusChanged(boolean hasFocus) 方法中使用setDefaultOneLineColor是可以的,但是总感觉不是很对,请问下正确的使用方式,感谢。

在fragment中画多条线会出现控制针,排除生命周期问题,在onresume方法里使用也是空指针

java.lang.NullPointerException: Attempt to read from field 'float android.graphics.RectF.left' on a null object reference
at tech.linjiang.suitlines.SuitLines.buildPaintColor(SuitLines.java:811)
at tech.linjiang.suitlines.SuitLines.access$1000(SuitLines.java:58)
at tech.linjiang.suitlines.SuitLines$LineBuilder.build(SuitLines.java:1362)
at com.handtv.jbw.clevermediation.view.fragment.HomeFragment.init(HomeFragment.java:183)
at com.handtv.jbw.clevermediation.view.fragment.HomeFragment.initView(HomeFragment.java:156)
at rxfamily.view.BaseFragment.onCreateView(BaseFragment.java:69)
at android.support.v4.app.Fragment.performCreateView(Fragment.java:2192

显示精度问题 百条数据以上 曲线图会变成阶梯状

SuitLines.java 的 calcUnitXY()方法
float scale = new BigDecimal("1").subtract( (new BigDecimal(Float.toString(curValue)) .subtract(new BigDecimal(Float.toString(minAndMaxOfY[0])))) .divide(new BigDecimal(Float.toString(absValueOfY)), 2,BigDecimal.ROUND_DOWN)
在最大数据等于400
当前值为 250 和 249时
1-250/400 =0.375
1-249/400 =0.3775
如果只保留小数到2位 则画出来的高度是一样的 建议多保留几位小数。

提示信息怎么一直停留在哪里?

提示的信息怎么一直停留在 哪里。。现在是点击抬起的时候才显示的。并且都是一闪而过,改那个动画的时间还是不行。不知道修改哪里了。。。怎样才能一直停留在哪里?

偶尔会出现的闪退请款,是什么原因...求大神看看!!

Process: com.lixiangdong.weatherforecast, PID: 15881
java.lang.NullPointerException: Attempt to read from field 'float android.graphics.PointF.y' on a null object reference
at tech.linjiang.suitlines.SuitLines.drawLines(SuitLines.java:660)
at tech.linjiang.suitlines.SuitLines.onDraw(SuitLines.java:437)
at android.view.View.draw(View.java:17077)
at tech.linjiang.suitlines.SuitLines.draw(SuitLines.java:391)
at

private void drawLines(Canvas canvas, int startIndex, int endIndex) {
for (int i = 0; i < paths.size(); i++) {
paths.get(i).reset();
}
for (int i = startIndex; i <= endIndex; i++) {
for (int j = 0; j < datas.size(); j++) {
Unit current = datas.get(j).get(i);
float curY = linesArea.bottom - (linesArea.bottom - current.getXY().y) * current.getPercent(); // 报错包的是这一行代码中的 current.getXY().y
if (i == startIndex) {
paths.get(j).moveTo(current.getXY().x, curY);
continue;
}
if (lineType == SEGMENT) {
paths.get(j).lineTo(current.getXY().x, curY);
} else if (lineType == CURVE) {
// 到这里肯定不是起始点,所以可以减1
Unit previous = datas.get(j).get(i - 1);
// 两个锚点的坐标x为中点的x,y分别是两个连接点的y
paths.get(j).cubicTo((previous.getXY().x + current.getXY().x) / 2,
linesArea.bottom - (linesArea.bottom - previous.getXY().y) * previous.getPercent(),
(previous.getXY().x + current.getXY().x) / 2, curY,
current.getXY().x, curY);
}
if (!needCoverLine && isLineFill() && i == endIndex) {
paths.get(j).lineTo(current.getXY().x, linesArea.bottom);
paths.get(j).lineTo(datas.get(j).get(startIndex).getXY().x, linesArea.bottom);
paths.get(j).close();
}
}
}
drawExsitDirectly(canvas);
}

为什么直接设置4条线就会报空指针~

Caused by: java.lang.NullPointerException: Attempt to read from field 'float android.graphics.RectF.left' on a null object reference
at tech.linjiang.suitlines.SuitLines.buildPaintColor(SuitLines.java:814)
at tech.linjiang.suitlines.SuitLines.access$1000(SuitLines.java:61)
at tech.linjiang.suitlines.SuitLines$LineBuilder.build(SuitLines.java:1375)
at tech.linjiang.suitlines.simple.DemoChartActivity.init(DemoChartActivity.java:139)
at tech.linjiang.suitlines.simple.DemoChartActivity.onCreate(DemoChartActivity.java:32)

体温

这个图表库支持放大缩小不,支持动态刷新数据不(效果是动态心电图)

Implementation in viewPager

Hi @whataa i try to implement the Suitlines in viewPager Adapter which extends PagerAdapter, but it is keep giving me this error:

Caused by: android.view.InflateException: Binary XML file line #0: Error inflating class

Caused by: java.lang.reflect.InvocationTargetException

04-08 15:06:22.370 15856-15856/com.xyz W/System.err: at java.lang.reflect.Constructor.newInstance0(Native Method)

04-08 15:06:22.370 15856-15856/com.xyz W/System.err: at java.lang.reflect.Constructor.newInstance(Constructor.java:430)

04-08 15:06:22.370 15856-15856/com.xyz W/System.err: at android.view.LayoutInflater.createView(LayoutInflater.java:652)

04-08 15:06:22.370 15856-15856/com.xyz W/System.err: at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:794)

04-08 15:06:22.370 15856-15856/com.xyz W/System.err: at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:734)

04-08 15:06:22.371 15856-15856/com.xyz W/System.err: at android.view.LayoutInflater.rInflate(LayoutInflater.java:865)

04-08 15:06:22.371 15856-15856/com.xyz W/System.err: at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:828)

04-08 15:06:22.371 15856-15856/com.xyz W/System.err: at android.view.LayoutInflater.inflate(LayoutInflater.java:525)

04-08 15:06:22.371 15856-15856/com.xyz W/System.err: at android.view.LayoutInflater.inflate(LayoutInflater.java:427)

04-08 15:06:22.371 15856-15856/com.xyz W/System.err: at com.tentwenty.notifyme.adapter.HomeGraphSlideAdapter.instantiateItem(HomeGraphSlideAdapter.java:57)

04-08 15:06:22.371 15856-15856/com.xyz W/System.err: at com.tentwenty.notifyme.adapter.HomeGraphSlideAdapter.instantiateItem(HomeGraphSlideAdapter.java:34)

04-08 15:06:22.371 15856-15856/com.xyz W/System.err: at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:1002)

04-08 15:06:22.371 15856-15856/com.xyz W/System.err: at android.support.v4.view.ViewPager.populate(ViewPager.java:1150)

04-08 15:06:22.371 15856-15856/com.xyz W/System.err: at android.support.v4.view.ViewPager.populate(ViewPager.java:1084)

04-08 15:06:22.371 15856-15856/com.xyz W/System.err: at android.support.v4.view.ViewPager.setAdapter(ViewPager.java:534)

04-08 15:06:22.371 15856-15856/com.xyz W/System.err: at com.tentwenty.notifyme.activity.HomeGraphDetailActivity$GetGraphDataNetworkThread$1.onSuccess(HomeGraphDetailActivity.java:389)

04-08 15:06:22.371 15856-15856/com.xyz W/System.err: at com.loopj.android.http.JsonHttpResponseHandler$1$1.run(JsonHttpResponseHandler.java:152)

04-08 15:06:22.371 15856-15856/com.xyz W/System.err: at android.os.Handler.handleCallback(Handler.java:751)

04-08 15:06:22.371 15856-15856/com.xyz W/System.err: at android.os.Handler.dispatchMessage(Handler.java:95)

04-08 15:06:22.371 15856-15856/com.xyz W/System.err: at android.os.Looper.loop(Looper.java:154)

04-08 15:06:22.371 15856-15856/com.xyz W/System.err: at android.app.ActivityThread.main(ActivityThread.java:6682)

04-08 15:06:22.371 15856-15856/com.xyz W/System.err: at java.lang.reflect.Method.invoke(Native Method)

04-08 15:06:22.371 15856-15856/com.xyz W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)

04-08 15:06:22.371 15856-15856/com.xyz W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)

04-08 15:06:22.372 15856-15856/com.xyz W/System.err: Caused by: java.lang.ClassCastException: android.app.Application cannot be cast to android.app.Activity

04-08 15:06:22.372 15856-15856/com.xyz W/System.err: at com.tentwenty.notifyme.graph.suitlines.SuitLines.(SuitLines.java:82)

04-08 15:06:22.373 15856-15856/com.xyz W/System.err: at com.tentwenty.notifyme.graph.suitlines.SuitLines.(SuitLines.java:0)

Please let me know what i am doing wrong. Thank you.

画图适配

请教一个问题,您是如何处理画图适配屏幕的问题的呢?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.