7

タイトルは私の質問のほとんどを伝えていると思いますが、詳細と背景を少し説明しましょう。

TimeCharts にいくつかの異なるリアルタイム データを表示する、主にタブレットに焦点を当てた Android アプリがあります。したがって、データを取得して解析し、値をシングルトン TimeSeries に追加するデータ ソースと通信するサービスが既にあります。ユーザーがフラグメントの内外をナビゲートすると、フラグメントは正しい TimeSeries を追加し、500 ミリ秒mChartView.repaint();ごとに呼び出し続けます。

すべてが操作可能で、タブ、ローテーション、通知などでうまく機能しています。

タブレット アプリなので、次の 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 に [ズームのリセット] ボタンを追加しましたが、機能しません。値を再度更新するためのコードは何でしょうか。

d) TimeSeires の範囲が 10 分 (1 秒あたり 2 つの値) の場合、(たとえば) 最後の 1 分のみを表示するにはどうすればよいですか? (および c) 再起動の使用ボタン)

現時点では、私のレンダリングは次のように設定されています:

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

Multiple renderer に追加された各レンダリングは次のようになります。

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

すべての助けに感謝します!

他の人が見られるように私の最終的なコードを含めるためだけに編集します:

凡例を完全に捨てて、グラフの上に浮かぶ独自の凡例を実装することになったので、レイアウトは ChartView と TableLayout を持つ FrameLayout です。

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

フラグメントの OnCreateView 中にチャートを次のように構成します。

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

私のアクション バーには、一時停止/再開と ResetZoom のボタンが含まれています。ズームのリセットは簡単です。

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

常に WiFi から新しいデータを読み取り、シリーズに追加する TimeSeries への参照を保持するバックグラウンド サービスがあります。そのようにして、フラグメントには、次のように repaint() を呼び出す 700 ミリ秒ごとに実行される実行可能ファイルがあります。

// 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 の両方で見栄えが良いと思います。

答えてくれたダンと、エンジンを作成した他のすべての開発者に感謝します。

ハッピーコーディング!

4

2 に答える 2

14

質問 1. 次の API 呼び出しを試すことができます。

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 最小値と x 最大値を指定し、mChartView.repaint(); を呼び出します。その後。

d) c)と同じ

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

于 2012-07-09T07:35:46.607 に答える