From 1dffc346557ed29454d9376312a3f529b67a94f4 Mon Sep 17 00:00:00 2001 From: 陶汉栋 <2821744554@qq.com> Date: Thu, 29 Mar 2018 09:32:39 +0800 Subject: [PATCH] no message --- .idea/misc.xml | 2 +- app/src/main/java/com/shunzhi/parent/ui/fragment/report/ReportDetialFragment.java | 21 +++++++++++++++++++++ app/src/main/res/layout/fragment_report_detial.xml | 13 ++++++++++--- mvpsdk/src/main/java/com/share/mvpsdk/utils/DateUtils.java | 6 +++++- mvpsdk/src/main/java/com/share/mvpsdk/utils/ValueUtils.java | 181 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ mvpsdk/src/main/java/com/share/mvpsdk/view/chartview/ChartView.java | 242 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ mvpsdk/src/main/java/com/share/mvpsdk/view/chartview/data/Chart.java | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ mvpsdk/src/main/java/com/share/mvpsdk/view/chartview/data/ChartPath.java | 24 ++++++++++++++++++++++++ mvpsdk/src/main/java/com/share/mvpsdk/view/chartview/data/DrawData.java | 24 ++++++++++++++++++++++++ mvpsdk/src/main/java/com/share/mvpsdk/view/chartview/data/InputData.java | 26 ++++++++++++++++++++++++++ 10 files changed, 596 insertions(+), 5 deletions(-) create mode 100644 mvpsdk/src/main/java/com/share/mvpsdk/utils/ValueUtils.java create mode 100644 mvpsdk/src/main/java/com/share/mvpsdk/view/chartview/ChartView.java create mode 100644 mvpsdk/src/main/java/com/share/mvpsdk/view/chartview/data/Chart.java create mode 100644 mvpsdk/src/main/java/com/share/mvpsdk/view/chartview/data/ChartPath.java create mode 100644 mvpsdk/src/main/java/com/share/mvpsdk/view/chartview/data/DrawData.java create mode 100644 mvpsdk/src/main/java/com/share/mvpsdk/view/chartview/data/InputData.java diff --git a/.idea/misc.xml b/.idea/misc.xml index 75dac50..3963879 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -24,7 +24,7 @@ - + diff --git a/app/src/main/java/com/shunzhi/parent/ui/fragment/report/ReportDetialFragment.java b/app/src/main/java/com/shunzhi/parent/ui/fragment/report/ReportDetialFragment.java index 5554575..e1ea282 100644 --- a/app/src/main/java/com/shunzhi/parent/ui/fragment/report/ReportDetialFragment.java +++ b/app/src/main/java/com/shunzhi/parent/ui/fragment/report/ReportDetialFragment.java @@ -9,11 +9,15 @@ import android.view.View; import com.share.mvpsdk.base.BasePresenter; import com.share.mvpsdk.base.fragment.BaseMVPCompatFragment; +import com.share.mvpsdk.utils.DateUtils; +import com.share.mvpsdk.view.chartview.ChartView; +import com.share.mvpsdk.view.chartview.data.InputData; import com.shunzhi.parent.R; import com.shunzhi.parent.adapter.DeyuDetialAdapter; import com.shunzhi.parent.bean.report.DeyuDetialBean; import java.util.ArrayList; +import java.util.Date; import java.util.List; /** @@ -25,6 +29,8 @@ public class ReportDetialFragment extends BaseMVPCompatFragment { private RecyclerView recycle_deyu; private DeyuDetialAdapter deyuDetialAdapter; Listlist=new ArrayList<>(); + + private ChartView chartView; @NonNull @Override public BasePresenter initPresenter() { @@ -39,6 +45,7 @@ public class ReportDetialFragment extends BaseMVPCompatFragment { @Override public void initUI(View view, @Nullable Bundle savedInstanceState) { recycle_deyu=view.findViewById(R.id.recycle_deyu); + chartView=view.findViewById(R.id.chartView); recycle_deyu.setLayoutManager(new LinearLayoutManager(getActivity())); deyuDetialAdapter=new DeyuDetialAdapter(getActivity()); DeyuDetialBean deyuDetialBean=new DeyuDetialBean(); @@ -48,6 +55,20 @@ public class ReportDetialFragment extends BaseMVPCompatFragment { deyuDetialAdapter.addAll(list); recycle_deyu.setAdapter(deyuDetialAdapter); + initChartViews(); + + } + + private void initChartViews() { + + chartView.setColors(R.color.textColor,R.color.huodong_blue,R.color.gray); + List inputDataList=new ArrayList<>(); + for (int i = 0; i < 10; i++) { + InputData inputData=new InputData((new Date().getTime()-(10-i)*24*60*60*1000),10*i); + inputDataList.add(inputData); + } + + chartView.setChartPaths(inputDataList); } } diff --git a/app/src/main/res/layout/fragment_report_detial.xml b/app/src/main/res/layout/fragment_report_detial.xml index 441e858..44f8980 100644 --- a/app/src/main/res/layout/fragment_report_detial.xml +++ b/app/src/main/res/layout/fragment_report_detial.xml @@ -160,12 +160,19 @@ - + + - + = Chart.CHART_PART_VALUE; value--) { + if (isRightValue(value)) { + return value; + } + } + + return maxValue; + } + + public static long max(@Nullable List dataList) { + long maxValue = 0; + + if (dataList == null || dataList.isEmpty()) { + return maxValue; + } + + for (InputData data : dataList) { + if (data.valueY > maxValue) { + maxValue = data.valueY; + } + } + + return maxValue; + } + + private static boolean isRightValue(long value) { + long valueResidual = value % Chart.CHART_PART_VALUE; + return valueResidual == 0; + } + + @NotificationCompat.NotificationVisibility + public static List getDrawData(@Nullable Chart chart) { + if (chart == null || chart.getInputDataList().isEmpty()) { + return new ArrayList<>(); + } + + List dataList = chart.getInputDataList(); + correctDataListSize(dataList);//移除多余的数据 + return createDrawDataList(chart, createValueList(dataList)); + } + + private static void correctDataListSize(@NonNull List dataList) { + if (dataList.size() < Chart.MAX_ITEMS_COUNT) { + addLackingItems(dataList); + + } else if (dataList.size() > Chart.MAX_ITEMS_COUNT) { + removeExcessItems(dataList); + } + } + + private static void addLackingItems(@NonNull List dataList) { + for (int i = dataList.size(); i < Chart.MAX_ITEMS_COUNT; i++) { + long millis = dataList.get(0).valueX - TimeUnit.DAYS.toMillis(1); + if (millis < 0) { + millis = 0; + } + + dataList.add(0, new InputData(0, millis)); + } + } + + private static void removeExcessItems(@NonNull List dataList) { + for (ListIterator iterator = dataList.listIterator(); iterator.hasNext(); ) { + if (iterator.nextIndex() > Chart.MAX_ITEMS_COUNT) { + iterator.remove(); + return; + } + iterator.next(); + } + } + + private static List createValueList(@NonNull List dataList) { + List valueList = new ArrayList<>(); + long topValue = ValueUtils.max(dataList);//取最大值 + + for (InputData data : dataList) { + float value = (float) data.valueY / topValue; + valueList.add(value); + } + + return valueList; + } + + @NonNull + private static List createDrawDataList(@NonNull Chart chart, @NonNull List valueList) { + List drawDataList = new ArrayList<>(); + for (int i = 0; i < valueList.size() - 1; i++) { + DrawData drawData = createDrawData(chart, valueList, i); + drawDataList.add(drawData); + } + return drawDataList; + } + + @NonNull + private static DrawData createDrawData(@NonNull Chart chart, @NonNull List valueList, int position) { + DrawData drawData = new DrawData(); + if (position > valueList.size() - 1) { + return drawData; + } + + float value = valueList.get(position); + int startX = getCoordinateX(chart, position); + int startY = getCoordinateY(chart, value); + drawData.startX = startX; + drawData.startY = startY; +// drawData.setStartX(startX); +// drawData.setStartY(startY); + int nextPosition = position + 1; + if (nextPosition < valueList.size()) { + float nextValue = valueList.get(nextPosition); + int stopX = getCoordinateX(chart, nextPosition); + int stopY = getCoordinateY(chart, nextValue); + +// drawData.setStopX(stopX); +// drawData.setStopY(stopY); + + drawData.stopX = stopX; + drawData.stopY = stopY; + } + + return drawData; + } + + @SuppressWarnings("UnnecessaryLocalVariable") + private static int getCoordinateX(@NonNull Chart chart, int index) { + int width = chart.width; + int titleWidth = chart.titleWidth; + + int widthCorrected = width - titleWidth; + int partWidth = widthCorrected / (Chart.MAX_ITEMS_COUNT - 1); + int coordinate = titleWidth + (partWidth * index); + + if (coordinate < 0) { + coordinate = 0; + + } else if (coordinate > width) { + coordinate = width; + } + + return coordinate; + } + + @SuppressWarnings("UnnecessaryLocalVariable") + private static int getCoordinateY(@NonNull Chart chart, float value) { + int height = chart.height - chart.padding- chart.textSize; + int heightOffset = chart.heightOffset; + + int heightCorrected = height - heightOffset; + int coordinate = (int) (heightCorrected - (heightCorrected * value)); + + if (coordinate < 0) { + coordinate = 0; + + } else if (coordinate > heightCorrected) { + coordinate = heightCorrected; + } + + coordinate += heightOffset; + return coordinate; + } +} diff --git a/mvpsdk/src/main/java/com/share/mvpsdk/view/chartview/ChartView.java b/mvpsdk/src/main/java/com/share/mvpsdk/view/chartview/ChartView.java new file mode 100644 index 0000000..6ce3afd --- /dev/null +++ b/mvpsdk/src/main/java/com/share/mvpsdk/view/chartview/ChartView.java @@ -0,0 +1,242 @@ +package com.share.mvpsdk.view.chartview; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.util.AttributeSet; +import android.util.Log; +import android.view.View; + +import com.share.mvpsdk.R; +import com.share.mvpsdk.utils.DateUtils; +import com.share.mvpsdk.utils.ValueUtils; +import com.share.mvpsdk.view.chartview.data.Chart; +import com.share.mvpsdk.view.chartview.data.ChartPath; +import com.share.mvpsdk.view.chartview.data.DrawData; +import com.share.mvpsdk.view.chartview.data.InputData; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by ToaHanDong on 2018/3/28. + */ + +public class ChartView extends View { + + Paint axisPaint;//轴的画笔 + + Paint valuesPaint;//值的画笔 + + Paint textPaint;//轴的数值的画笔 + + Chart chart;//图表属性 + + List chartPathList=null;//路径的集合 + + private int axisColor, valuesColor, textColor; + + + public ChartView(Context context) { + super(context); + initCharView(); + } + + public ChartView(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + initCharView(); + } + + public ChartView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + initCharView(); + } + + private void initCharView() { + + initPaint(); + + + } + + //添加路径 + public void setChartPaths(List inputData){ + if (null==chartPathList)chartPathList=new ArrayList<>(); + ChartPath chartPath=new ChartPath(inputData); + chartPathList.add(chartPath); + chart.setInputDataList(inputData); + chart.titleWidth=getTitleWidth(); + measure(690,392); + Log.d("66666","setChartPaths="+chart.toString()); + chart.setDrawDataList(ValueUtils.getDrawData(chart)); + invalidate(); + + } + + //设置颜色 + public void setColors(int textColor,int axisColor,int valuesColor){ + this.textColor=textColor; + this.axisColor=axisColor; + this.valuesColor=valuesColor; + } + + private int getTitleWidth() { + List valueList = chart.inputDataList; + if (valueList == null || valueList.isEmpty()) { + return 0; + } + + String maxValue = String.valueOf(ValueUtils.max(valueList)); + int titleWidth = (int) textPaint.measureText(maxValue); + int padding = chart.padding; + + return padding + titleWidth + padding; + } + /** + * 初始化 画笔 + */ + private void initPaint() { + + chart = new Chart(); +// chart.height = getMeasuredHeight(); +// chart.width = getWidth(); + chart.heightOffset = (int) (getResources().getDimension(R.dimen.dp_4) + getResources().getDimension(R.dimen.dp_4)); + chart.padding = (int) (getResources().getDimension(R.dimen.dp_10)); + chart.textSize = (int) getResources().getDimension(R.dimen.dp_14); + chart.radius = (int) getResources().getDimension(R.dimen.dp_4); + chart.inerRadius = (int) getResources().getDimension(R.dimen.dp_4); + + axisPaint = new Paint(); + axisPaint.setColor(getResources().getColor(R.color.theme_day_blue)); + axisPaint.setStyle(Paint.Style.FILL); + axisPaint.setAntiAlias(true); + axisPaint.setTextSize(chart.textSize); + + valuesPaint = new Paint(); + valuesPaint.setAntiAlias(true); + valuesPaint.setTextSize(chart.textSize); + valuesPaint.setColor(getResources().getColor(R.color.theme_day_blue)); + + textPaint = new Paint(); + textPaint.setColor(getResources().getColor(R.color.text_color_dark)); + textPaint.setTextSize(chart.textSize); + textPaint.setAntiAlias(true); + textPaint.setStyle(Paint.Style.FILL); + + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + + drawChartVertical(canvas); + drawChartHorizontal(canvas); + drawFrameLines(canvas); + + } + + + private void drawChartVertical(@NonNull Canvas canvas) { + List inputDataList = chart.getInputDataList(); + if (inputDataList == null || inputDataList.isEmpty()) { + return; + } + + long maxValue = ValueUtils.max(inputDataList); + long correctedMaxValue = ValueUtils.getCorrectedMaxValue(maxValue); + float value = (float) correctedMaxValue / maxValue; + + long heightOffset = chart.heightOffset; + int padding = chart.padding; + int textSize = chart.textSize; + int titleWidth = chart.titleWidth; + + float width = chart.width - chart.textSize - chart.padding; + float height = chart.height - textSize - padding; + float chartPartHeight = ((height - heightOffset) * value) / Chart.CHART_PARTS; + + float currHeight = height; + int currTitle = 0; + + for (int i = 0; i <= Chart.CHART_PARTS; i++) { + float titleY = currHeight; + + if (i <= 0) { + titleY = height; + + } else if (textSize + chart.heightOffset > currHeight) { + titleY = currHeight + textSize - Chart.TEXT_SIZE_OFFSET; + } + + if (i > 0) { +// canvas.drawLine(titleWidth, currHeight, width, currHeight, frameInternalPaint); + } + + String title = String.valueOf(currTitle); + canvas.drawText(title, padding, titleY, textPaint); + + currHeight -= chartPartHeight; + currTitle += correctedMaxValue / Chart.CHART_PARTS; + } + } + + private void drawChartHorizontal(@NonNull Canvas canvas) { + List inputDataList = chart.getInputDataList(); + List drawDataList = chart.getDrawDataList(); + Log.d("66666","drawChartHorizontal="+drawDataList); + if (inputDataList == null || inputDataList.isEmpty() || drawDataList == null || drawDataList.isEmpty()) { + return; + } +// drawPath(drawDataList,canvas); + for (int i = 0; i < inputDataList.size(); i++) { + + InputData inputData = inputDataList.get(i); + String date = DateUtils.format(inputData.valueX); + int dateWidth = (int) axisPaint.measureText(date); + int x; + if (drawDataList.size() > i) { + DrawData drawData = drawDataList.get(i); + x = drawData.startX; + if (i > 0) { +// x -= (dateWidth / 2); + x = drawDataList.get(i).startX - (dateWidth / 2) - chart.padding - chart.textSize; + } + } else { + x = drawDataList.get(drawDataList.size() - 1).stopX - dateWidth - chart.padding - chart.textSize; + } + if (i > 0) + canvas.drawLine(i == drawDataList.size() ? x + chart.textSize : x + dateWidth / 2, + drawDataList.get(i - 1).stopY, i == drawDataList.size() ? x + chart.textSize : x + dateWidth / 2, chart.height + - chart.textSize - chart.padding, textPaint); + canvas.drawText(date, x, chart.height, textPaint); + } + } + + private void drawFrameLines(@NonNull Canvas canvas) { + int textSize = chart.textSize; + int padding = chart.padding; + + int height = chart.height - textSize - padding; + int width = chart.width - textSize - padding; + int titleWidth = chart.titleWidth; + int heightOffset = chart.heightOffset; + + canvas.drawLine(titleWidth, heightOffset, titleWidth, height, axisPaint); + canvas.drawLine(titleWidth, height, width, height, axisPaint); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + + int width = MeasureSpec.getSize(widthMeasureSpec); + int height = MeasureSpec.getSize(heightMeasureSpec) / 2; + chart.width=width; + chart.height=height; + Log.d("66666","onMeasure="+chart.toString()); + setMeasuredDimension(width, height); + + } +} diff --git a/mvpsdk/src/main/java/com/share/mvpsdk/view/chartview/data/Chart.java b/mvpsdk/src/main/java/com/share/mvpsdk/view/chartview/data/Chart.java new file mode 100644 index 0000000..0e53214 --- /dev/null +++ b/mvpsdk/src/main/java/com/share/mvpsdk/view/chartview/data/Chart.java @@ -0,0 +1,62 @@ +package com.share.mvpsdk.view.chartview.data; + +import java.util.List; + +/** + * Created by ToaHanDong on 2018/3/28. + * 定义chart表单需要的一些数据 + */ + +public class Chart { + + public static final int CHART_PARTS = 5; + public static final int MAX_ITEMS_COUNT = 7; + public static final int CHART_PART_VALUE = 10; + public static final int TEXT_SIZE_OFFSET = 10; + + public int width;//表单的宽 + public int height;//表单的高 + + public int padding;//内边距 + public int titleWidth;// + public int textSize;//字体大小 + public int heightOffset; + + public int radius; + public int inerRadius; + + public List inputDataList; + + public List drawDataList; + + public void setInputDataList(List inputDataList){ + this.inputDataList=inputDataList; + } + + public List getInputDataList(){ + return inputDataList; + } + + public void setDrawDataList(List drawDataList){ + this.drawDataList=drawDataList; + } + + public List getDrawDataList(){ + return drawDataList; + } + + + @Override + public String toString() { + return "Chart{" + + "width=" + width + + ", height=" + height + + ", padding=" + padding + + ", titleWidth=" + titleWidth + + ", textSize=" + textSize + + ", heightOffset=" + heightOffset + + ", radius=" + radius + + ", inerRadius=" + inerRadius + + '}'; + } +} diff --git a/mvpsdk/src/main/java/com/share/mvpsdk/view/chartview/data/ChartPath.java b/mvpsdk/src/main/java/com/share/mvpsdk/view/chartview/data/ChartPath.java new file mode 100644 index 0000000..738c6c0 --- /dev/null +++ b/mvpsdk/src/main/java/com/share/mvpsdk/view/chartview/data/ChartPath.java @@ -0,0 +1,24 @@ +package com.share.mvpsdk.view.chartview.data; + +import java.util.List; + +/** + * Created by ToaHanDong on 2018/3/28. + */ + +//路径 +public class ChartPath { + + public List inputDataList; + + public ChartPath(List inputData) { + this.inputDataList=inputData; + } + + @Override + public String toString() { + return "ChartPath{" + + "inputDataList=" + inputDataList + + '}'; + } +} diff --git a/mvpsdk/src/main/java/com/share/mvpsdk/view/chartview/data/DrawData.java b/mvpsdk/src/main/java/com/share/mvpsdk/view/chartview/data/DrawData.java new file mode 100644 index 0000000..6ffa125 --- /dev/null +++ b/mvpsdk/src/main/java/com/share/mvpsdk/view/chartview/data/DrawData.java @@ -0,0 +1,24 @@ +package com.share.mvpsdk.view.chartview.data; + +/** + * Created by ToaHanDong on 2018/3/28. + */ + +public class DrawData { + + public int startX; + public int startY; + + public int stopX; + public int stopY; + + @Override + public String toString() { + return "DrawData{" + + "startX=" + startX + + ", startY=" + startY + + ", stopX=" + stopX + + ", stopY=" + stopY + + '}'; + } +} diff --git a/mvpsdk/src/main/java/com/share/mvpsdk/view/chartview/data/InputData.java b/mvpsdk/src/main/java/com/share/mvpsdk/view/chartview/data/InputData.java new file mode 100644 index 0000000..fd3d08b --- /dev/null +++ b/mvpsdk/src/main/java/com/share/mvpsdk/view/chartview/data/InputData.java @@ -0,0 +1,26 @@ +package com.share.mvpsdk.view.chartview.data; + +/** + * Created by ToaHanDong on 2018/3/28. + * 输入的x、y参数 + */ + +public class InputData { + + public long valueX; + + public long valueY; + + public InputData(long valueX,long valueY){ + this.valueX=valueX; + this.valueY=valueY; + } + + @Override + public String toString() { + return "InputData{" + + "valueX=" + valueX + + ", valueY=" + valueY + + '}'; + } +} -- libgit2 0.21.0