【问题标题】:MPAndroidChart: Have one graph mirror the zoom/swipes on a sister graphMPAndroidChart:让一个图形镜像姐妹图形上的缩放/滑动
【发布时间】:2018-09-11 14:05:32
【问题描述】:

我有两张折线图显示了同一时间段内的互补数据。有没有办法将一个图形接收到的任何触摸事件发送到另一个图形?我本质上想要它,以便图表始终显示相同的查看矩形(至少在水平方向上)。因此,如果用户在顶部图形上向左滑动“n”个单位,底部图形将自动向左滚动“n”个单位以匹配。

【问题讨论】:

  • 我也有同样的问题你有答案了吗?
  • 不——不幸的是,我试着摆弄 ontouchlisteners 但它没有用。稍后我可能需要更仔细地研究触摸事件的处理方式 - 但现在我认为这不值得。

标签: android graph charts mpandroidchart


【解决方案1】:

可以使用当前的 MPAndroidChart 版本进行缩放,用于滚动签出或等待我的扩展被合并: https://github.com/PhilJay/MPAndroidChart/pull/545

您需要在主图表上设置一个 OnChartGestureListener,将平移矩阵值复制到从图表:

public class CoupleChartGestureListener implements OnChartGestureListener {

    private Chart srcChart;
    private Chart[] dstCharts;

    public CoupleChartGestureListener(Chart srcChart, Chart[] dstCharts) {
        this.srcChart = srcChart;
        this.dstCharts = dstCharts;
    }

    [...other overrides...]

    @Override
    public void onChartScale(MotionEvent me, float scaleX, float scaleY) {
        //Log.d(TAG, "onChartScale " + scaleX + "/" + scaleY + " X=" + me.getX() + "Y=" + me.getY());
        syncCharts();
    }

    @Override
    public void onChartTranslate(MotionEvent me, float dX, float dY) {
        //Log.d(TAG, "onChartTranslate " + dX + "/" + dY + " X=" + me.getX() + "Y=" + me.getY());
        syncCharts();
    }

    public void syncCharts() {
        Matrix srcMatrix;
        float[] srcVals = new float[9];
        Matrix dstMatrix;
        float[] dstVals = new float[9];

        // get src chart translation matrix:
        srcMatrix = srcChart.getViewPortHandler().getMatrixTouch();
        srcMatrix.getValues(srcVals);

        // apply X axis scaling and position to dst charts:
        for (Chart dstChart : dstCharts) {
            if (dstChart.getVisibility() == View.VISIBLE) {
                dstMatrix = dstChart.getViewPortHandler().getMatrixTouch();
                dstMatrix.getValues(dstVals);
                dstVals[Matrix.MSCALE_X] = srcVals[Matrix.MSCALE_X];
                dstVals[Matrix.MTRANS_X] = srcVals[Matrix.MTRANS_X];
                dstMatrix.setValues(dstVals);
                dstChart.getViewPortHandler().refresh(dstMatrix, dstChart, true);
            }
        }
    }

}

然后像这样设置你的主/从连接:

//
// Couple chart viewports:
//

tripChart.setOnChartGestureListener(new CoupleChartGestureListener(
        tripChart, new Chart[] { powerChart, energyChart }));
powerChart.setOnChartGestureListener(new CoupleChartGestureListener(
        powerChart, new Chart[] { tripChart, energyChart }));
energyChart.setOnChartGestureListener(new CoupleChartGestureListener(
        energyChart, new Chart[] { tripChart, powerChart }));

【讨论】:

  • 这个解决方案就像魅力一样,但唯一的问题是我得到了两个图表的不同值: mChart.getLowestVisibleX() 和 mChart.getHighestVisibleX() 函数。
  • 当我缩放图表缩放不同步多个图表。有什么帮助吗?
【解决方案2】:

您需要将此添加到 CoupleChartGestureListener

    @Override
public void onChartGestureStart(MotionEvent me, ChartTouchListener.ChartGesture lastPerformedGesture) {
    ((BarLineChartTouchListener) srcChart.getOnTouchListener()).stopDeceleration();
    for (Chart dstChart : dstCharts) {
        if (dstChart.getVisibility() == View.VISIBLE) {
            ((BarLineChartTouchListener) dstChart.getOnTouchListener()).stopDeceleration();
        }
    }
}

【讨论】:

    猜你喜欢
    • 2014-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-04
    • 1970-01-01
    • 1970-01-01
    • 2023-01-30
    • 2012-10-21
    相关资源
    最近更新 更多