質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

1回答

3716閲覧

MPAndroidChartでリアルタイム更新したときX軸を時間表示したい

luckyclock

総合スコア73

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2021/12/08 13:46

編集2021/12/09 06:03

MPAndroidChartのRealtimeLineChartActivity.javaをほとんどそのまま使っています。
X軸にリアルタイム時間表示したいのですが、
X軸をValueFormatterで現在時刻を与えるとX軸のラベルが下記のようにすべてが同じ時間になってしまいます。
addEntryはメインアクティビティのスレッドで1秒ごとにコールされます。

現実
データ1  データ2  データ3 データ4
21:00:01 21:00:01 21:00:01 21:00:01 ←1秒ごとに更新されるがラベルが全部同じ現在時間になってしまう。

 理想
データ1  データ2   データ3 データ4
21:00:01  21:00:02 21:00:03 21:00:04 ←更新のたびに古いデータのラベルは変わってほしくない。

createSetメソッド内のLineData dataに同様にValueFormatterをセットしても結果が変わりませんでした。

mpandroidchartバージョンは3.1.0です。

java

1import android.graphics.Color; 2import android.os.Bundle; 3import android.view.LayoutInflater; 4import android.view.View; 5import android.view.ViewGroup; 6import android.widget.TextView; 7 8import androidx.annotation.NonNull; 9import androidx.annotation.Nullable; 10import androidx.fragment.app.Fragment; 11import androidx.lifecycle.Observer; 12import androidx.lifecycle.ViewModelProvider; 13 14import com.example.myapplication.R; 15import com.github.mikephil.charting.charts.LineChart; 16import com.github.mikephil.charting.components.XAxis; 17import com.github.mikephil.charting.components.YAxis; 18import com.github.mikephil.charting.components.YAxis.AxisDependency; 19import com.github.mikephil.charting.data.Entry; 20import com.github.mikephil.charting.data.LineData; 21import com.github.mikephil.charting.data.LineDataSet; 22import com.github.mikephil.charting.formatter.ValueFormatter; 23import com.github.mikephil.charting.interfaces.datasets.ILineDataSet; 24import com.github.mikephil.charting.utils.ColorTemplate; 25 26 27import com.example.myapplication.databinding.FragmentMainBinding; 28 29import java.text.SimpleDateFormat; 30import java.time.format.DateTimeFormatter; 31import java.util.Date; 32 33/** 34 * A placeholder fragment containing a simple view. 35 */ 36public class GraphFragment extends Fragment { 37 38 private static final String ARG_SECTION_NUMBER = "section_number"; 39 40 private PageViewModel pageViewModel; 41 private FragmentMainBinding binding; 42 43 private LineChart chart; 44 45 public static GraphFragment newInstance() { 46 GraphFragment fragment = new GraphFragment(); 47 Bundle bundle = new Bundle(); 48// bundle.putInt(ARG_SECTION_NUMBER, index); 49 fragment.setArguments(bundle); 50 return fragment; 51 } 52 53 @Override 54 public void onCreate(Bundle savedInstanceState) { 55 super.onCreate(savedInstanceState); 56 pageViewModel = new ViewModelProvider(this).get(PageViewModel.class); 57 58 initChart(); 59 } 60 61 @Override 62 public View onCreateView( 63 @NonNull LayoutInflater inflater, ViewGroup container, 64 Bundle savedInstanceState) { 65 66 binding = FragmentMainBinding.inflate(inflater, container, false); 67 View root = binding.getRoot(); 68 chart = root.findViewById(R.id.chart1); 69 return root; 70 } 71 72 @Override 73 public void onDestroyView() { 74 super.onDestroyView(); 75 binding = null; 76 } 77 78 public void initChart(){ 79// chart = findViewById(R.id.chart1); 80 81 // enable description text 82 chart.getDescription().setEnabled(true); 83 84 // enable touch gestures 85 chart.setTouchEnabled(true); 86 87 // enable scaling and dragging 88 chart.setDragEnabled(true); 89 chart.setScaleEnabled(true); 90 chart.setDrawGridBackground(false); 91 92 // if disabled, scaling can be done on x- and y-axis separately 93 chart.setPinchZoom(true); 94 95 // set an alternative background color 96 chart.setBackgroundColor(Color.LTGRAY); 97 98 LineData data = new LineData(); 99 data.setValueTextColor(Color.WHITE); 100 101 // add empty data 102 chart.setData(data); 103 104 XAxis xl = chart.getXAxis(); 105 xl.setTextColor(Color.WHITE); 106 xl.setDrawGridLines(false); 107 xl.setAvoidFirstLastClipping(true); 108 xl.setEnabled(true); 109    //X軸のラベルを時刻にする 110 xl.setValueFormatter(new ValueFormatter() { 111 @Override 112 public String getFormattedValue(float value){ 113 Date date = new Date(); 114 SimpleDateFormat sdf = new SimpleDateFormat("MM:dd:ss"); 115 return sdf.format(date); 116 } 117 }); 118 119 YAxis leftAxis = chart.getAxisLeft(); 120 leftAxis.setTextColor(Color.WHITE); 121 leftAxis.setAxisMaximum(100f); 122 leftAxis.setAxisMinimum(0f); 123 leftAxis.setDrawGridLines(true); 124 125 YAxis rightAxis = chart.getAxisRight(); 126 rightAxis.setEnabled(false); 127 } 128 129 public void addEntry() { 130 LineData data = chart.getData(); 131 132 if (data != null) { 133 134 ILineDataSet set = data.getDataSetByIndex(0); 135 // set.addEntry(...); // can be called as well 136 137 if (set == null) { 138 set = createSet(); 139 data.addDataSet(set); 140 } 141 142 data.addEntry(new Entry(set.getEntryCount(), (float) (Math.random() * 40) + 30f), 0); 143 data.notifyDataChanged(); 144 145 // let the chart know it's data has changed 146 chart.notifyDataSetChanged(); 147 148 // limit the number of visible entries 149 chart.setVisibleXRangeMaximum(120); 150 // chart.setVisibleYRange(30, AxisDependency.LEFT); 151 152 // move to the latest entry 153 chart.moveViewToX(data.getEntryCount()); 154 155 // this automatically refreshes the chart (calls invalidate()) 156 // chart.moveViewTo(data.getXValCount()-7, 55f, 157 // AxisDependency.LEFT); 158 } 159 } 160 161 private LineDataSet createSet() { 162 163 LineDataSet set = new LineDataSet(null, "Dynamic Data"); 164 set.setAxisDependency(AxisDependency.LEFT); 165 set.setColor(ColorTemplate.getHoloBlue()); 166 set.setCircleColor(Color.WHITE); 167 set.setLineWidth(2f); 168 set.setCircleRadius(4f); 169 set.setFillAlpha(65); 170 set.setFillColor(ColorTemplate.getHoloBlue()); 171 set.setHighLightColor(Color.rgb(244, 117, 117)); 172 set.setValueTextColor(Color.WHITE); 173 set.setValueTextSize(9f); 174 set.setDrawValues(false); 175 return set; 176 } 177}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2021/12/08 16:05

> X軸にリアルタイム時間表示したいのですが、X軸をValueFormatterで現在時刻を与えると ~ そのようにコーディングすることでリアルタイムにX軸に時間が表示されるという仕様や情報があるのでしょうか。 それとも「そうすれば表示されるのでは」とご自身でお考えになってやってみたがならなかった…ということでしょうか。
luckyclock

2021/12/09 04:10

参考サイトは data.addXValue(format.format(date)) を使用していますが、現行バージョンだとaddXvalueが使えなくなっています。 旧バージョンでできているので現バージョンでもできるのでは?と考えました。
jimbe

2021/12/09 04:59

お使いのバージョン情報をご質問に追記して頂けますか。
guest

回答1

0

ベストアンサー

古い記事ですが、参考になるでしょうか。

MPAndroidChartを使って「リアルタイム更新のセンサーデータ時系列グラフ」のサンプルを作ってみた


XAxis xl に設定している ValueFormatter の getFormattedValue メソッドにおきまして、パラメータ value を全く使わずに現在時刻をそのまま(文字列化して)返しているのが問題ではないでしょうか。
普通に考えて、このメソッドは X 軸の各ポイントでそのポイントを value として呼ばれるでしょうから、それが常に現在時では X=0 でも X=1 でも x=2 でも・・・全て同じとなるでしょう。
x 軸が例えば特定時刻からの秒数としてデータ(Entry?)が表現されているであれば、まず時刻を保存した上でその時刻に x を秒として加算して文字列化して返す・・・といった処理が必要なのではないかと思います。

投稿2021/12/08 16:17

編集2021/12/09 05:34
jimbe

総合スコア12646

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

luckyclock

2021/12/12 10:59

おっしゃるようにvalueを使わないとダメでした。 getFormattedValue はEntry1回で表示するのラベル分よびだされvalueに応じた時刻を返さないといけないですね。 entryに対応した時刻データを保持して、valueを時刻に変換する処理を作成します。 まだ作りきっていないのですが、一旦ベストアンサーで〆たいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問