java - GraphView : rotating horizontal date labels, 指定视口(viewport)的固定大小并将项目符号点与日期标签对齐

标签 java android graph android-graphview

这是一个由 3 部分组成的问题。

1) 首先,是否可以旋转水平 X 值。目前,当我尝试在 X 轴上显示一个月中的所有天(2015 年 4 月 1 日、2015 年 4 月 2 日等)时,它们都会聚集在一起并变得不可读。 有没有办法旋转 X 轴标签使其垂直?

<小时/>

2)要设置视口(viewport),文档建议使用:

graphview.getViewport().setScalable(true);
graphview.getViewport().setScrollable(true);

// To set a fixed manual viewport use this:
// set manual X bounds
graph.getViewport().setXAxisBoundsManual(true);
graph.getViewport().setMinX(0.5);
graph.getViewport().setMaxX(3.5);

// set manual Y bounds
graph.getViewport().setYAxisBoundsManual(true);
graph.getViewport().setMinY(3.5);
graph.getViewport().setMaxY(8);

但是,getViewport().setMinX(...) 函数需要 double 值,而不是日期。 有没有办法滚动视口(viewport)以一次显示 3-5 个日期?

enter image description here

代码2):

GraphView graph = (GraphView) graphView.findViewById(R.id.graph);

DataPoint[] stockArr = new DataPoint[dplist.size()];
stockArr = dplist.toArray(stockArr);

LineGraphSeries<DataPoint> series = new LineGraphSeries<DataPoint>(stockArr);
graph.addSeries(series);
graph.setTitle("TEST GRAPH");

// set date label formatter
graph.getGridLabelRenderer().setLabelFormatter(new DateAsXAxisLabelFormatter(context));

graph.getViewport().setScalable(true);
graph.getViewport().setScrollable(true);
graph.getGridLabelRenderer().setNumHorizontalLabels(data.size()-1); // Approx 28-30

graph.getViewport().setXAxisBoundsManual(true);
graph.getViewport().setMinX(firstDate.getTime());
graph.getViewport().setMaxX(lastDate.getTime());
<小时/>

3) 有没有办法将项目符号点与日期标签对齐?我使用以下代码修改了我的 X 标签。然而,即使在改变之前,要点似乎也没有排列整齐。在下图中,1/1 应该是第一个点,1/2 应该是第二个点,1/3 应该是第三个点。有什么想法吗?

enter image description here

代码3):

graph.getGridLabelRenderer().setLabelFormatter(new DateAsXAxisLabelFormatter(context) {

    @Override
    public String formatLabel(double value, boolean isValueX) {
        if (isValueX) {
            // show normal x values
            Calendar c = Calendar.getInstance();
            // set time in milliseconds
            c.setTimeInMillis(((long)value));
            int mYear = c.get(Calendar.YEAR);
            int mMonth = c.get(Calendar.MONTH);
            int mDay = c.get(Calendar.DAY_OF_MONTH);

            System.out.println((mMonth+1) + "/" + mDay);
            // Return Month/Day
            return (mMonth+1) + "/" + mDay;
            //return super.formatLabel(newDate.toString(), isValueX);
        } else {
            // show currency for y values
            return super.formatLabel(value, isValueX);
        }
    }
});

最佳答案

1) 目前不支持旋转标签。这已经存在一个问题,但我不能说何时实现。您可以在这里观看: https://github.com/jjoe64/GraphView/issues/293

如果您想自己实现它,您将在代码的这一点上执行此操作 - 它应该相对容易: https://github.com/jjoe64/GraphView/blob/master/src/main/java/com/jjoe64/graphview/GridLabelRenderer.java#L934

2) 视口(viewport)需要 double ,如果你想使用日期,你必须通过date.getTime()将日期转换为以毫秒为单位的unix时间纪元。

如果我理解你的意思,你想一次显示 3 天的时间跨度。因此,您必须将水平标签的数量设置为 3,并将视口(viewport)的大小设置为 3 天。应该这样做:

graph.getViewport().setXAxisBoundsManual(true);
graph.getGridLabelRenderer().setNumHorizontalLabels(3);
graph.getViewport().setMinX(firstDate.getTime());
graph.getViewport().setMaxX(firstDate.getTime() + 3*24*60*60*1000); // + 3 days

关于java - GraphView : rotating horizontal date labels, 指定视口(viewport)的固定大小并将项目符号点与日期标签对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28641952/

相关文章:

algorithm - 自动选择图例的比例(线性、幂、对数)

java - 如何配置消息驱动 Bean 应用程序和 Glassfish 以使用来自远程 Message Broker 的消息?

java - 计算数组中随机整数的平均值

java - 无法从锡耶纳另一个对象中的对象获取字符串字段

java - 使用facebook Conceal 解密文件时出现OutOfMemoryException

android - Android 位图出现奇怪的 OutOfMemoryError : Why does showing and then hiding the containing View avoid it?

opengl - OpenGL 绘图库

java - 在 TextField 上失去焦点?

android - TabHost - 如何更改 XML 中的选项卡文本

algorithm - 搜索、排序和图形算法问题