Met*_*soy 11 android mpandroidchart
我正在使用MPAndroid Chart库在我的Android应用程序中绘制折线图.图的状态如下:

我想改变它:

所以我想改变MPAnroid Line Chart的点,在图书馆中称为"圆孔".我想把这个洞换成可画的.我有办法做到这一点吗?
圆孔更改代码在这里:
LineDataSet set1 = new LineDataSet(yVals, "DataSet 1");
set1.setDrawCircleHole( true );
set1.setCircleColor( Color.BLACK );
Run Code Online (Sandbox Code Playgroud)
库参考在这里:MPAndroidChart
Dav*_*son 10
从版本3.0开始,您可以提供自己的自定义图像,该图像将在选择图表上的给定点时显示.以下说明是根据维基
总而言之,您现在可以使用名为的类MarkerImage:
MarkerImage myMarkerImage = new MarkerImage(this, R.drawable.my_drawable);
Run Code Online (Sandbox Code Playgroud)
然后:
myChart.setMarker(myMarkerImage);
Run Code Online (Sandbox Code Playgroud)
要调整图像的位置,您可以调用:
setOffset(float x, float y);
Run Code Online (Sandbox Code Playgroud)
如果你不想使用MarkerView,你可能需要创建自己的子类LineChartRenderer并添加逻辑来绘制自定义高亮显示.
这是一个非常基本的概念证明:
import android.graphics.Bitmap;
import android.graphics.Canvas;
import com.github.mikephil.charting.animation.ChartAnimator;
import com.github.mikephil.charting.charts.LineChart;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.data.LineData;
import com.github.mikephil.charting.highlight.Highlight;
import com.github.mikephil.charting.interfaces.datasets.ILineDataSet;
import com.github.mikephil.charting.renderer.LineChartRenderer;
import com.github.mikephil.charting.utils.Transformer;
import com.github.mikephil.charting.utils.ViewPortHandler;
import java.util.List;
/**
* Created by David on 3/01/2017.
*/
public class ImageLineChartRenderer extends LineChartRenderer {
private final LineChart lineChart;
private final Bitmap image;
public ImageLineChartRenderer(LineChart chart, ChartAnimator animator, ViewPortHandler viewPortHandler, Bitmap image) {
super(chart, animator, viewPortHandler);
this.lineChart = chart;
this.image = image;
}
@Override
public void drawExtras(Canvas c) {
super.drawExtras(c);
Highlight[] highlighted = lineChart.getHighlighted();
if (highlighted == null) return;
float phaseY = mAnimator.getPhaseY();
float[] imageBuffer = new float[2];
imageBuffer[0] = 0;
imageBuffer[1] = 0;
LineData lineData = mChart.getLineData();
List<ILineDataSet> dataSets = mChart.getLineData().getDataSets();
Bitmap[] scaledBitmaps = new Bitmap[dataSets.size()];
float[] scaledBitmapOffsets = new float[dataSets.size()];
for (int i = 0; i < dataSets.size(); i++) {
float imageSize = dataSets.get(i).getCircleRadius() * 10;
scaledBitmapOffsets[i] = imageSize / 2f;
scaledBitmaps[i] = scaleImage((int) imageSize);
}
for (Highlight high : highlighted) {
int dataSetIndex = high.getDataSetIndex();
ILineDataSet set = lineData.getDataSetByIndex(dataSetIndex);
Transformer trans = lineChart.getTransformer(set.getAxisDependency());
if (set == null || !set.isHighlightEnabled())
continue;
Entry e = set.getEntryForXValue(high.getX(), high.getY());
if (!isInBoundsX(e, set))
continue;
imageBuffer[0] = e.getX();
imageBuffer[1] = e.getY() * phaseY;
trans.pointValuesToPixel(imageBuffer);
c.drawBitmap(scaledBitmaps[dataSetIndex],
imageBuffer[0] - scaledBitmapOffsets[dataSetIndex],
imageBuffer[1] - scaledBitmapOffsets[dataSetIndex],
mRenderPaint);
}
}
private Bitmap scaleImage(int radius) {
return Bitmap.createScaledBitmap(image, radius, radius, false);
}
}
Run Code Online (Sandbox Code Playgroud)
像这样消费:
Bitmap starBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.star);
mChart.setRenderer(new ImageLineChartRenderer(mChart, mChart.getAnimator(), mChart.getViewPortHandler(), starBitmap));
Run Code Online (Sandbox Code Playgroud)
说明:drawExtras在LineChartRenderer绘制圆圈时.我们仍然想要这些,所以在我们的drawExtras覆盖中我们称之为超级优先.然后我们为每个DataSet生成一个缩放的位图(DataSet可能有不同的圆半径).我们将位图缩放到任意大小(圆半径的10倍).然后,我们遍历通过渲染器的LineChart字段公开的高光,并绘制相应的位图.
这是一个截图 - 您可以在突出显示的索引上看到'star'位图而不是圆圈:
| 归档时间: |
|
| 查看次数: |
7338 次 |
| 最近记录: |