2014-04-22 9 views
1

yaxis에서 발생한 것처럼 xaxis 레이블을 자동으로 관리하고 싶습니다.사용자 X 축 관리 - AChartEngine

제 xaxis 레이블에 addTextLabel을 사용합니다.

public class HomeFragment extends Fragment { 

//Development URL 
private static String url = "http://192.168.0.100/jsontraining/production.json"; 

//Y-Values 
private static ArrayList<HashMap<String, ArrayList<Long>>> jsonlist = new ArrayList<HashMap<String, ArrayList<Long>>>(); 
private static HashMap<String, ArrayList<Long>> mapValues = new HashMap<String, ArrayList<Long>>(); 

//Legends 
private static ArrayList<HashMap<String, String>> jsonListString = new ArrayList<HashMap<String, String>>(); 
private static HashMap<String, String> mapValuesText = new HashMap<String,String>(); 

private static ArrayList<String> dateStringArray = new ArrayList<String>(); 

private GraphicalView chartView; 

public HomeFragment(){} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.fragment_home, container, false); 
    new JSONParse().execute(); 
    return rootView; 
} 

@SuppressWarnings("unchecked") 
@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
} 

@Override 
public void onResume() { 
    super.onResume(); 
    jsonlist.clear(); 
    mapValues.clear(); 
} 

private class JSONParse extends AsyncTask<String, String, JSONObject> 
{ 
    private ProgressDialog pDialog; 
    @Override 
    protected void onPreExecute() 
    { 
     super.onPreExecute(); 
     pDialog = new ProgressDialog(getActivity()); 
     pDialog.setMessage("Getting Data ..."); 
     pDialog.setIndeterminate(false); 
     pDialog.setCancelable(true); 
     pDialog.show(); 
    }//End of onPreExecute 

    @Override 
    protected JSONObject doInBackground(String... args) 
    { 
     JSONParser jParser = new JSONParser(); 
     JSONObject json = jParser.getJSONFromUrl(url); 
     return json; 
    }//End of doInBackground 

    @Override 
    protected void onPostExecute(JSONObject json) 
    { 
     pDialog.dismiss(); 
     try 
     { 
      //Fetching Array of Elements 
      JSONArray jsonArray = json.getJSONArray("elements"); 

      //Fetching for TextView 
      //Fetching for Pertamina EP 
      TextView uid; 
      uid = (TextView) getActivity().findViewById(R.id.txtLabel); 
      JSONObject jsonElementsText = jsonArray.getJSONObject(jsonArray.length()-1); 
      String text = jsonElementsText.getString("text"); 
      //Fetching for Date 
      JSONObject jsonObjectXAxis = json.getJSONObject("x_axis"); 
      JSONObject jsonObjectXAxisLabels = jsonObjectXAxis.getJSONObject("labels"); 
      JSONArray jsonArrayXAxisLabels = jsonObjectXAxisLabels.getJSONArray("labels"); 
      for(int i=0;i<jsonArrayXAxisLabels.length();i++) 
      { 
       dateStringArray.add((String) jsonArrayXAxisLabels.getString(i)); 
      } 
      String jsonArrayStringXAxisLabels = (String) jsonArrayXAxisLabels.getString(jsonArrayXAxisLabels.length()-1); 
      //JSON String to Date Format 
      char[] dateChar = jsonArrayStringXAxisLabels.toCharArray(); 
      String day = ""+dateChar[0]+""+dateChar[1]+""; 
      String monthNo = ""+dateChar[3]+""+dateChar[4]+""; 
      if(monthNo.matches("01")) 
      { 
       monthNo="January"; 
      } 
      if(monthNo.matches("01")) 
      { 
       monthNo="January"; 
      } 
      if(monthNo.matches("02")) 
      { 
       monthNo="February"; 
      } 
      if(monthNo.matches("03")) 
      { 
       monthNo="March"; 
      } 
      if(monthNo.matches("04")) 
      { 
       monthNo="April"; 
      } 
      if(monthNo.matches("05")) 
      { 
       monthNo="May"; 
      } 
      if(monthNo.matches("06")) 
      { 
       monthNo="June"; 
      } 
      if(monthNo.matches("07")) 
      { 
       monthNo="July"; 
      } 
      if(monthNo.matches("08")) 
      { 
       monthNo="August"; 
      } 
      if(monthNo.matches("09")) 
      { 
       monthNo="September"; 
      } 
      if(monthNo.matches("10")) 
      { 
       monthNo="October"; 
      } 
      if(monthNo.matches("11")) 
      { 
       monthNo="November"; 
      } 
      if(monthNo.matches("12")) 
      { 
       monthNo="December"; 
      } 
      Time today = new Time(Time.getCurrentTimezone()); 
      today.setToNow(); 
      int year = today.year; 
      //Fetching for Number 
      JSONArray jsonArrayValues = jsonElementsText.getJSONArray("values"); 
      Long arrayValuesMax = jsonArrayValues.getLong(jsonArrayValues.length()-1); 

      //Fetching to Text View 
      //uid.setText("Total produksi minyak "+text+", "+day+" "+monthNo+" "+year+" = "+arrayValuesMax+" BBLs"); 
      uid.setText(Html.fromHtml("Total produksi minyak <b>"+text+"</b>, "+day+" "+monthNo+" "+year+" = <b>"+NumberFormat.getNumberInstance(Locale.GERMAN).format(arrayValuesMax)+"</b> BBLs")); 
      JSONObject jsonYAxis = json.getJSONObject("y_axis"); 
      Long yAxisMin = jsonYAxis.getLong("min"); 
      Long yAxisMax = jsonYAxis.getLong("max"); 

      for (int i=0;i<jsonArray.length();i++) 
      { 
       ArrayList<Long> list = new ArrayList<Long>(); 
       HashMap<String, ArrayList<Long>> mapValues = new HashMap<String, ArrayList<Long>>(); 
       JSONObject elementNo = (JSONObject) jsonArray.get(i); 
       JSONArray valuesGraph = (JSONArray) elementNo.get("values"); 
       String texts = elementNo.getString("text"); 

       int len = valuesGraph.length(); 
       for (int x=0;x<len;x++) 
       { 
        if(!valuesGraph.isNull(x)) 
        { 
         Long nilai = (Long)valuesGraph.getLong(x); 
         list.add(nilai); 
        } 
       } 
       mapValues.put("Values", list); 
       mapValuesText.put("Text", texts); 

       jsonlist.add(mapValues); 
       jsonListString.add(mapValuesText); 
      } 

      //Line Graph 
      XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset(); 

      XYMultipleSeriesRenderer mRenderer = new XYMultipleSeriesRenderer(); 

      mRenderer.setApplyBackgroundColor(true); 
      mRenderer.setBackgroundColor(Color.rgb(254, 254, 254)); 
      mRenderer.setMarginsColor(Color.rgb(254, 254, 254)); 



      int[] x = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31}; 

      for(int start=0; start<jsonlist.size(); start++) 
      { 
       start++; 
       mapValuesText = jsonListString.get(start-1); 
       TimeSeries series = new TimeSeries(mapValuesText.get("Text").trim()); 
       start--; 
       mapValues = jsonlist.get(start); 
       int jumlahValues = mapValues.get("Values").size(); 

       for(int i=0; i<jumlahValues; i++) 
       { 
        series.add(x[i], mapValues.get("Values").get(i)); 
       } 
       dataset.addSeries(series); 
       XYSeriesRenderer renderer = new XYSeriesRenderer(); 
       renderer.setShowLegendItem(true); 
       renderer.setChartValuesTextSize(24); 
       renderer.setColor(Color.rgb(0,108,183)); 
       renderer.setLineWidth(3); 
       renderer.setPointStyle(PointStyle.CIRCLE); 
       renderer.setFillPoints(true); 
       //renderer.setDisplayChartValues(true); 
       mRenderer.addSeriesRenderer(renderer); 
      } 



      //XY Titles 
      mRenderer.setYTitle("Production"); 
      //mRenderer.setXTitle("Date"); 
      mRenderer.setAxisTitleTextSize(22); 
      mRenderer.setLabelsTextSize(22); 
      mRenderer.setXLabelsColor(Color.BLACK); 
      mRenderer.setYLabelsColor(0, Color.BLACK); 
      mRenderer.setShowLabels(true); 

      //Legends 
      mRenderer.setShowLegend(true); 
      //mRenderer.setFitLegend(true); 
      mRenderer.setLegendTextSize(20); 
      mRenderer.setXLabelsPadding(20); 

      mRenderer.setYLabelsAlign(Align.RIGHT, 0); 
      mRenderer.setYLabelsPadding(7); 
      mRenderer.setYLabelsVerticalPadding(-5); 

      if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) 
      { 
       for (int i = 0; i < jsonArrayXAxisLabels.length();) 
       { 
        String xChartDates = jsonArrayXAxisLabels.getString(i); 
        mRenderer.addTextLabel(i+1, xChartDates); 
        if(mapValues.get("Values").size()<9) 
        { 
         i=i+1; 
        } 
        else 
        { 
         i=i+4; 
        } 
       } 
       mRenderer.setXLabelsAlign(Align.CENTER); 
       mRenderer.setXLabels(0); 
      } else { 
       for (int i = 0; i < jsonArrayXAxisLabels.length(); i++) 
       { 
        String xChartDates = jsonArrayXAxisLabels.getString(i); 
        mRenderer.addTextLabel(i+1, xChartDates); 
       } 
       mRenderer.setXLabelsAlign(Align.CENTER); 
      } 

      mRenderer.setAxesColor(Color.BLACK); 
      mRenderer.setLabelsColor(Color.BLACK); 
      mRenderer.setMargins(new int[]{ 10, 110, 10, 10}); 
      mRenderer.setYAxisMax(yAxisMax); 
      mRenderer.setYAxisMin(yAxisMin); 
      mRenderer.setXAxisMin(0); 
      mRenderer.setXAxisMax(jsonArrayXAxisLabels.length()); 
      mRenderer.setRange(new double[] { 0, jsonArrayXAxisLabels.length(), yAxisMin, yAxisMax }); 
      mRenderer.setPointSize(9.5f); 
      //mRenderer.setPanLimits(new double[]{0, (jsonArrayXAxisLabels.length())*1.1, yAxisMin, yAxisMax}); 
      mRenderer.setInScroll(true); 
      mRenderer.setClickEnabled(true); 
      mRenderer.setZoomButtonsVisible(true); 

      //Grid 
      mRenderer.setShowGrid(true); 
      //mRenderer.setShowGridX(true); 
      //mRenderer.setShowGridY(true); 
      //mRenderer.setXLabels(4); 
      mRenderer.setShowCustomTextGrid(true); 
      mRenderer.setGridColor(Color.rgb(162,172,186)); 

      if(chartView!=null) 
      { 
       chartView.repaint(); 
      } 
      else{ 
       chartView = ChartFactory.getLineChartView(getActivity(), dataset, mRenderer); 
       //chartView.repaint(); 

       //layout.addView(chartView, new LayoutParams(960,LayoutParams.FILL_PARENT)); 

      } 

      chartView.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        SeriesSelection seriesSelection = chartView.getCurrentSeriesAndPoint(); 
        double[] xy = chartView.toRealPoint(0); 

        if (seriesSelection == null) 
        { 
        //Toast.makeText(getActivity(), "No chart element was clicked", Toast.LENGTH_SHORT).show(); 
        } else { 
         /* 
        Toast.makeText(
          getActivity(), 
         "Chart element in series index " + seriesSelection.getSeriesIndex() 
          + " data point index " + seriesSelection.getPointIndex() + " was clicked" 
          + " closest point value X=" + seriesSelection.getXValue() + ", Y=" + seriesSelection.getValue() 
          + " clicked point value X=" + (float) xy[0] + ", Y=" + (float) xy[1], Toast.LENGTH_SHORT).show();*/ 
        Long values = (long) seriesSelection.getValue(); 
        mapValuesText = jsonListString.get(seriesSelection.getSeriesIndex()); 
        int xValue = (int)seriesSelection.getXValue()-1; 

        Toast.makeText(getActivity(), "Total produksi minyak "+mapValuesText.get("Text")+", "+dateStringArray.get(xValue)+" = " 
          +NumberFormat.getNumberInstance(Locale.GERMAN).format(values) 
          +" BBLs", Toast.LENGTH_LONG).show(); 
        } 
       } 
       }); 

      LinearLayout layout = (LinearLayout) getActivity().findViewById(R.id.dashboard_chart_layout); 
      layout.removeAllViews(); 
      layout.addView(chartView); 

     } catch (JSONException e) 
     { 
     e.printStackTrace(); 
     } 
    }//End of doInBackground 

}//End of AsyncTask 

그건 내 코드입니다. 이것은 처음로드 될 때 일어난 일입니다.

enter image description here

그런 다음이 내가 그래프를 축소하려고 할 때 무슨 일이 있었는지입니다.

enter image description here

당신은 저를 x 축 레이블을 관리하는 방법을 찾는 데 도움이 될 수 있을까요?

도움 주셔서 감사합니다.

답변

0

panApplied 및 zoomApplied 이벤트를 수신하고 이에 따라 사용자 정의 텍스트 레이블을 업데이트 할 수 있습니다.

// an example of handling the zoom events on the chart 
mChartView.addZoomListener(new ZoomListener() { 
    public void zoomApplied(ZoomEvent e) { 
    String type = "out"; 
    if (e.isZoomIn()) { 
     type = "in"; 
    } 
    Log.i("Zoom", "Zoom " + type + " rate " + e.getZoomRate()); 
    } 

    public void zoomReset() { 
    Log.i("Zoom", "Reset"); 
    } 
}, true, true); 

// an example of handling the pan events on the chart 
mChartView.addPanListener(new PanListener() { 
    public void panApplied() { 
    Log.i("Pan", "New X range=[" + mRenderer.getXAxisMin() + ", " + mRenderer.getXAxisMax() + "], Y range=[" + mRenderer.getYAxisMax() + ", " + mRenderer.getYAxisMax() + "]"); 
    } 
}); 
+0

통찰력을 가져 주셔서 감사합니다. 그러나, 내가 이것을 넣을 때. mRenderer.setPointSize (10.0f); chartView.repaint(); chartView.refreshDrawableState(); on zoomApplied, 아무 것도 변경되지 않았습니다. 조각이나 활동을 시작하지 않고 그래프를 다시 그리거나 다시 그려달라고 할 수 있습니까? – flamio

관련 문제