こんにちは私は値の代わりに棒グラフのxaxisにアイコンを描画したいと思います。下の図のようにMpChart棒グラフのXaxisにアイコンとしてラベルを描画します
2
A
答えて
6
カスタムレンダラーを作成してチャートに適用する必要があります。ここには大まかな実装があります。
XML
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="250dp"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.sauvik.samplegraphs.MainActivity">
<com.github.mikephil.charting.charts.BarChart
android:id="@+id/chart1"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</RelativeLayout>
活動
public class MainActivity extends AppCompatActivity {
private BarChart mChart;
int val[] = {3, 2, 7, 3, 4, 8};
ArrayList<Bitmap> imageList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_grade);
imageList.add(bitmap);
imageList.add(bitmap);
imageList.add(bitmap);
imageList.add(bitmap);
imageList.add(bitmap);
imageList.add(bitmap);
mChart = (BarChart) findViewById(R.id.chart1);
mChart.setDrawBarShadow(false);
mChart.setDrawValueAboveBar(true);
mChart.getDescription().setEnabled(false);
mChart.setPinchZoom(false);
mChart.setDrawGridBackground(false);
XAxis xAxis = mChart.getXAxis();
xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
xAxis.setDrawGridLines(false);
xAxis.setGranularity(1f);
xAxis.setLabelCount(7);
xAxis.setDrawLabels(false);
YAxis leftAxis = mChart.getAxisLeft();
leftAxis.setAxisLineColor(Color.WHITE);
leftAxis.setDrawGridLines(false);
leftAxis.setPosition(YAxis.YAxisLabelPosition.OUTSIDE_CHART);
leftAxis.setAxisMinimum(0f); // this replaces setStartAtZero(true)
YAxis rightAxis = mChart.getAxisRight();
rightAxis.setEnabled(false);
Legend l = mChart.getLegend();
l.setEnabled(false);
setData();
}
private void setData() {
ArrayList<BarEntry> yVals1 = new ArrayList<BarEntry>();
for (int i = 0; i < val.length; i++) {
yVals1.add(new BarEntry(i, val[i]));
}
BarDataSet set1;
set1 = new BarDataSet(yVals1, "");
set1.setColors(Color.BLUE);
ArrayList<IBarDataSet> dataSets = new ArrayList<IBarDataSet>();
dataSets.add(set1);
BarData data = new BarData(dataSets);
data.setDrawValues(false);
mChart.setData(data);
mChart.setScaleEnabled(false);
mChart.setRenderer(new BarChartCustomRenderer(mChart, mChart.getAnimator(), mChart.getViewPortHandler(), imageList, this));
mChart.setExtraOffsets(0, 0, 0, 20);
}
}
CUSTOMレンダラ
public class BarChartCustomRenderer extends BarChartRenderer {
private Context context;
private ArrayList<Bitmap> imageList;
public BarChartCustomRenderer(BarDataProvider chart, ChartAnimator animator, ViewPortHandler viewPortHandler, ArrayList<Bitmap> imageList, Context context) {
super(chart, animator, viewPortHandler);
this.context = context;
this.imageList = imageList;
}
@Override
public void drawValues(Canvas c) {
List<IBarDataSet> dataSets = mChart.getBarData().getDataSets();
final float valueOffsetPlus = Utils.convertDpToPixel(22f);
float negOffset;
for (int i = 0; i < mChart.getBarData().getDataSetCount(); i++) {
IBarDataSet dataSet = dataSets.get(i);
applyValueTextStyle(dataSet);
float valueTextHeight = Utils.calcTextHeight(mValuePaint, "8");
negOffset = valueTextHeight + valueOffsetPlus;
BarBuffer buffer = mBarBuffers[i];
float left, right, top, bottom;
for (int j = 0; j < buffer.buffer.length * mAnimator.getPhaseX(); j += 4) {
left = buffer.buffer[j];
right = buffer.buffer[j + 2];
top = buffer.buffer[j + 1];
bottom = buffer.buffer[j + 3];
float x = (left + right)/2f;
if (!mViewPortHandler.isInBoundsRight(x))
break;
if (!mViewPortHandler.isInBoundsY(top) || !mViewPortHandler.isInBoundsLeft(x))
continue;
BarEntry entry = dataSet.getEntryForIndex(j/4);
float val = entry.getY();
mValuePaint.setTextAlign(Paint.Align.CENTER);
if (val > 0) {
drawValue(c, dataSet.getValueFormatter(), val, entry, i, x,
(bottom + negOffset),
dataSet.getValueTextColor(j/4));
}
Bitmap bitmap = imageList.get(j/4);
if (bitmap != null) {
Bitmap scaledBitmap = getScaledBitmap(bitmap);
c.drawBitmap(scaledBitmap, x - scaledBitmap.getWidth()/2f, (bottom + 0.5f * negOffset) - scaledBitmap.getWidth()/2f, null);
}
}
}
}
private Bitmap getScaledBitmap(Bitmap bitmap) {
int width = (int) context.getResources().getDimension(R.dimen.dimen_18);
int height = (int) context.getResources().getDimension(R.dimen.dimen_18);
return Bitmap.createScaledBitmap(bitmap, width, height, true);
}
}
RESU LT
あなたはあなた自身のイメージで星を置き換えることができます。
あなたは チェックこのlink
0
をどのように動作するか、カスタムレンダラを知りたい場合は、私はそれを非常に簡単に行う方法を発見した:
は-1に設定された値を別のデータセットを追加し、描画可能を提供そのエントリを作成するときに:new Entry(i, value, icon)
負の値の描画を有効にするには、setStartAtZero(false)
を使用します。 このデータセットをユーザーに見えないようにするには、データセットの色を透明に設定します。
私は、これはかなりハックな解決策だと思いますが、簡単で、コピー貼り付けやリビジョンコードの書き換えが不要なため、更新を簡単に行うことができます。
関連する問題
- 1. 棒グラフと線グラフを描画する
- 2. Chart.js - 複数のラベルを含む棒グラフを描画する
- 3. 棒グラフのラベル
- 4. 横棒グラフD3の棒ラベル
- 5. ggplot2棒グラフのラベルと色
- 6. 棒グラフを描く
- 7. Chart.js棒グラフは、ラベルに基づいてデータをロードします
- 8. Googleグラフ:棒グラフのラベルが逆になっています
- 9. 円グラフと縦棒グラフを1つのページに描画する方法
- 10. JavaFXでGraphicsContextを使用してキャンバスに棒グラフを描画する?
- 11. 棒グラフの棒としてカスタム画像を使用できますか?
- 12. DC.js棒グラフx軸のラベルが棒と揃っていない
- 13. Python Networkxグラフ描画 - タプル内のラベル/値
- 14. d3の棒グラフに要素を描画する
- 15. matlabのデータから棒グラフを描画するには
- 16. plot.ly棒グラフの軸ラベル
- 17. Matlabのラベル付き棒グラフ
- 18. matplotlibとnumpyを使用して画像とラベルを棒グラフとしてプロットする
- 19. データフレームの棒グラフ/円グラフのラベル
- 20. d3横棒グラフにラベルを追加しますか?
- 21. 折れ線グラフは、私はラインプラス棒グラフを描画しようとしているChart.js
- 22. matplotlib棒グラフ(ラベル付き):棒抜き
- 23. 棒グラフの棒グラフの下にオブジェクト名-cのコアプロットを使用してラベル名を設定する方法は?
- 24. 棒グラフにラベルを追加するD3
- 25. ggplot棒グラフにラベルを追加する
- 26. D3棒グラフにラベルを追加する
- 27. ラベルをChartsJS棒グラフに追加する
- 28. d3.jsを使用して棒グラフにラベルを整える
- 29. MPAndroid棒グラフがラベルと整列していない
- 30. ChartJS:棒グラフでクリックしたときのラベルの値を取得
nice answer +1! –
ラインチャートの解決法はありますか? –
@ felipe.rceこれは同じ概念です.LineChartRendererを拡張するクラスを作成する必要があります – amarok