2013-06-20 137 views
0

我正在开发一个Android应用程序,我必须在一个滚动显示中显示多个图。现在,我得到了线条图显示在滚动视图上,我可以很好地滚动它们。但是,平移图表似乎存在问题。平移口吃和变得非常生涩,在实践中几乎无法使用。Achartengine线图滚动滚动查看

现在,我已经设置了renderer.setInScroll(true);和其他一切似乎工作正常(水平平移)。我认为这与滚动视图干扰线图的触摸事件有关,但我仍然对Android自己太新了。

当我用Google搜索,我发现关于类似的问题这个老话题: https://groups.google.com/forum/?fromgroups#!topic/achartengine/j6BIrZ8fm4k该负责人专题说,他这个解决它:HorizontalScrollView within ScrollView Touch Handling但我无法将其应用到Achart。

这是我的测试线图的相关代码。它被设置成LinearLayout中滚动视图(这是一个片段的情况下,这有什么差别)内:短期

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); 

的问题是我怎么能拿平移,以在适当的滚动视图垂直工作?

+0

为什么它必须在scrollview中? –

+0

因为我必须在同一个菜单中显示多个图形,并让用户向下滚动以查看它们。 – Tumetsu

+0

如何在此处绘制可滚动图形...任何想法/建议? – CoDe

回答

0

如果你希望把vertcal滚动视图多个图表,然后你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> 

和图表multirenderer设置应该是这样的。

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);