androidアプリ上に表示したチャート(グラフ)を動的に更新する方法を紹介します。グラフの情報がリアルタイムに変化するアプリなどで活用できます。
Androidでチャート表示する方法
以下記事でAndroidでチャートを扱う方法を紹介しています。
オープンソースライブラリMPAndroidChartを使用しています。
本記事は以下記事の応用にあたるので、まだチャートを扱ったことない方は下記事から読むことを推奨します。
チャート更新のサンプル
本記事では、チャート内要素の値更新、要素の追加、要素の全削除の方法を紹介します。
以下の命名で各関数を作成しました。
- チャート内「要素の数値」を更新:fun changeVal()
- チャート内「要素」を追加:fun addElement()
- チャート内「全要素」を削除:fun resetChart()
上の各関数をボタンクリックなどのイベント等で呼び出すようにしてください。
本記事では線グラフと円グラフを扱います。
(使用頻度が高めで、特色が異なるので)
サンプル:チャート(線グラフ)の場合
XMLは以下の通り。
<!-- Chart:線グラフ --> <com.github.mikephil.charting.charts.LineChart android:id="@+id/chartLine" android:layout_width="match_parent" android:layout_height="200dp" android:layout_margin="10dp"/>
Kotlinは以下の通り。
class MainActivity : AppCompatActivity() { private lateinit var binding : ActivityMainBinding // ランダム値生成用 private val range = (0..10) // 線グラフ用 private lateinit var entryLine:ArrayList<Entry> private lateinit var datasetLine:LineDataSet private lateinit var linedata:LineData override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) val view = binding.root setContentView(view) // チャート表示:線グラフ------------------------------------------- // 手順:①データを用意 ②DataSetにデータ群を入れる ③DataにDatasetを追加 ④チャートのデータにDataを入れる //① entryLine = ArrayList<com.github.mikephil.charting.data.Entry>() //② datasetLine = LineDataSet(entryLine, "Element1") //③ linedata = LineData(datasetLine) //④ binding.chartLine.data = linedata binding.chartLine.setBackgroundColor(Color.rgb(255,255, 200)) } // チャート内数値の変更 fun changeVal(){ // 線グラフ ------------------------------------------ try{ // 最後尾要素の値を更新する entryLine[entryLine.count() - 1] = Entry(entryLine.count().toFloat() - 1, range.random().toFloat()) // DataSet,Data,グラフ表示の更新 datasetLine = LineDataSet(entryLine, datasetLine.label) linedata = LineData(datasetLine) binding.chartLine.data = linedata binding.chartLine.invalidate() }catch(e:java.lang.Exception){ // グラフ内に要素がない } } // チャート内要素数の変更 fun addElement(){ // 線グラフ ------------------------------------------ //linedata.clearValues() // 要素を追加(ランダム値) //entryLine.add(Entry(2f, 9f)) //entryLine.add(Entry(Math.random().toFloat(), Math.random().toFloat())) entryLine.add(Entry(entryLine.count().toFloat(), range.random().toFloat())) Log.d("test", "entryline:"+entryLine[entryLine.count()-1].toString()) datasetLine = LineDataSet(entryLine, "Element1") linedata = LineData(datasetLine) binding.chartLine.data = linedata binding.chartLine.invalidate() } // チャートのリセット fun resetChart(){ Toast.makeText(applicationContext,"fun : Reset Chart", Toast.LENGTH_SHORT).show() // 線グラフ ------------------------------------------ entryLine.clear() datasetLine = LineDataSet(entryLine, "reset") linedata = LineData(datasetLine) binding.chartLine.data = linedata binding.chartLine.invalidate() } }
サンプル:チャート(円グラフ)の場合
<!-- Chart:円グラフ --> <com.github.mikephil.charting.charts.PieChart android:id="@+id/chartPie" android:layout_width="match_parent" android:layout_height="200dp" android:layout_margin="10dp"/>
Kotlinは以下の通り。
class MainActivity : AppCompatActivity() { private lateinit var binding : ActivityMainBinding // ランダム値生成用 private val range = (0..10) // 円グラフ用 private lateinit var entryPie:ArrayList<PieEntry> private lateinit var datasetPie:PieDataSet private lateinit var piedata: PieData // 円グラフの配色用 var eleColors:ArrayList<Int> = ArrayList() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) val view = binding.root setContentView(view) // チャート表示:円グラフ------------------------------------------- // 手順:①データを用意 ②DataSetにデータ群を入れる ③DataにDatasetを追加 ④チャートのデータにDataを入れる //① entryPie = ArrayList<com.github.mikephil.charting.data.PieEntry>() //② datasetPie = PieDataSet(entryPie,"Pie Sample") //③ piedata = PieData(datasetPie) //④ binding.chartPie.data = piedata binding.chartPie.setBackgroundColor(Color.rgb(255,255,200)) } // チャート内数値の変更 fun changeVal(){ // 円グラフ ------------------------------------------ try{ // 最後尾要素の値を更新する entryPie[entryPie.count() - 1] = PieEntry(range.random().toFloat(),"element"+(entryPie.count()).toString()) // DataSet,Data,グラフ表示の更新 datasetPie =PieDataSet(entryPie, datasetPie.label) datasetPie.colors = eleColors piedata = PieData(datasetPie) binding.chartPie.data = piedata binding.chartPie.invalidate() }catch(e:java.lang.Exception){ // グラフ内に要素がない } } // チャート内要素数の変更 fun addElement(){ // 円グラフ ------------------------------------------ entryPie.add(PieEntry(5f,"element"+(entryPie.count()+1).toString())) datasetPie = PieDataSet(entryPie, "Pie Sample") // 色の作成 eleColors.add(Color.rgb(range.random()*25,range.random()*25,range.random()*25)) datasetPie.colors = eleColors piedata = PieData(datasetPie) binding.chartPie.data = piedata binding.chartPie.invalidate() } // チャートのリセット fun resetChart(){ // 円グラフ ------------------------------------------ entryPie.clear() datasetPie = PieDataSet(entryPie,"reset") piedata = PieData(datasetPie) binding.chartPie.data = piedata binding.chartPie.invalidate() eleColors.clear() } }
さいごに
チャートがどんどん更新されるUIは見てて面白いのでうまく活用したいですね。
データをリアルタイムで表示するアプリを作成する際には採用を検討してみてください。
コメント