【问题标题】:Slow Drawing of Bar Chart in AChartEngineAChartEngine中的条形图绘制慢
【发布时间】:2012-09-28 08:26:44
【问题描述】:

我正在开发一个 android 应用程序并使用 AChartEngine 作为图表库。我希望当绘制条形图时它会缓慢绘制,这样它会给我们一种外观和感觉,它正在使用某种动画进行绘制。如何实现这种行为?

   values.add(0, InCycleDuration);
    values.add(1, UnknownDowntimeDuration);
    int[] colors = new int[EqSDLenght] ;
     colors[0] = Color.parseColor("#008000");
    colors[1] = Color.parseColor("#FFFF00");





              for(int j = EqSDLenght - 1 ; j >= 0;j--)
              {

              if(EquipmentRKey[j].equals("EquipmentStatusTypeName.UnknownDowntime"))
                 {

                  titles [j] =  "Unknown Downtime" ;

                 }

                 if(EquipmentRKey[j].equals("EquipmentStatusTypeName.InCycle"))
                 {

                      titles [j] =  "In Cycle" ;
                 }
               }

             renderer = buildBarRenderer(colors);
            setChartSettings(renderer, "Comparison Chart", "", "Total Time Consumed", 0,
                6, 0, 100, Color.DKGRAY, Color.DKGRAY);
            for(int i=0 ; i < titles.length; i++)
            {
                x.add(new double[]{ 1,2,3,4,5});
            }

            for(int i=0;i<name.length;i++)
            {
                renderer.addTextLabel(i+1, name[i]);

            }


            renderer.setXLabels(0);

            renderer.setLabelsTextSize(12);

            renderer.getSeriesRendererAt(0).setDisplayChartValues(false);
            renderer.getSeriesRendererAt(1).setDisplayChartValues(false);
            renderer.setShowGridX(true);
            renderer.setGridColor(Color.parseColor("#359ACD32"));
            final int orientation = this.getResources().getConfiguration().orientation;
            if (orientation == Configuration.ORIENTATION_PORTRAIT)   
            {
            renderer.setYLabels(11);
            }
            if (orientation == Configuration.ORIENTATION_LANDSCAPE)   
            {
            renderer.setYLabels(6);
            }
            renderer.setXLabelsAlign(Align.CENTER);
            renderer.setYLabelsAlign(Align.CENTER);
            renderer.setXLabelsColor(Color.DKGRAY);
            renderer.setYLabelsColor(0, Color.DKGRAY); 
            renderer.setPanEnabled(false, false);
            renderer.setZoomRate(1.1f);
            renderer.setBarSpacing(0.8f);
            renderer.setMargins( new int []{55, 40, 35, 30});
            renderer.setApplyBackgroundColor(true);

            renderer.setBackgroundColor(Color.WHITE);
            renderer.setMarginsColor(Color.WHITE);    
            renderer.setLegendHeight(40);

            renderer.setChartTitleTextSize(30);
            renderer.getXTextLabelLocations();
            renderer.setClickEnabled(true);


            mChartView =  ChartFactory.getBarChartView(SalesBar.this, buildBarDataset(titles, values), renderer,
                org.achartengine.chart.BarChart.Type.STACKED);

           layout.addView(mChartView, LayoutParams.FILL_PARENT , LayoutParams.FILL_PARENT);
             renderer.setSelectableBuffer(100);

             mChartView.setOnTouchListener(new OnTouchListener() {

                    public boolean onTouch(View v, MotionEvent event) {
                         if (MotionEvent.ACTION_DOWN == event.getAction()) {
                            xaxis =  event.getRawX();
                                yaxis =  event.getRawY(); 
                              xx = (int) xaxis;
                            yy = (int) yaxis;
                        } else if (MotionEvent.ACTION_UP == event.getAction()) {
                            xaxis =  event.getX();
                              yaxis =  event.getY(); 
                              xx = (int) xaxis;
                            yy = (int) yaxis;
                        }
                        else{}


                        return false;
                    }
                });


             mChartView.setOnClickListener(new View.OnClickListener() {
                 Toast test;
                public void onClick(View v) {
                  SeriesSelection seriesSelection = mChartView.getCurrentSeriesAndPoint();




                  if (seriesSelection != null) {


                      int status_index = seriesSelection.getSeriesIndex();
                      int equipment_index = seriesSelection.getPointIndex();
                      double duration_value = seriesSelection.getValue();

                      if(status_index == 0)
                      {
                          if(equipment_index == 0)
                          {
                              duration_value = EquipmentHoursDuration[0][1];
                          }
                          if(equipment_index == 1)
                          {
                              duration_value = EquipmentHoursDuration[1][1];
                          }
                          if(equipment_index == 2)
                          {
                              duration_value = EquipmentHoursDuration[2][1];
                          }
                          if(equipment_index == 3)
                          {
                              duration_value = EquipmentHoursDuration[3][1];
                          }
                          if(equipment_index == 4)
                          {
                              duration_value = EquipmentHoursDuration[4][1];
                          }
                          String final_status = titles[status_index];
                         String final_equipment = EquipmentNamePartial[equipment_index];
                        test = Toast.makeText(
                                SalesBar.this,
                                  "Status: " + final_status + '\n'
                                + "Equipment: " + final_equipment + '\n'
                                + "Duration: " + duration_value + " hours", Toast.LENGTH_SHORT);
                       ((TextView)((LinearLayout)test.getView()).getChildAt(0))
                      .setGravity(Gravity.LEFT);

                         test.setGravity(Gravity.TOP|Gravity.LEFT, xx, yy);

                          test.show();
                      }

                      else
                      {
                     String final_status = titles[status_index];
                     String final_equipment = EquipmentNamePartial[equipment_index];
                     if(equipment_index == 0)
                  {
                      duration_value = EquipmentHoursDuration[0][0];
                  }
                  if(equipment_index == 1)
                  {
                      duration_value = EquipmentHoursDuration[1][0];
                  }
                  if(equipment_index == 2)
                  {
                      duration_value = EquipmentHoursDuration[2][0];
                  }
                  if(equipment_index == 3)
                  {
                      duration_value = EquipmentHoursDuration[3][0];
                  }
                  if(equipment_index == 4)
                  {
                      duration_value = EquipmentHoursDuration[4][0];
                  }



                    test = Toast.makeText(
                            SalesBar.this,
                              "Status: " + final_status + '\n'
                            + "Equipment: " + final_equipment + '\n'
                            + "Duration: " + duration_value + " hours", Toast.LENGTH_SHORT);


                         test.setGravity(Gravity.TOP|Gravity.LEFT, xx, yy);
                        ((TextView)((LinearLayout)test.getView()).getChildAt(0))
                          .setGravity(Gravity.LEFT);

                          test.show();
                      }
                  }
                }
              });

    protected XYMultipleSeriesRenderer buildBarRenderer(int[] colors) {
                XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();
                renderer.setAxisTitleTextSize(16);
                renderer.setChartTitleTextSize(20);
                renderer.setLabelsTextSize(15);
                renderer.setLegendTextSize(15);
                int length = colors.length;
                for (int i = 0; i < length; i++) {
                  SimpleSeriesRenderer r = new SimpleSeriesRenderer();
                  r.setColor(colors[i]);
                  renderer.addSeriesRenderer(r);
                }
                return renderer;
              }


    protected void setChartSettings(XYMultipleSeriesRenderer renderer, String title, String xTitle,String yTitle, double xMin, double xMax, double yMin, double yMax, int axesColor, int labelsColor) {
                renderer.setChartTitle(title);
                renderer.setXTitle(xTitle);
                renderer.setYTitle(yTitle);
                renderer.setXAxisMin(xMin);
                renderer.setXAxisMax(xMax);
                renderer.setYAxisMin(yMin);
                renderer.setYAxisMax(yMax);
                renderer.setAxesColor(axesColor);
                renderer.setLabelsColor(labelsColor);
              }

          protected XYMultipleSeriesDataset buildBarDataset(String[] titles, List<double[]> values) {
                XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
                int length = titles.length;
                for (int i = 0; i < length; i++) {
                  CategorySeries series = new CategorySeries(titles[i]);
                  double[] v = values.get(i);
                  int seriesLength = v.length;
                  for (int k = 0; k < seriesLength; k++) {
                    series.add(v[k]);
                  }
                  dataset.addSeries(series.toXYSeries());
                }

                return dataset;
              }
}

【问题讨论】:

标签: java android bar-chart achartengine stackedbarseries


【解决方案1】:

您可以使用一些值显示初始视图,然后逐渐更改这些值,直到它们达到最终值。在此期间,您将使用新值修改数据集并在确实会休眠 100 毫秒左右的单独线程中调用 mChartView.repaint()

应该很简单:

new Thread(new Runnable() {
  public void run() {
    while (!stopped) {
      try {
        Thread.sleep(100);
      } catch (Exception e) {
        // ignore
      }
      // modify the contents of your series here
      ...
      mChartView.repaint();
    }
  }
}).start();

【讨论】:

  • 感谢丹的回复,如果我向您展示我的代码,您能告诉我如何在代码中做到这一点吗??
  • ok @Dan 我已将代码添加到问题中。请给它你的机会,谢谢......感谢你总是试图帮助我的事实:)
  • 通过修改系列内容你的意思是我应该更新我的标题、颜色和值?
  • 看一下 buildBarDataset() 方法。您必须在此处更改条形的值,例如它们可能看起来像在移动。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-19
  • 1970-01-01
相关资源
最近更新 更多