gpt4 book ai didi

android - MpChart 在条形图的 X 轴上绘制图标作为标签

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:48:22 28 4
gpt4 key购买 nike

enter image description here您好我想在条形图的 xaxis 中绘制图标而不是值。就像下面的图表

最佳答案

您必须创建自己的自定义渲染器并将其应用于您的图表。这是一个粗略的实现。

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>

Activity

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);

}

}

自定义渲染器

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);
}


}

结果

enter image description here

您可以用自己的图片替换星星。

如果你想知道自定义渲染器是如何工作的检查这个link

关于android - MpChart 在条形图的 X 轴上绘制图标作为标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45114123/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com