效果圖
代碼
自定義MarkerView
public class CustomMPLineChartMarkerView extends MarkerView { private final int DEFAULT_INDICATOR_COLOR = 0xffFD9138;//指示器默認的顏色 private final int ARROW_HEIGHT = dp2px(5); // 箭頭的高度 private final int ARROW_WIDTH = dp2px(10); // 箭頭的寬度 private final float ARROW_OFFSET = dp2px(2);//箭頭偏移量 private final float BG_CORNER = dp2px(2);//背景圓角 private final TextView tvContent;//文本 private Bitmap bitmapForDot;//選中點圖片 private int bitmapWidth;//點寬 private int bitmapHeight;//點高 public CustomMPLineChartMarkerView(Context context) { super(context, R.layout.layout_for_custom_marker_view); tvContent = findViewById(R.id.tvContent); //圖片自行替換 bitmapForDot = BitmapFactory.decodeResource(getResources(), R.drawable.icon_linechart_dot_check); bitmapWidth = bitmapForDot.getWidth(); bitmapHeight = bitmapForDot.getHeight(); } @Override public void refreshContent(Entry e, Highlight highlight) { if (e instanceof CandleEntry) { CandleEntry ce = (CandleEntry) e; tvContent.setText(Utils.formatNumber(ce.getHigh(), 0, true)); } else { tvContent.setText(Utils.formatNumber(e.getY(), 0, true)); } super.refreshContent(e, highlight); } @Override public void draw(Canvas canvas, float posX, float posY) { Chart chart = getChartView(); if (chart == null) { super.draw(canvas, posX, posY); return; } //指示器背景畫筆 Paint bgPaint = new Paint(); bgPaint.setStyle(Paint.Style.FILL); bgPaint.setAntiAlias(true); bgPaint.setColor(DEFAULT_INDICATOR_COLOR); //剪頭畫筆 Paint arrowPaint = new Paint(); arrowPaint.setStyle(Paint.Style.FILL); arrowPaint.setAntiAlias(true); arrowPaint.setColor(DEFAULT_INDICATOR_COLOR); float width = getWidth(); float height = getHeight(); int saveId = canvas.save(); //移動畫布到點並繪制點 canvas.translate(posX, posY); canvas.drawBitmap(bitmapForDot, -bitmapWidth / 2f , -bitmapHeight / 2f ,null); //畫指示器 Path path = new Path(); RectF bRectF; if (posY < height + ARROW_HEIGHT + ARROW_OFFSET + bitmapHeight / 2f) {//處理超過上邊界 //移動畫布並繪制三角形和背景 canvas.translate(0, height + ARROW_HEIGHT + ARROW_OFFSET + bitmapHeight / 2f); path.moveTo(0, -(height + ARROW_HEIGHT)); path.lineTo(ARROW_WIDTH / 2f, -(height - BG_CORNER)); path.lineTo(- ARROW_WIDTH / 2f, -(height - BG_CORNER)); path.lineTo(0, -(height + ARROW_HEIGHT)); bRectF=new RectF(-width / 2, -height, width / 2, 0); canvas.drawPath(path, arrowPaint); canvas.drawRoundRect(bRectF, BG_CORNER, BG_CORNER, bgPaint); canvas.translate(-width / 2f, -height); } else {//沒有超過上邊界 //移動畫布並繪制三角形和背景 canvas.translate(0, -height - ARROW_HEIGHT - ARROW_OFFSET - bitmapHeight / 2f); path.moveTo(0, height + ARROW_HEIGHT); path.lineTo(ARROW_WIDTH / 2f, height - BG_CORNER); path.lineTo(- ARROW_WIDTH / 2f, height - BG_CORNER); path.lineTo(0, height + ARROW_HEIGHT); bRectF=new RectF(-width / 2, 0, width / 2, height); canvas.drawPath(path, arrowPaint); canvas.drawRoundRect(bRectF, BG_CORNER, BG_CORNER, bgPaint); canvas.translate(-width / 2f, 0); } draw(canvas); canvas.restoreToCount(saveId); } private int dp2px(int dpValues) { return (int) TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, dpValues, getResources().getDisplayMetrics()); } }
layout_for_custom_marker_view.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:id="@+id/tvContent" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@android:color/white"/> </RelativeLayout>
設置MarkerView
CustomMPLineChartMarkerView mv = new CustomMPLineChartMarkerView(this); mv.setChartView(lineChart); chart.setMarker(mv);