android - 增加MPAndroidChart条形图中选中列的宽度
解决方案
找到了一种方法。我扩展了 BarChartRenderer 类并覆盖了 drawHighlighted 方法。
public class CustomBarChartRenderer extends BarChartRenderer {
public CustomBarChartRenderer(BarDataProvider chart, ChartAnimator animator, ViewPortHandler viewPortHandler) {
super(chart, animator, viewPortHandler);
}
@Override
public void drawHighlighted(Canvas c, Highlight[] indices) {
for (int i = 0; i < indices.length; i++) {
Highlight h = indices[i];
int index = h.getXIndex();
BarData barData = mChart.getBarData();
for (int j = 0; j < barData.getDataSetCount(); j++) {
IBarDataSet set = barData.getDataSetByIndex(j);
if (set.isVisible() && set.getEntryCount() > 0) {
customDrawDataSet(c, set, j, index);
}
}
}
}
protected void customDrawDataSet(Canvas c, IBarDataSet dataSet, int index, int selectedIndex) {
Transformer trans = mChart.getTransformer(dataSet.getAxisDependency());
mShadowPaint.setColor(dataSet.getBarShadowColor());
float phaseX = mAnimator.getPhaseX();
float phaseY = mAnimator.getPhaseY();
// initialize the buffer
BarBuffer buffer = mBarBuffers[index];
buffer.setPhases(phaseX, phaseY);
buffer.setBarSpace(dataSet.getBarSpace());
buffer.setDataSet(index);
buffer.setInverted(mChart.isInverted(dataSet.getAxisDependency()));
buffer.feed(dataSet);
trans.pointValuesToPixel(buffer.buffer);
// draw the bar shadow before the values
if (mChart.isDrawBarShadowEnabled()) {
for (int j = 0; j < buffer.size(); j += 4) {
if (!mViewPortHandler.isInBoundsLeft(buffer.buffer[j + 2]))
continue;
if (!mViewPortHandler.isInBoundsRight(buffer.buffer[j]))
break;
c.drawRect(buffer.buffer[j], mViewPortHandler.contentTop(),
buffer.buffer[j + 2],
mViewPortHandler.contentBottom(), mShadowPaint);
}
}
// if multiple colors
if (dataSet.getColors().size() > 1) {
for (int j = 0; j < buffer.size(); j += 4) {
mHighlightPaint.setColor(Color.rgb(255, 255, 255));
mHighlightPaint.setAlpha(dataSet.getHighLightAlpha());
if (!mViewPortHandler.isInBoundsLeft(buffer.buffer[j + 2]))
continue;
if (!mViewPortHandler.isInBoundsRight(buffer.buffer[j]))
break;
// Set the color for the currently drawn value. If the index
// is
// out of bounds, reuse colors.
float left = 0f;
float top = 0f;
float right = 0f;
float bottom = 0f;
if( j == (selectedIndex * 4)) {
left = buffer.buffer[j] - 10;
top = buffer.buffer[j + 1];
right = buffer.buffer[j + 2] + 10;
bottom = buffer.buffer[j + 3];
mRenderPaint.setColor(dataSet.getColor(j / 4));
}
else {
left = buffer.buffer[j];
top = buffer.buffer[j + 1];
right = buffer.buffer[j + 2];
bottom = buffer.buffer[j + 3];
mRenderPaint = mHighlightPaint;
}
c.drawRect(left, top, right, bottom, mRenderPaint);
}
} else {
mRenderPaint.setColor(dataSet.getColor());
for (int j = 0; j < buffer.size(); j += 4) {
mHighlightPaint.setColor(Color.rgb(255, 255, 255));
mHighlightPaint.setAlpha(dataSet.getHighLightAlpha());
if (!mViewPortHandler.isInBoundsLeft(buffer.buffer[j + 2]))
continue;
if (!mViewPortHandler.isInBoundsRight(buffer.buffer[j]))
break;
float left = 0f;
float top = 0f;
float right = 0f;
float bottom = 0f;
if( j == (selectedIndex * 4)) {
left = buffer.buffer[j] - 10;
top = buffer.buffer[j + 1];
right = buffer.buffer[j + 2] + 10;
bottom = buffer.buffer[j + 3];
mRenderPaint.setColor(dataSet.getColor(j / 4));
}
else {
left = buffer.buffer[j];
top = buffer.buffer[j + 1];
right = buffer.buffer[j + 2];
bottom = buffer.buffer[j + 3];
mRenderPaint = mHighlightPaint;
}
c.drawRect(left, top, right, bottom, mRenderPaint);
}
}
}
推荐阅读
- angular - 概述在 SSR 中渲染哪个角度组件需要多长时间
- awk - awk:匹配结果的范围
- android - Web rtc、android库、镜子前置摄像头显示
- javascript - 当我在 react native 中使用 expo-app-loading 包时,startAsync 和 onFinish 方法不起作用
- python - FastAPI websocket 连接导致 docker 容器内的 cpu 峰值达到 100%
- python - 函数内的 f 字符串中的问题
- python - 有人可以帮我解决python中的语法错误吗?
- minecraft - 如何修复 MCP 崩溃?
- constraints - Minizinc 对数组和布尔值的基本理解
- c - C中的x*x和(x)*(x)有什么区别?