0

我正在开发一个 Android 应用程序,我必须在一个滚动视图中显示多个图形。现在,我将折线图显示在滚动视图上,并且可以很好地滚动它们。但是,向上或向下平移图表似乎存在问题。平移口吃并且变得非常生涩,在实践中几乎无法使用。

现在,我设置了 renderer.setInScroll(true); 其他一切似乎都可以正常工作(水平平移)。我认为这与滚动视图干扰折线图的触摸事件有关,但我对 Android 还是太陌生,无法自己弄清楚。

当我用谷歌搜索时,我发现了这个关于类似问题的旧主题: https ://groups.google.com/forum/?fromgroups#!topic/achartengine/j6BIrZ8fm4k主题中的人说他用这个解决了这个问题:ScrollView Touch Handling 中的 Horizo​​ntalScrollView但我无法将其应用于 Achart。

这是我的测试折线图的相关代码。它被设置为滚动视图内的线性布局(如果它有任何区别,它位于片段中):

private XYMultipleSeriesDataset getDemoDataset() {
    XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
    final int nr = 80;
    Random r = new Random();
    for (int i = 0; i < SERIES_NR; i++) {
        XYSeries series = new XYSeries("Demo series " + (i + 1));
        for (int k = 0; k < nr; k++) {
            series.add(k, 20 + r.nextInt() % 100);
        }
        dataset.addSeries(series);
    }
    return dataset;
}

private XYMultipleSeriesRenderer getDemoRenderer() {
    XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();
    renderer.setAxisTitleTextSize(12);
    renderer.setChartTitleTextSize(12);
    renderer.setLabelsTextSize(15);
    renderer.setLegendTextSize(15);
    renderer.setPointSize(5f);
    renderer.setMargins(new int[] { 20, 30, 15, 10 });
    XYSeriesRenderer r = new XYSeriesRenderer();
    r.setColor(Color.BLACK);
    r.setPointStyle(PointStyle.POINT);
    r.setFillBelowLine(false);
    r.setFillPoints(true);
    renderer.addSeriesRenderer(r);
    renderer.setInScroll(true);
    setChartSettings(renderer);
    return renderer;
}

private void setChartSettings(XYMultipleSeriesRenderer renderer) 
{
    renderer.setChartTitle("Chart demo");
    renderer.setXTitle("x values");
    renderer.setYTitle("y values");
    renderer.setApplyBackgroundColor(false);
    renderer.setRange(new double[] {0,200,0,200});
    renderer.setFitLegend(false);
    renderer.setAxesColor(Color.BLACK);
    renderer.setMarginsColor(Color.WHITE);
    renderer.setLabelsColor(Color.BLACK);
    renderer.setShowGrid(true);
    renderer.setXAxisMin(0);
    renderer.setXAxisMax(200);
    renderer.setYAxisMin(0);
    renderer.setZoomEnabled(false);
    renderer.setYAxisMax(200);
  }
...
rpmGraph = ChartFactory.getLineChartView(getActivity(), getDemoDataset(), getDemoRenderer());
            LinearLayout layout = (LinearLayout) getActivity().findViewById(R.id.rpmGraph);
            layout.addView(rpmGraph);

简而言之,我如何才能让平移在滚动视图中垂直正常工作?

4

1 回答 1

0

如果您想在垂直滚动视图中放置多个图表,那么您的 xnl 布局应该是这样的

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/rltMainLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/white"
    tools:context=".MainActivity" >

    <ImageView
        android:id="@+id/title"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/bg_ttl_bar"
        android:contentDescription="@string/app_name" />

    <ScrollView
        android:id="@+id/scrlMainLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/title"
        tools:context=".MainActivity" >

        <LinearLayout
            android:id="@+id/chart"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:background="@android:color/white"
            android:orientation="vertical" >

            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@drawable/help_sel"
                android:contentDescription="@string/app_name" />

            <LinearLayout
                android:id="@+id/chart1"
                android:layout_width="fill_parent"
                android:layout_height="300dp"
                android:orientation="vertical" >
            </LinearLayout>

            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@drawable/help_sel"
                android:contentDescription="@string/app_name" />

            <LinearLayout
                android:id="@+id/chart2"
                android:layout_width="fill_parent"
                android:layout_height="300dp"
                android:orientation="vertical" >
            </LinearLayout>

            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@drawable/help_sel"
                android:contentDescription="@string/app_name" />

            <LinearLayout
                android:id="@+id/chart3"
                android:layout_width="fill_parent"
                android:layout_height="300dp"
                android:orientation="vertical" >
            </LinearLayout>

            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@drawable/help_sel"
                android:contentDescription="@string/app_name" />

            <LinearLayout
                android:id="@+id/chart4"
                android:layout_width="fill_parent"
                android:layout_height="300dp"
                android:orientation="vertical" >
            </LinearLayout>
        </LinearLayout>
    </ScrollView>

</RelativeLayout>

你的图表多渲染器设置应该是这样的。

XYMultipleSeriesRenderer mRenderer = new XYMultipleSeriesRenderer();

            double[] range = {0 , 5 , 0 , 5};
            mRenderer.setMargins(marign);
            mRenderer.setAxisTitleTextSize(axisTextSize);
            mRenderer.setChartTitleTextSize(chartTextSize);
            mRenderer.setLabelsTextSize(axisTextSize);
            mRenderer.setLegendTextSize(legendTextSize);
            // multiRenderer.setLegendHeight(40);
            //when we dealing with one bar with one series , it is good to not deal with barSpacing() and setBarWidth()
            //multiRenderer.setBarSpacing(-0.1);
            //multiRenderer.setBarWidth((int)(context.getResources().getDimension(R.dimen.chart_bar_width)));

            //multiRenderer.setBarWidth(50);
            mRenderer.setAxesColor(Color.parseColor("#2c2c2c"));
            mRenderer.setInitialRange(range, 1);
            mRenderer.setXAxisMin(0.4);
            mRenderer.setXAxisMax(6);
            mRenderer.setXLabels(0);
            //multiRenderer.setXAxisMax(15);
            //multiRenderer.setYAxisMin(0);
            mRenderer.setXLabelsAlign(Align.CENTER);
            mRenderer.setYLabelsAlign(Align.RIGHT);

            mRenderer.setPanEnabled(true,false);
            mRenderer.setZoomEnabled(false, false);
            mRenderer.setPanLimits(new double[]{0,18,0,0});
            mRenderer.setApplyBackgroundColor(true);
            mRenderer.setMarginsColor(Color.WHITE);
            mRenderer.setBackgroundColor(Color.argb(0x00, 0x01, 0x01, 0x01));
            //multiRenderer.setMarginsColor(Color.parseColor("#FF000000"));

            mRenderer.setXTitle(getxTItle());
            mRenderer.setYTitle(getyTItle());
            mRenderer.setXLabelsPadding(10);
            mRenderer.setYLabelsPadding(10);
            mRenderer.setXLabelsColor(Color.parseColor("#2c2c2c"));
            mRenderer.setYLabelsColor(0, Color.parseColor("#2c2c2c"));   
            mRenderer.setLabelsColor(Color.parseColor("#2c2c2c"));
            mRenderer.setShowCustomTextGridY(true);
            mRenderer.setGridColor(Color.parseColor("#2c2c2c"));
            mRenderer.setPointSize(20.5f);
            mRenderer.setInScroll(true);
于 2014-03-27T05:37:35.827 回答