2012-07-03 1 views
7

タイトルにはほとんどの質問がありますが、詳細を説明して背景を少し入れてみましょう:私のAndroid AChartEngineはすでに動作していますが、それを見栄えの良い方法にするにはどうすればいいですか?

私は主にTimeChartsでいくつかの異なるリアルタイムデータを表示するタブレット向けのAndroidアプリを持っています。だからすでにデータを取得して解析し、その値をSingletons TimeSeriesに追加するデータソースと通信するサービスがあります。ユーザーはフラグメントにおよびフラグメントの外に移動した場合には、単にそれがタブレットだから500msごと

すべてのことが動作して、タブ間でうまく働いて、回転、通知など

で正しいなTimeSeriesを追加し、mChartView.repaint();を呼び出し続けますapp私は2つのことを達成したい:1)表示領域を最大化する; 2)見栄えを良くする。

1)すでにズームボタンを削除しています(何らかの理由で追加しようとすると、NullExceptionが表示されます)mRenderer.setZoomButtonsVisible(false);が表示されていますが、まだ画面のスペースが大きくなっています。私は負の境界線を設定しようとしましたが、それは動作しますが、ラベルはこの境界線で動かず、X軸がラベルを横切ったり、それらを渡したりすることになります。 ラベルを境界線の下に移動するにはどうすればよいですか、またはグラフの上に置くことができますか?

2) a)アプリケーションは、Holo_DarkまたはHolo_lightのいずれかを使用するようにユーザー設定可能です。だから私はレンダラ(下のスニペットを参照してください)透明な背景を使用して、ホロが行う素晴らしい背景の陰影を表示しています。どのように軸のテキストの色を変更するには? mRenderer.setAxesColor(color)が見つかりましたが、テキストだけでなく行が変更されます。

int color = Color.argb(0, 255, 255, 255); // Transparent colour 
    mRenderer.setBackgroundColor(color); 
    mRenderer.setMarginsColor(color); 

b)のY軸は、どのように私は彼らはので、テキストが読める左に少しオフセットすることができ、それのラベルの上に交差していますか? (setMargins()ではない)

c)ユーザがズームしてチャートをパンすると、チャートは最新の値の更新/再ズームを停止し、ユーザはパンニングして最新の値を表示する必要があります。 ActionBarに「Reset Zoom」ボタンを追加しましたが、動作させることはできません。値を再び更新するコードは何でしょうか。

d)私のTimeSeiresの範囲が10分(2値/秒)の場合、最後の1分だけを表示するにはどうしたらいいですか? (C上及び使用ボタン)再スタート)

は、現時点ではと私のレンダリングを設置している:

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

int color = Color.argb(0, 255, 255, 255); // Transparent colour 
    mRenderer.setBackgroundColor(color); 
    mRenderer.setMarginsColor(color); 
    mRenderer.setAxisTitleTextSize(16); // 16 
    mRenderer.setChartTitleTextSize(20); // 20 
    mRenderer.setLabelsTextSize(15); // 15 
    mRenderer.setLegendTextSize(15); // 15 
    mRenderer.setPointSize(0); // 10 
    mRenderer.setMargins(new int[] { 20, 30, 15, 0 });  
    mRenderer.setZoomButtonsVisible(false); 
    mRenderer.setShowAxes(true); 
    mRenderer.setShowLegend(true); 
    mRenderer.setShowGridX(true); 
    mRenderer.setShowLabels(true); 

とレンダリングそれぞれが複数のレンダラに追加は以下のようになりますすべての助けてくれてありがとう!

の編集だけで参照するには他の人のための私の最終的なコードを含める:

私は完全に伝説を捨てると、チャート上に浮い私自身の伝説を実装終わってきたので、レイアウトはChartViewとでframeLayoutですおよびTableLayout。

私はいくつかのクラスによって拡張された抽象的なCurvesFragmentクラスを実装しました。

ように私は私のフラグメントOnCreateView時にチャートを設定します。私は、一時停止/再開とResetZoomためのボタンが含まれ、私のアクションバーで

mChartView = ChartFactory.getTimeChartView(getActivity().getApplicationContext(), mDataset, mRenderer, "HH:mm:ss"); // X axis in a time scale 
    // Setup chart renderer ============================= 
    mRenderer.setLabelsTextSize(15); // Text size 
    mRenderer.setMargins(new int[] { 0, Utils.convertToPx(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.primary_text_dark)); 
     mRenderer.setYLabelsColor(0, getResources().getColor(android.R.color.primary_text_dark)); 
     mRenderer.setMarginsColor(getResources().getColor(android.R.color.background_dark)); 
     legend.setBackgroundResource(R.drawable.border_dark); 
    } else { 
     // same as above but for Holo_light 
    } 
    // And from here proceed to add the TimeCharts with using 
    renderer.setDisplayChartValues(false); 

。 リセットズームは簡単です:常に無線LANからの新鮮なデータを読み取り、シリーズに追加された時系列への参照を保持しているバックグラウンドサービスは

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

あります。その方法は、断片のように)再描画を(呼び出しごとに700msを実行する実行可能があります:

// Chart rendering control ======================== 
private Runnable updateDataSet = new Runnable() { 

    public void run() { 
     if (!chartPaused) { 

      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 

      mChartView.repaint(); 
     } 

     getView().postDelayed(updateDataSet, 700); 
    } 
}; 

とZoomListenerとチャートをユーザが触れるたびに一時停止PanListenerがあります。こうすることで、ユーザーはズームとパンを行うことができますが、チャートの更新を再開するたびに、ズームレベルを変更せずに最も早いデータにスクロールします。

私は最終的な結果がかなりしっかりしており、Holo_LightとHolo_Darkの両方で素晴らしいと思います。

ありがとうa LOT Danの回答とエンジンを作成した他のすべての開発者のためです。

ハッピーコーディング!あなたはこれらのAPI呼び出しを再生しようとすることができます。1.

答えて

14

質問:

mRenderer.setShowLegend(false); 

または

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

たぶん、ボトム値を下げますか?

質問2. A)

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

B)

mRenderer.setXLabelsAlign(); 

C)

私はシリーズは、新しい値を取得するとき、あなたは次のことを行うことができると思います。

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

x minとx maxの値を表示する範囲として指定し、mChartView.repaint();を呼び出します。その後。

d)のCの場合と同じ)の提案として

は、いくつかの小さなもので、このような長い質問に分割してみてください、あなたはより速く答えを得ることができます。すべての質問に答える方法を知っているACEユーザーはあまりいません。このライブラリの作者でさえ、いくつかの答えについて考えなければなりません:)

+1

ハイダン。情報をありがとう。これはエンジニアリングプロジェクトの一部であり、チャートは開発中のマシンのリアルタイムデータです。現時点では、より緊急なものに対処するためにAndroidアプリを中断する必要がありましたが、数日後に戻って、あなたの提案をすべてテストします。 ps。: 'この図書館の著者でさえ、いくつかの答えを考えなければならない:)'あなたのプロフィールをチェックしたので、あなたは作者です。 achartengine自身と答えに感謝します。 – Budius

+0

e)そのグラフのスクロールを解除する場合: mRenderer.setZoomEnabled(false); mRenderer.setPanEnabled(false); – ViJay

1

このグラフのスクロールを削除するには:mRenderer.setZoomEnabled(false); mRenderer.setPanEnabled(false);

関連する問題