Android 에서 MPAndroidChart 사용자 정의 로 최고점 표 지 를 그 리 는 방법

머리말
MPAndroidChart 는 안 드 로 이 드 기반 의 오픈 소스 도표 라 이브 러 리 로,MPAndroidChart 는 안 드 로 이 드 장치 에 각종 통계 도 표를 그 릴 수 있 을 뿐만 아니 라 도 표를 드래그 하고 크기 조정 할 수 있어 매우 유연 하 게 응용 된다.MPAndroidChart 는 더욱 가 볍 고 간단 하 며 자주 사용 하 는 도표 유형 을 가진다.선형 그림,떡 그림,기둥 모양 그림 과 산 점 그림 이다.
MPAndroidChart 사용자 정의 최고점 표시 그리 기
지난번 에 MPAndroidChart 에 관 한 글 을 발표 한 지 한 달 이 넘 었 습 니 다.프로젝트 에 하나의 수요 가 추가 되 어 간단 해 보 입 니 다.바로 가장 높 은 점 에서 사각형 상 자 를 그립 니 다.표지 의 가장 높 은 점 의 수 치 를 표시 하 는 동시에 가장 높 은 점 에서 작은 동 그 라 미 를 그립 니 다.그리고 평균 수치 선 을 그립 니 다.다음 그림 과 같 습 니 다.

간단 해 보 입 니 다.MPAndroidChart 의 demo 에 도 LineChart 는 작은 동그라미 와 디 스 플레이 수 치 를 가지 고 있 지만 가장 높 은 곳 에서 만 그 리 는 것 은 없 는 것 같 고 작은 중 공 코일 의 크기 를 조절 할 수 없 기 때문에 사용자 정의 로 그 릴 수 밖 에 없습니다.
LineChart 에서 렌 더 링 을 사용자 정의 하려 면 Render 를 사용자 정의 하고 LineChart Renderer 에 계승 한 다음 drawValues 방법 을 다시 써 야 합 니 다.
다음은 하나의 LineChart 의 기본 구성 을 말 해 보 자.모든 점 은 하나의 Entry 이 고 그 두 개의 매개 변 수 는 각각 X 축 과 Y 축의 값 이 며 X 축 은 반드시 정형 이 어야 하 며 Y 축 은 부동 점 형 이다.LineDataSet 은 여러 개의 점 으로 구성 되 어 있 기 때문에 그 매개 변 수 는 Array List입 니 다.LineDataSet 은 선의 색상 과 배경 색 을 제어 할 수 있 습 니 다.작은 동 그 라 미 를 표시 할 수 있 는 지,각 점 의 수치 라벨 을 표시 할 수 있 는 지,안 타 깝 게 도 각 점 까지 정확 하지 않 습 니 다.그리고 본 고 는 LineData 입 니 다.그 매개 변 수 는 LineDataSet 입 니 다.이 곳 에서 저 는 기본적으로 모든 LineChart 에 곡선 그림 이 하나 밖 에 없 기 때문에 drawValues 에서 LineDataSet 과 Array List를 가 져 올 수 있 습 니 다.

LineDataSet dataSet = (LineDataSet) mChart.getLineData().getDataSetByIndex(0);
List<Entry> entries = dataSet.getValues();
그리고 Array List를 옮 겨 다 니 며 최대 값 을 찾 은 다음(X,Y)축의 값 을 가 져 옵 니 다.MPAndroidChart 의 내장 방법 을 통 해 Canvas 에 있 는(X,Y)점 의 값 을 찾 습 니 다.

Transformer trans = mChart.getTransformer(dataSet.getAxisDependency());
MPPointD pointD = trans.getPixelForValues(max_x, max_y);
그 다음 에 이 위치 에 작은 동 그 라 미 를 그 릴 수 있 습 니 다.안 드 로 이 드 Canvas 자세 와 관련 된 글 이 인터넷 에 많 습 니 다.저 는 예전 에 C\#WinForm GDI+와 관련 된 프로젝트 를 한 적 이 있 습 니 다.그림 을 그 리 는 것 에 대해 조금 알 고 있 습 니 다.이해 하기 어렵 지 않 습 니 다.

Paint paintDrawPointFill = new Paint(Paint.ANTI_ALIAS_FLAG);
paintDrawPointFill.setStyle(Paint.Style.FILL);
paintDrawPointFill.setColor(Color.WHITE);
c.drawCircle((float) pointD.x, (float) pointD.y, ScreenUnit.dp2px(context, 6),paintDrawPointFill);
그 다음 에 최대 치 문자 와 옹 골 진 사각형 을 그립 니 다.제 생각 은 먼저 문 자 를 그립 니 다.문자 의 높이 와 너 비 를 측정 한 다음 에 너비 에 각각 좌우 에 거 리 를 더 한 다음 에 옹 골 진 사각형 을 그립 니 다.

String textTag="    ";
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setTextSize(ScreenUnit.dp2px(context, 12));
paint.setColor(igsLineConfig.getMainColor());
Rect rectTextBounds = new Rect();
paint.getTextBounds(textTag, 0, textTag.length(), rectTextBounds);
텍스트 의 너비 와 높이 가 져 오기:

int textWidth = (rectTextBounds.right - rectTextBounds.left);
 int textHeight = (rectTextBounds.bottom - rectTextBounds.top);
그 다음 에 문자 와 사각형 의 상하 좌우 가 일정한 거 리 를 유지 할 수 있 도록 Padding 과 유사 하 게 두 개의 매개 변수 인 OffsetX 와 OffsetY 두 개의 매개 변 수 를 추가 한 다음 에 사각형 에 필요 한 좌표 시스템 을 다시 예화 합 니 다.

RectF rectF = new RectF((int) offset_x - textOffset,
    (int) offset_y - textHeight - textOffset,
    (int) offset_x + textWidth + textOffset,
    (int) offset_y + textOffset);
사각형 그리 기:

c.drawRoundRect(rectF, igsLineConfig.getCorner(), igsLineConfig.getCorner(), paint);
또 하나의 LineChart 를 다시 실현 해 야 합 니 다.그 렌 더 링 은 우리 가 방금 LineChart Renderer 에 대한 실현 을 실현 하고 LineChart 를 계승 하 며 init 방법 을 다시 쓰 도록 지정 해 야 합 니 다.

@Override
 protected void init() {
  super.init();
  WindowManager wm = (WindowManager)getContext().getSystemService(Context.WINDOW_SERVICE);
  DisplayMetrics metrics = new DisplayMetrics();
  wm.getDefaultDisplay().getMetrics(metrics);
  MyChartDataRender dataRender = new MyChartDataRender(this, mAnimator, mViewPortHandler, metrics.widthPixels, tag);
  dataRender.context = getContext();
  dataRender.igsLineConfig = IgsChartConfigSingleton.instance.getIgsAltitudeLineConfig();
  mRenderer = dataRender;
 }
Canvas 를 그 릴 때 제어 하거나 파 라 메 터 를 전달 하려 면 이 실현 에서 정의 할 수 있 습 니 다.예 를 들 어 제 가 수 동 으로 최대 치 를 지정 해 야 하 는 태그 표시 등 이 있 습 니 다.

private double maxValue;
public double getMaxValue() {
  return maxValue;
}

public void setMaxValue(double maxValue) {
  this.maxValue = maxValue;
}
만약 에 Render 의 실현 류 에 필요 하 다 면 도표 대상 을 얻 은 다음 에 우리 가 쓴 실현 류 로 강하 게 전환 할 수 있 습 니 다.

public void drawValues(Canvas c) {
  super.drawValues(c);
  MyLineChart chartInstance = (MyLineChart) mChart;
}
이로써 최고점 표 지 를 완성 하고 최고점 을 계산 하지 않 아 도 된다.이 LineChart 의 실현 을 개선 하고 배경 과 전망 을 사용자 정의 한 다음 에 Render 를 공유 합 니 다.말 이 많 지 않 습 니 다.위의 그림 입 니 다.

평균 선 을 그 리 는 것 은 매우 간단 하 다.이미 내 장 된 것 이 실현 되 었 다.당신 이 해 야 할 일 은 모든 Y 축의 값 의 평균 값 을 계산 하 는 것 이다.또는 수 치 는 인터페이스 에서 유래 하면 직접 설정 하면 된다.

LimitLine avgLine = new LimitLine((float) navg);
 avgLine.enableDashedLine(5.0f, 3.0f, 3.0f);
 avgLine.setLineColor(Color.parseColor("#33CC33"));
 lineChart1.getAxisLeft().addLimitLine(avgLine);
OK,MPAndroidChart 에 대한 이해 가 한 걸음 더 깊 어 졌 습 니 다!
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기