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}
回答1件
あなたの回答
tips
プレビュー