2017-08-10 8 views
1

私はMPAndroidChartを使っています。すべてをプロットしても問題ありません。私が必要とするのは、SeekBarをチャートの下に置き、SeekBarを動かすことによって異なるポイントを強調表示できるようにすることです。SeekbarをMPAndroidChartのX値に従います

問題は、X値のステップが規則的でなく、線形でないことです(例:[0,19,25,30,33,47,...])。 SeekBarの最大値にポイント数を設定しようとしましたが、ハイライトはSeekBarの位置とほとんど一致しません(画像参照)。

Example

シークバーの位置にMPAndroidChartのハイライトを整列する方法はありますか?


EDIT:は、最も近いx値のためのナイーブ検索方法を含んでいました。これは最善のアプローチではありませんが、それは私にはうまくいきます。

private int getNearestXValue(int progress) { 
    Log.d("PROGRESS", Integer.toString(progress)); 
    int nearestValue = 0; 

    int minimumDistance = Integer.MAX_VALUE; 
    int position = 0; 
    for (Entry entry : mData) { 
     if (Math.abs((int) entry.getX() - progress) < minimumDistance){ 
      minimumDistance = Math.abs((int) entry.getX() - progress); 
      nearestValue = position; 
      position++; 
     } 
    } 

    return nearestValue; 
} 
+0

をonProgressChanged意志x値が線形であればチャートとシークバー一致?もしそうなら、シーカーの進捗状況にx値の代わりにxの索引付けされた位置を使用するのはなぜですか? MPAndroidChartに線を描こうとしているときにx値を取得するためにルックアップを行います。 –

+0

@AngelKoh x値が線形ステップに従うなら、SeekBarが値に従うのを助ける関数を作ることができました。私はあなたの提案を理解していない、x値のステップはかなりランダムなので。 – Minoru

答えて

1

ユーザーがプログレスバーを移動したときに、シークバーを最も近いxValueにスナップすることができます。 (0〜9は0にスナップ、10〜19は19にスナップなど) 次のようになります。次いで、シークバーで

int[] x_value = {0,19,25,30,33,47,..}; 
int maxValue = maxOf(x_value); 
int minValue = minOf(x_value); 

seekbar.setMax(maxValue -minValue); 

リスナー

onProgressChanged(SeekBar seekBar, int progress, boolean fromUser){ 

    if(fromUser){ 
    int x = progress + minValue; 
    //snap progress to the nearest x_value 
    int nearestX = getNearestXValue(x, x_value); 
    seekbar.setProgress(nearestX); 

    updateChartline(nearestX); 
    } 

} 
+0

これはうまくいった!ありがとうございます、@ AngelKoh。私は 'getNearestXValue'メソッドを含むように編集しました。 – Minoru

関連する問題