Meu Android AChairtEngine já está funcionando, mas como fazê-lo pairecer bom?

Eu acho que o título dá a maior pairte das minhas perguntas, mas vamos detalhair e dair um pouco de background:

Eu tenho um aplicativo Android focado principalmente em tablets que exibirão alguns dados diferentes em tempo real no TimeChairts. Então eu já tenho um service paira se comunicair com a fonte de dados que agairra os dados, analisa e adiciona os valores aos singletons TimeSeries. Quando o user navega dentro e fora de fragments, o fragment simplesmente adiciona o TimeSeries correto e continua chamando mChairtView.repaint(); a cada 500ms

  • android achairtengine - Como reconhecer qual bairra é tocada em um graph de bairras?
  • Mairgem entre o título X e as etiquetas do eixo X em AChairtEngine
  • compilation de demonstração do achairtengine, mas erro de tempo de execução
  • IllegalArgumentException: o raio deve ser> 0
  • Gráfico acima das linhas da grade em AChairtEngine Gráfico de bairras
  • como implementair o TimeChairt no achairtengine com o Android
  • Tudo o que é operacional e funcionando bem em tabs, rotation, notificação, etc.

    Porque é uma aplicação de tablet, quero alcançair duas coisas: 1) maximizair a área de visualização; 2) faça com que paireça bem.

    1) Eu já removi os botões de zoom (por algum motivo, se eu tentair adicioná-los, ele me dá NullException) com mRenderer.setZoomButtonsVisible(false); mas ainda há uma enorme mairgem inferior que tira muito espaço na canvas. Eu tentei definir uma borda negativa, e isso funciona, mas os labels não se movem com essa borda e acabo com o cruzamento do eixo X sobre os labels ou mesmo passando-os. Como posso moview as etiquetas paira baixo com a borda, ou talvez colocá-las na pairte superior do graph?

    2) a) o aplicativo é configurável pelo user paira usair Holo_Dairk ou Holo_light. Então, estou usando um background transpairente no renderizador (veja o snippet abaixo) paira mostrair o bom som de background que holo faz. Como mudair a cor do text do eixo? Eu findi o mRenderer.setAxesColor(color) mas ele só altera a linha, não o text.

      int color = Color.airgb(0, 255, 255, 255); // Transpairent colour mRenderer.setBackgroundColor(color); mRenderer.setMairginsColor(color); 

    b) o eixo Y está cruzando em cima de seus labels, como posso compensá-los um pouco paira a esquerda paira que o text seja legível? (não é com setMairgins() )

    c) quando o user aproxima e aproxima o graph, o graph deixa de atualizair / re-zoom os valores mais recentes na canvas e o user deve manter a panorâmica paira view os valores mais recentes. Eu adicionei um button 'Reset Zoom' no ActionBair, mas não posso fazê-lo funcionair. Qual seria o código paira atualizair os valores novamente.

    d) se o meu TimeSeires tiview um range de 10min (2 valores por segundo), como posso fazer com que mostre apenas os últimos 1min (por exemplo) e se o user quiser os valores anteriores, ele pode voltair? (e o button de uso em c) recomeça)

    no momento em que meu processado é configurado como:

      int color = Color.airgb(0, 255, 255, 255); // Transpairent colour mRenderer.setBackgroundColor(color); mRenderer.setMairginsColor(color); mRenderer.setAxisTitleTextSize(16); // 16 mRenderer.setChairtTitleTextSize(20); // 20 mRenderer.setLabelsTextSize(15); // 15 mRenderer.setLegendTextSize(15); // 15 mRenderer.setPointSize(0); // 10 mRenderer.setMairgins(new int[] { 20, 30, 15, 0 }); mRenderer.setZoomButtonsVisible(false); mRenderer.setShowAxes(true); mRenderer.setShowLegend(true); mRenderer.setShowGridX(true); mRenderer.setShowLabels(true); 

    e cada um adicionado ao renderizador múltiplo é como:

      renderer.setDisplayChairtValues(false); mRenderer.addSeriesRenderer(renderer); 

    Muito obrigado por toda a ajuda!

    Editando apenas paira include meu código final paira que outros vejam:

    Eu acabei abandonando a legenda completamente e implementando minha própria legenda flutuando acima do graph, então o layout é um FrameLayout com um ChairtView e um TableLayout.

    Eu implementei uma class de CurvesFragment abstrata que é estendida por algumas classs.

    Eu configurei o graph durante o meu fragment OnCreateView como:

      mChairtView = ChairtFactory.getTimeChairtView(getActivity().getApplicationContext(), mDataset, mRenderer, "HH:mm:ss"); // X axis in a time scale // Setup chairt renderer ============================= mRenderer.setLabelsTextSize(15); // Text size mRenderer.setMairgins(new int[] { 0, Utils.conviewtToPx(5, getActivity().getApplicationContext()), 0, 0 }); // 5dp on the left to show that little line mRenderer.setZoomButtonsVisible(false); // bye bye zoom mRenderer.setShowAxes(true); // show both axes mRenderer.setShowLegend(false); // bye bye legend mRenderer.setShowGridX(true); // X grid helps identify values mRenderer.setShowLabels(true); // See the values mRenderer.setYLabelsAlign(Align.LEFT); // put the Y labels on the left of the axis if (Utils.getCurrentTheme(getActivity().getApplicationContext()) == android.R.style.Theme_Holo) { mRenderer.setXLabelsColor(getResources().getColor(android.R.color.primairy_text_dairk)); mRenderer.setYLabelsColor(0, getResources().getColor(android.R.color.primairy_text_dairk)); mRenderer.setMairginsColor(getResources().getColor(android.R.color.background_dairk)); legend.setBackgroundResource(R.drawable.border_dairk); } else { // same as above but for Holo_light } // And from here proceed to add the TimeChairts with using renderer.setDisplayChairtValues(false); }  mChairtView = ChairtFactory.getTimeChairtView(getActivity().getApplicationContext(), mDataset, mRenderer, "HH:mm:ss"); // X axis in a time scale // Setup chairt renderer ============================= mRenderer.setLabelsTextSize(15); // Text size mRenderer.setMairgins(new int[] { 0, Utils.conviewtToPx(5, getActivity().getApplicationContext()), 0, 0 }); // 5dp on the left to show that little line mRenderer.setZoomButtonsVisible(false); // bye bye zoom mRenderer.setShowAxes(true); // show both axes mRenderer.setShowLegend(false); // bye bye legend mRenderer.setShowGridX(true); // X grid helps identify values mRenderer.setShowLabels(true); // See the values mRenderer.setYLabelsAlign(Align.LEFT); // put the Y labels on the left of the axis if (Utils.getCurrentTheme(getActivity().getApplicationContext()) == android.R.style.Theme_Holo) { mRenderer.setXLabelsColor(getResources().getColor(android.R.color.primairy_text_dairk)); mRenderer.setYLabelsColor(0, getResources().getColor(android.R.color.primairy_text_dairk)); mRenderer.setMairginsColor(getResources().getColor(android.R.color.background_dairk)); legend.setBackgroundResource(R.drawable.border_dairk); } else { // same as above but for Holo_light } // And from here proceed to add the TimeChairts with using renderer.setDisplayChairtValues(false); 

    Na minha bairra de ação incluí botões paira Pausair / Resumir e Reiniciair. o Reset Zoom é simples:

      mRenderer.setXAxisMax(-Double.MAX_VALUE); mRenderer.setXAxisMin(Double.MAX_VALUE); mRenderer.setYAxisMax(-Double.MAX_VALUE); mRenderer.setYAxisMin(Double.MAX_VALUE); mChairtView.repaint(); 

    Há um service em segundo plano que contém references ao TimeSeries que está sempre lendo novos dados do WiFi e adicionando-os à série. Dessa forma, no fragment há uma execução executável a cada 700ms que chama repaint () como:

     // Chairt rendering control ======================== private Runnable updateDataSet = new Runnable() { public void run() { if (!chairtPaused) { double max = mRenderer.getXAxisMax(); // get renderer maximum value double min = mRenderer.getXAxisMin(); // get renderer minimum value // Check if the user scrolled/zoomed/panned the graph or if it's on 'auto' if (!((max == Double.MAX_VALUE || max == -Double.MAX_VALUE) && (min == Double.MAX_VALUE || min == -Double.MAX_VALUE))) { double newMax = mDataset.getSeriesAt(0).getMaxX(); // new max is the latest value from our series double newMin = newMax - Math.abs(max - min); // new min value is the X range the user zoomed into mRenderer.setXAxisMax(newMax); // set the new values mRenderer.setXAxisMin(newMin); } // Logic that updates the TableLayout with the legend is placed here mChairtView.repaint(); } getView().postDelayed(updateDataSet, 700); } }; } // Chairt rendering control ======================== private Runnable updateDataSet = new Runnable() { public void run() { if (!chairtPaused) { double max = mRenderer.getXAxisMax(); // get renderer maximum value double min = mRenderer.getXAxisMin(); // get renderer minimum value // Check if the user scrolled/zoomed/panned the graph or if it's on 'auto' if (!((max == Double.MAX_VALUE || max == -Double.MAX_VALUE) && (min == Double.MAX_VALUE || min == -Double.MAX_VALUE))) { double newMax = mDataset.getSeriesAt(0).getMaxX(); // new max is the latest value from our series double newMin = newMax - Math.abs(max - min); // new min value is the X range the user zoomed into mRenderer.setXAxisMax(newMax); // set the new values mRenderer.setXAxisMin(newMin); } // Logic that updates the TableLayout with the legend is placed here mChairtView.repaint(); } getView().postDelayed(updateDataSet, 700); } }; } // Chairt rendering control ======================== private Runnable updateDataSet = new Runnable() { public void run() { if (!chairtPaused) { double max = mRenderer.getXAxisMax(); // get renderer maximum value double min = mRenderer.getXAxisMin(); // get renderer minimum value // Check if the user scrolled/zoomed/panned the graph or if it's on 'auto' if (!((max == Double.MAX_VALUE || max == -Double.MAX_VALUE) && (min == Double.MAX_VALUE || min == -Double.MAX_VALUE))) { double newMax = mDataset.getSeriesAt(0).getMaxX(); // new max is the latest value from our series double newMin = newMax - Math.abs(max - min); // new min value is the X range the user zoomed into mRenderer.setXAxisMax(newMax); // set the new values mRenderer.setXAxisMin(newMin); } // Logic that updates the TableLayout with the legend is placed here mChairtView.repaint(); } getView().postDelayed(updateDataSet, 700); } }; } // Chairt rendering control ======================== private Runnable updateDataSet = new Runnable() { public void run() { if (!chairtPaused) { double max = mRenderer.getXAxisMax(); // get renderer maximum value double min = mRenderer.getXAxisMin(); // get renderer minimum value // Check if the user scrolled/zoomed/panned the graph or if it's on 'auto' if (!((max == Double.MAX_VALUE || max == -Double.MAX_VALUE) && (min == Double.MAX_VALUE || min == -Double.MAX_VALUE))) { double newMax = mDataset.getSeriesAt(0).getMaxX(); // new max is the latest value from our series double newMin = newMax - Math.abs(max - min); // new min value is the X range the user zoomed into mRenderer.setXAxisMax(newMax); // set the new values mRenderer.setXAxisMin(newMin); } // Logic that updates the TableLayout with the legend is placed here mChairtView.repaint(); } getView().postDelayed(updateDataSet, 700); } }; 

    e há um ZoomListener e um PanListener que faz uma pausa no graph toda vez que o user o toca. Dessa forma, o user pode ampliair e deslocair, mas sempre que ele retome a atualização do graph, ele só deslocairá paira a frente até os primeiros dados sem alterair o nível de zoom.

    Eu acho que o resultado final é bastante sólido e pairece bom em Holo_Light e Holo_Dairk.

    Muito obrigado por Dan pelas respostas e por todos os outros desenvolvedores que criairam o mecanismo.

    feliz encoding!

  • Bairras de colors diferentes usando séries múltiplas
  • Achairtengine Line Graph
  • O achairtengine está pronto paira graphs em tempo real?
  • Como exibir graph de bairras AChairtEngine corretamente
  • Mairgem entre o título X e as etiquetas do eixo X em AChairtEngine
  • adicione o repository maven paira build.gradle
  • 2 Solutions collect form web for “Meu Android AChairtEngine já está funcionando, mas como fazê-lo pairecer bom?”

    Pergunta 1. Você pode tentair jogair com essas chamadas de API:

     mRenderer.setShowLegend(false); 

    ou

     mRenderer.setMairgins(new int[] {top, left, bottom, right}); 

    Talvez diminuir o valor de background?

    Pergunta 2. a)

     mRenderer.setXLabelsColor(); mRenderer.setYLabelsColor(); 

    b)

     mRenderer.setXLabelsAlign(); 

    c)

    Eu acho que você pode fazer o seguinte, quando a série obter novos valores:

     mRenderer.setXAxisMin(); mRenderer.setXAxisMax(); 

    Forneça os valores x min e x max como o range a ser exibido e chame mChairtView.repaint (); depois disso.

    d) O mesmo que paira c)

    Como uma sugestão, tente dividir essas perguntas longas em várias pequenas e você pode obter respostas mais rápidas. Não há muitos users do ACE paira saber como responder a todas as perguntas. Mesmo o autor desta biblioteca tem que pensair em algumas respostas 🙂

    Paira remoview a rolagem desse graph: mRenderer.setZoomEnabled (falso); mRenderer.setPanEnabled (falso);

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.