あるAndroidアプリ開発で、AChartEngineを使用していたのですが、スクロールすると、いきなりグラフの線が消えて、プロットだけの表示になってしまう問題が発生してました。
解決にちょっと苦戦したので、メモしておきます。
最初は、安定のStack Overflowを見て、こうすればいいのかとやってみたけどうまくいきませんでした。詳しくは以下のURLを参照してください。android:hardwareAccelerated="false"
、View.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
AchartEngine when zooming in linechart lines dissapear - Stack Overflow
これ以外の、解決方法がなかなか見つからずにけっこう悩んでましたが、ちょっと意外な場所が原因でした。
本アプリでは
//changeRenderingModeメソッド
protected XYMultipleSeriesDataset dataset;
XYSeries newSeries = new XYSeries(title);
dataset.addSeries(newSeries);
のようにしてdatasetにXYseriesのオブジェクトを入れていたのですが、これだとグラフに描画されていないときには、周りの文字サイズ等のプロパティは適応されません。だから
//changeRenderingModeメソッド
protected XYMultipleSeriesDataset dataset;
XYSeries newSeries = new XYSeries(title);
newSeries.add(1, 1);
dataset.addSeries(newSeries);
みたいな感じで初期値を追加していました。ちなみにchangeRenderingModeメソッドはグラフのモードを切り替えるメソッドです。
グラフ線が消えるのは、これが原因だったみたいです。。。
最初に追加したものはグラフ生成前にちゃんと消さないと、グラフのプロットが2つ被ってしまい、おかしな挙動をしてしまうみたいです。(消さないでも0.01とかにしても大丈夫です。被らなければ。ただ点が重なって気持ち悪いです。)
詳しい原因はちょっと分かっていませんが、これをグラフ生成前に消すことで解決しました。
今回は開始ボタンを押すと動的にグラフが描画されて、スピナーで複数のグラフや測定データを切り替えたりしていのたで以下の様な感じにしました。
selectedGraph.clearData();
@Override
public void clearData(){
if( this.dataset.getSeries().length > 0 ) {
this.dataset.getSeriesAt(0).clear();
}
}
selectedGraphにはインタフェースの型をもつオブジェクトが入っています。で、状態によって切り替えてる感じです。
とりあえずメモ。