diff --git a/.idea/misc.xml b/.idea/misc.xml index 173a637..738d045 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,18 +3,27 @@ diff --git a/.idea/misc.xml b/.idea/misc.xml index 173a637..738d045 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,18 +3,27 @@ diff --git a/app/src/main/java/com/casic/dcms/ui/TrendAnalysisActivity.java b/app/src/main/java/com/casic/dcms/ui/TrendAnalysisActivity.java index c0070c7..a9a5332 100644 --- a/app/src/main/java/com/casic/dcms/ui/TrendAnalysisActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/TrendAnalysisActivity.java @@ -10,15 +10,29 @@ import com.casic.dcms.databinding.ActivityTrendAnalysisBinding; import com.casic.dcms.utils.Constant; import com.casic.dcms.utils.TimeOrDateUtil; +import com.casic.dcms.widgets.DetailsMarkerView; +import com.github.mikephil.charting.components.Description; +import com.github.mikephil.charting.components.XAxis; +import com.github.mikephil.charting.components.YAxis; +import com.github.mikephil.charting.data.Entry; +import com.github.mikephil.charting.data.LineData; +import com.github.mikephil.charting.data.LineDataSet; +import com.github.mikephil.charting.interfaces.datasets.ILineDataSet; import com.jzxiang.pickerview.TimePickerDialog; import com.jzxiang.pickerview.data.Type; import com.jzxiang.pickerview.listener.OnDateSetListener; +import java.util.ArrayList; import java.util.Calendar; +import java.util.List; +import java.util.Random; public class TrendAnalysisActivity extends AndroidxBaseActivity { private final Context context = TrendAnalysisActivity.this; + private final List totalEntries = new ArrayList<>(); + private final List handleEntries = new ArrayList<>(); + private final List lineDataSets = new ArrayList<>(); @Override protected void setupTopBarLayout() { @@ -32,8 +46,56 @@ viewBinding.titleBarLayout.dateView.setText(TimeOrDateUtil.timestampToYearMonth(System.currentTimeMillis())); viewBinding.wholeCircleProgressBar.setCurrentValue(80); //初始化折线图 + viewBinding.lineChart.setDrawGridBackground(false); + viewBinding.lineChart.setDrawBorders(false); Calendar calendar = Calendar.getInstance(); - int maximum = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); + int maxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); + //TODO 这是模拟数据 + for (int i = 0; i < maxDay; i++) { + totalEntries.add(new Entry(i, new Random().nextInt(100), "total")); + } + for (int i = 0; i < maxDay; i++) { + handleEntries.add(new Entry(i, new Random().nextInt(80), "handle")); + } + //设置样式 + YAxis rightAxis = viewBinding.lineChart.getAxisRight(); + //设置图表右边的y轴禁用 + rightAxis.setEnabled(false); + YAxis leftAxis = viewBinding.lineChart.getAxisLeft(); + //设置x轴 + XAxis xAxis = viewBinding.lineChart.getXAxis(); + xAxis.setTextColor(ContextCompat.getColor(context, R.color.textColor)); + xAxis.setTextSize(12f); + xAxis.setAxisMinimum(0f); + xAxis.setAxisMaximum(maxDay); + xAxis.setDrawLabels(true);//绘制标签 指x轴上的对应数值 + xAxis.setDrawAxisLine(true);//是否绘制轴线 + xAxis.setDrawGridLines(false);//设置x轴上每个点对应的线 + xAxis.setGranularity(1f);//禁止放大后x轴标签重绘 + xAxis.setPosition(XAxis.XAxisPosition.BOTTOM); + //去掉描述 + Description description = new Description(); + description.setEnabled(false); + viewBinding.lineChart.setDescription(description); + //添加自定义Marker + DetailsMarkerView detailsMarkerView = new DetailsMarkerView(this); + detailsMarkerView.setChartView(viewBinding.lineChart); + viewBinding.lineChart.setMarker(detailsMarkerView); + //设置数据 + LineDataSet totalDataSet = new LineDataSet(totalEntries, "上报案卷"); + totalDataSet.setColor(ContextCompat.getColor(context, R.color.warnColor));//线条颜色 + totalDataSet.setCircleColor(ContextCompat.getColor(context, R.color.warnColor));//圆点颜色 + lineDataSets.add(totalDataSet); + + LineDataSet handleDataSet = new LineDataSet(handleEntries, "已处理案卷"); + handleDataSet.setColor(ContextCompat.getColor(context, R.color.onLineColor));//线条颜色 + handleDataSet.setCircleColor(ContextCompat.getColor(context, R.color.onLineColor));//圆点颜色 + lineDataSets.add(handleDataSet); + + LineData lineData = new LineData(lineDataSets); + lineData.setDrawValues(false); + viewBinding.lineChart.setData(lineData); + viewBinding.lineChart.invalidate(); } @Override diff --git a/.idea/misc.xml b/.idea/misc.xml index 173a637..738d045 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,18 +3,27 @@ diff --git a/app/src/main/java/com/casic/dcms/ui/TrendAnalysisActivity.java b/app/src/main/java/com/casic/dcms/ui/TrendAnalysisActivity.java index c0070c7..a9a5332 100644 --- a/app/src/main/java/com/casic/dcms/ui/TrendAnalysisActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/TrendAnalysisActivity.java @@ -10,15 +10,29 @@ import com.casic.dcms.databinding.ActivityTrendAnalysisBinding; import com.casic.dcms.utils.Constant; import com.casic.dcms.utils.TimeOrDateUtil; +import com.casic.dcms.widgets.DetailsMarkerView; +import com.github.mikephil.charting.components.Description; +import com.github.mikephil.charting.components.XAxis; +import com.github.mikephil.charting.components.YAxis; +import com.github.mikephil.charting.data.Entry; +import com.github.mikephil.charting.data.LineData; +import com.github.mikephil.charting.data.LineDataSet; +import com.github.mikephil.charting.interfaces.datasets.ILineDataSet; import com.jzxiang.pickerview.TimePickerDialog; import com.jzxiang.pickerview.data.Type; import com.jzxiang.pickerview.listener.OnDateSetListener; +import java.util.ArrayList; import java.util.Calendar; +import java.util.List; +import java.util.Random; public class TrendAnalysisActivity extends AndroidxBaseActivity { private final Context context = TrendAnalysisActivity.this; + private final List totalEntries = new ArrayList<>(); + private final List handleEntries = new ArrayList<>(); + private final List lineDataSets = new ArrayList<>(); @Override protected void setupTopBarLayout() { @@ -32,8 +46,56 @@ viewBinding.titleBarLayout.dateView.setText(TimeOrDateUtil.timestampToYearMonth(System.currentTimeMillis())); viewBinding.wholeCircleProgressBar.setCurrentValue(80); //初始化折线图 + viewBinding.lineChart.setDrawGridBackground(false); + viewBinding.lineChart.setDrawBorders(false); Calendar calendar = Calendar.getInstance(); - int maximum = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); + int maxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); + //TODO 这是模拟数据 + for (int i = 0; i < maxDay; i++) { + totalEntries.add(new Entry(i, new Random().nextInt(100), "total")); + } + for (int i = 0; i < maxDay; i++) { + handleEntries.add(new Entry(i, new Random().nextInt(80), "handle")); + } + //设置样式 + YAxis rightAxis = viewBinding.lineChart.getAxisRight(); + //设置图表右边的y轴禁用 + rightAxis.setEnabled(false); + YAxis leftAxis = viewBinding.lineChart.getAxisLeft(); + //设置x轴 + XAxis xAxis = viewBinding.lineChart.getXAxis(); + xAxis.setTextColor(ContextCompat.getColor(context, R.color.textColor)); + xAxis.setTextSize(12f); + xAxis.setAxisMinimum(0f); + xAxis.setAxisMaximum(maxDay); + xAxis.setDrawLabels(true);//绘制标签 指x轴上的对应数值 + xAxis.setDrawAxisLine(true);//是否绘制轴线 + xAxis.setDrawGridLines(false);//设置x轴上每个点对应的线 + xAxis.setGranularity(1f);//禁止放大后x轴标签重绘 + xAxis.setPosition(XAxis.XAxisPosition.BOTTOM); + //去掉描述 + Description description = new Description(); + description.setEnabled(false); + viewBinding.lineChart.setDescription(description); + //添加自定义Marker + DetailsMarkerView detailsMarkerView = new DetailsMarkerView(this); + detailsMarkerView.setChartView(viewBinding.lineChart); + viewBinding.lineChart.setMarker(detailsMarkerView); + //设置数据 + LineDataSet totalDataSet = new LineDataSet(totalEntries, "上报案卷"); + totalDataSet.setColor(ContextCompat.getColor(context, R.color.warnColor));//线条颜色 + totalDataSet.setCircleColor(ContextCompat.getColor(context, R.color.warnColor));//圆点颜色 + lineDataSets.add(totalDataSet); + + LineDataSet handleDataSet = new LineDataSet(handleEntries, "已处理案卷"); + handleDataSet.setColor(ContextCompat.getColor(context, R.color.onLineColor));//线条颜色 + handleDataSet.setCircleColor(ContextCompat.getColor(context, R.color.onLineColor));//圆点颜色 + lineDataSets.add(handleDataSet); + + LineData lineData = new LineData(lineDataSets); + lineData.setDrawValues(false); + viewBinding.lineChart.setData(lineData); + viewBinding.lineChart.invalidate(); } @Override diff --git a/app/src/main/java/com/casic/dcms/widgets/DetailsMarkerView.java b/app/src/main/java/com/casic/dcms/widgets/DetailsMarkerView.java new file mode 100644 index 0000000..7321c43 --- /dev/null +++ b/app/src/main/java/com/casic/dcms/widgets/DetailsMarkerView.java @@ -0,0 +1,59 @@ +package com.casic.dcms.widgets; + +import android.content.Context; +import android.widget.TextView; + +import com.casic.dcms.R; +import com.github.mikephil.charting.components.MarkerView; +import com.github.mikephil.charting.data.Entry; +import com.github.mikephil.charting.highlight.Highlight; +import com.github.mikephil.charting.utils.MPPointF; + +import java.text.DecimalFormat; +import java.util.Calendar; +import java.util.Locale; + +public class DetailsMarkerView extends MarkerView { + + private final DecimalFormat decimalFormat = new DecimalFormat("##0"); + private final TextView dayView; + private final TextView dataView; + + public DetailsMarkerView(Context context) { + super(context, R.layout.popu_marker); + dayView = findViewById(R.id.dayView); + dataView = findViewById(R.id.dataView); + } + + //每次重绘,会调用此方法刷新数据 + @Override + public void refreshContent(Entry e, Highlight highlight) { + super.refreshContent(e, highlight); + String data = (String) e.getData(); + try { + if (e.getY() == 0) { + dataView.setText("暂无数据"); + } else { + String type = ""; + if (data.equals("total")) { + type = "新增"; + } else { + type = "已处理"; + } + dataView.setText(String.format(Locale.CHINA, "%s:%s件", type, decimalFormat.format(e.getY()))); + } + Calendar calendar = Calendar.getInstance(); + int month = calendar.get(Calendar.MONTH) + 1; + int day = (int) (e.getX() + 1); + dayView.setText(String.format(Locale.CHINA, "%d月%s日", month, day)); + } catch (Exception e1) { + e1.printStackTrace(); + } + super.refreshContent(e, highlight); + } + + @Override + public MPPointF getOffset() { + return new MPPointF(-(getWidth() >> 1), -getHeight()); + } +} diff --git a/.idea/misc.xml b/.idea/misc.xml index 173a637..738d045 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,18 +3,27 @@ diff --git a/app/src/main/java/com/casic/dcms/ui/TrendAnalysisActivity.java b/app/src/main/java/com/casic/dcms/ui/TrendAnalysisActivity.java index c0070c7..a9a5332 100644 --- a/app/src/main/java/com/casic/dcms/ui/TrendAnalysisActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/TrendAnalysisActivity.java @@ -10,15 +10,29 @@ import com.casic.dcms.databinding.ActivityTrendAnalysisBinding; import com.casic.dcms.utils.Constant; import com.casic.dcms.utils.TimeOrDateUtil; +import com.casic.dcms.widgets.DetailsMarkerView; +import com.github.mikephil.charting.components.Description; +import com.github.mikephil.charting.components.XAxis; +import com.github.mikephil.charting.components.YAxis; +import com.github.mikephil.charting.data.Entry; +import com.github.mikephil.charting.data.LineData; +import com.github.mikephil.charting.data.LineDataSet; +import com.github.mikephil.charting.interfaces.datasets.ILineDataSet; import com.jzxiang.pickerview.TimePickerDialog; import com.jzxiang.pickerview.data.Type; import com.jzxiang.pickerview.listener.OnDateSetListener; +import java.util.ArrayList; import java.util.Calendar; +import java.util.List; +import java.util.Random; public class TrendAnalysisActivity extends AndroidxBaseActivity { private final Context context = TrendAnalysisActivity.this; + private final List totalEntries = new ArrayList<>(); + private final List handleEntries = new ArrayList<>(); + private final List lineDataSets = new ArrayList<>(); @Override protected void setupTopBarLayout() { @@ -32,8 +46,56 @@ viewBinding.titleBarLayout.dateView.setText(TimeOrDateUtil.timestampToYearMonth(System.currentTimeMillis())); viewBinding.wholeCircleProgressBar.setCurrentValue(80); //初始化折线图 + viewBinding.lineChart.setDrawGridBackground(false); + viewBinding.lineChart.setDrawBorders(false); Calendar calendar = Calendar.getInstance(); - int maximum = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); + int maxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); + //TODO 这是模拟数据 + for (int i = 0; i < maxDay; i++) { + totalEntries.add(new Entry(i, new Random().nextInt(100), "total")); + } + for (int i = 0; i < maxDay; i++) { + handleEntries.add(new Entry(i, new Random().nextInt(80), "handle")); + } + //设置样式 + YAxis rightAxis = viewBinding.lineChart.getAxisRight(); + //设置图表右边的y轴禁用 + rightAxis.setEnabled(false); + YAxis leftAxis = viewBinding.lineChart.getAxisLeft(); + //设置x轴 + XAxis xAxis = viewBinding.lineChart.getXAxis(); + xAxis.setTextColor(ContextCompat.getColor(context, R.color.textColor)); + xAxis.setTextSize(12f); + xAxis.setAxisMinimum(0f); + xAxis.setAxisMaximum(maxDay); + xAxis.setDrawLabels(true);//绘制标签 指x轴上的对应数值 + xAxis.setDrawAxisLine(true);//是否绘制轴线 + xAxis.setDrawGridLines(false);//设置x轴上每个点对应的线 + xAxis.setGranularity(1f);//禁止放大后x轴标签重绘 + xAxis.setPosition(XAxis.XAxisPosition.BOTTOM); + //去掉描述 + Description description = new Description(); + description.setEnabled(false); + viewBinding.lineChart.setDescription(description); + //添加自定义Marker + DetailsMarkerView detailsMarkerView = new DetailsMarkerView(this); + detailsMarkerView.setChartView(viewBinding.lineChart); + viewBinding.lineChart.setMarker(detailsMarkerView); + //设置数据 + LineDataSet totalDataSet = new LineDataSet(totalEntries, "上报案卷"); + totalDataSet.setColor(ContextCompat.getColor(context, R.color.warnColor));//线条颜色 + totalDataSet.setCircleColor(ContextCompat.getColor(context, R.color.warnColor));//圆点颜色 + lineDataSets.add(totalDataSet); + + LineDataSet handleDataSet = new LineDataSet(handleEntries, "已处理案卷"); + handleDataSet.setColor(ContextCompat.getColor(context, R.color.onLineColor));//线条颜色 + handleDataSet.setCircleColor(ContextCompat.getColor(context, R.color.onLineColor));//圆点颜色 + lineDataSets.add(handleDataSet); + + LineData lineData = new LineData(lineDataSets); + lineData.setDrawValues(false); + viewBinding.lineChart.setData(lineData); + viewBinding.lineChart.invalidate(); } @Override diff --git a/app/src/main/java/com/casic/dcms/widgets/DetailsMarkerView.java b/app/src/main/java/com/casic/dcms/widgets/DetailsMarkerView.java new file mode 100644 index 0000000..7321c43 --- /dev/null +++ b/app/src/main/java/com/casic/dcms/widgets/DetailsMarkerView.java @@ -0,0 +1,59 @@ +package com.casic.dcms.widgets; + +import android.content.Context; +import android.widget.TextView; + +import com.casic.dcms.R; +import com.github.mikephil.charting.components.MarkerView; +import com.github.mikephil.charting.data.Entry; +import com.github.mikephil.charting.highlight.Highlight; +import com.github.mikephil.charting.utils.MPPointF; + +import java.text.DecimalFormat; +import java.util.Calendar; +import java.util.Locale; + +public class DetailsMarkerView extends MarkerView { + + private final DecimalFormat decimalFormat = new DecimalFormat("##0"); + private final TextView dayView; + private final TextView dataView; + + public DetailsMarkerView(Context context) { + super(context, R.layout.popu_marker); + dayView = findViewById(R.id.dayView); + dataView = findViewById(R.id.dataView); + } + + //每次重绘,会调用此方法刷新数据 + @Override + public void refreshContent(Entry e, Highlight highlight) { + super.refreshContent(e, highlight); + String data = (String) e.getData(); + try { + if (e.getY() == 0) { + dataView.setText("暂无数据"); + } else { + String type = ""; + if (data.equals("total")) { + type = "新增"; + } else { + type = "已处理"; + } + dataView.setText(String.format(Locale.CHINA, "%s:%s件", type, decimalFormat.format(e.getY()))); + } + Calendar calendar = Calendar.getInstance(); + int month = calendar.get(Calendar.MONTH) + 1; + int day = (int) (e.getX() + 1); + dayView.setText(String.format(Locale.CHINA, "%d月%s日", month, day)); + } catch (Exception e1) { + e1.printStackTrace(); + } + super.refreshContent(e, highlight); + } + + @Override + public MPPointF getOffset() { + return new MPPointF(-(getWidth() >> 1), -getHeight()); + } +} diff --git a/app/src/main/res/drawable/bg_layout_blue.xml b/app/src/main/res/drawable/bg_layout_blue.xml new file mode 100644 index 0000000..26ddc25 --- /dev/null +++ b/app/src/main/res/drawable/bg_layout_blue.xml @@ -0,0 +1,11 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 173a637..738d045 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,18 +3,27 @@ diff --git a/app/src/main/java/com/casic/dcms/ui/TrendAnalysisActivity.java b/app/src/main/java/com/casic/dcms/ui/TrendAnalysisActivity.java index c0070c7..a9a5332 100644 --- a/app/src/main/java/com/casic/dcms/ui/TrendAnalysisActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/TrendAnalysisActivity.java @@ -10,15 +10,29 @@ import com.casic.dcms.databinding.ActivityTrendAnalysisBinding; import com.casic.dcms.utils.Constant; import com.casic.dcms.utils.TimeOrDateUtil; +import com.casic.dcms.widgets.DetailsMarkerView; +import com.github.mikephil.charting.components.Description; +import com.github.mikephil.charting.components.XAxis; +import com.github.mikephil.charting.components.YAxis; +import com.github.mikephil.charting.data.Entry; +import com.github.mikephil.charting.data.LineData; +import com.github.mikephil.charting.data.LineDataSet; +import com.github.mikephil.charting.interfaces.datasets.ILineDataSet; import com.jzxiang.pickerview.TimePickerDialog; import com.jzxiang.pickerview.data.Type; import com.jzxiang.pickerview.listener.OnDateSetListener; +import java.util.ArrayList; import java.util.Calendar; +import java.util.List; +import java.util.Random; public class TrendAnalysisActivity extends AndroidxBaseActivity { private final Context context = TrendAnalysisActivity.this; + private final List totalEntries = new ArrayList<>(); + private final List handleEntries = new ArrayList<>(); + private final List lineDataSets = new ArrayList<>(); @Override protected void setupTopBarLayout() { @@ -32,8 +46,56 @@ viewBinding.titleBarLayout.dateView.setText(TimeOrDateUtil.timestampToYearMonth(System.currentTimeMillis())); viewBinding.wholeCircleProgressBar.setCurrentValue(80); //初始化折线图 + viewBinding.lineChart.setDrawGridBackground(false); + viewBinding.lineChart.setDrawBorders(false); Calendar calendar = Calendar.getInstance(); - int maximum = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); + int maxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); + //TODO 这是模拟数据 + for (int i = 0; i < maxDay; i++) { + totalEntries.add(new Entry(i, new Random().nextInt(100), "total")); + } + for (int i = 0; i < maxDay; i++) { + handleEntries.add(new Entry(i, new Random().nextInt(80), "handle")); + } + //设置样式 + YAxis rightAxis = viewBinding.lineChart.getAxisRight(); + //设置图表右边的y轴禁用 + rightAxis.setEnabled(false); + YAxis leftAxis = viewBinding.lineChart.getAxisLeft(); + //设置x轴 + XAxis xAxis = viewBinding.lineChart.getXAxis(); + xAxis.setTextColor(ContextCompat.getColor(context, R.color.textColor)); + xAxis.setTextSize(12f); + xAxis.setAxisMinimum(0f); + xAxis.setAxisMaximum(maxDay); + xAxis.setDrawLabels(true);//绘制标签 指x轴上的对应数值 + xAxis.setDrawAxisLine(true);//是否绘制轴线 + xAxis.setDrawGridLines(false);//设置x轴上每个点对应的线 + xAxis.setGranularity(1f);//禁止放大后x轴标签重绘 + xAxis.setPosition(XAxis.XAxisPosition.BOTTOM); + //去掉描述 + Description description = new Description(); + description.setEnabled(false); + viewBinding.lineChart.setDescription(description); + //添加自定义Marker + DetailsMarkerView detailsMarkerView = new DetailsMarkerView(this); + detailsMarkerView.setChartView(viewBinding.lineChart); + viewBinding.lineChart.setMarker(detailsMarkerView); + //设置数据 + LineDataSet totalDataSet = new LineDataSet(totalEntries, "上报案卷"); + totalDataSet.setColor(ContextCompat.getColor(context, R.color.warnColor));//线条颜色 + totalDataSet.setCircleColor(ContextCompat.getColor(context, R.color.warnColor));//圆点颜色 + lineDataSets.add(totalDataSet); + + LineDataSet handleDataSet = new LineDataSet(handleEntries, "已处理案卷"); + handleDataSet.setColor(ContextCompat.getColor(context, R.color.onLineColor));//线条颜色 + handleDataSet.setCircleColor(ContextCompat.getColor(context, R.color.onLineColor));//圆点颜色 + lineDataSets.add(handleDataSet); + + LineData lineData = new LineData(lineDataSets); + lineData.setDrawValues(false); + viewBinding.lineChart.setData(lineData); + viewBinding.lineChart.invalidate(); } @Override diff --git a/app/src/main/java/com/casic/dcms/widgets/DetailsMarkerView.java b/app/src/main/java/com/casic/dcms/widgets/DetailsMarkerView.java new file mode 100644 index 0000000..7321c43 --- /dev/null +++ b/app/src/main/java/com/casic/dcms/widgets/DetailsMarkerView.java @@ -0,0 +1,59 @@ +package com.casic.dcms.widgets; + +import android.content.Context; +import android.widget.TextView; + +import com.casic.dcms.R; +import com.github.mikephil.charting.components.MarkerView; +import com.github.mikephil.charting.data.Entry; +import com.github.mikephil.charting.highlight.Highlight; +import com.github.mikephil.charting.utils.MPPointF; + +import java.text.DecimalFormat; +import java.util.Calendar; +import java.util.Locale; + +public class DetailsMarkerView extends MarkerView { + + private final DecimalFormat decimalFormat = new DecimalFormat("##0"); + private final TextView dayView; + private final TextView dataView; + + public DetailsMarkerView(Context context) { + super(context, R.layout.popu_marker); + dayView = findViewById(R.id.dayView); + dataView = findViewById(R.id.dataView); + } + + //每次重绘,会调用此方法刷新数据 + @Override + public void refreshContent(Entry e, Highlight highlight) { + super.refreshContent(e, highlight); + String data = (String) e.getData(); + try { + if (e.getY() == 0) { + dataView.setText("暂无数据"); + } else { + String type = ""; + if (data.equals("total")) { + type = "新增"; + } else { + type = "已处理"; + } + dataView.setText(String.format(Locale.CHINA, "%s:%s件", type, decimalFormat.format(e.getY()))); + } + Calendar calendar = Calendar.getInstance(); + int month = calendar.get(Calendar.MONTH) + 1; + int day = (int) (e.getX() + 1); + dayView.setText(String.format(Locale.CHINA, "%d月%s日", month, day)); + } catch (Exception e1) { + e1.printStackTrace(); + } + super.refreshContent(e, highlight); + } + + @Override + public MPPointF getOffset() { + return new MPPointF(-(getWidth() >> 1), -getHeight()); + } +} diff --git a/app/src/main/res/drawable/bg_layout_blue.xml b/app/src/main/res/drawable/bg_layout_blue.xml new file mode 100644 index 0000000..26ddc25 --- /dev/null +++ b/app/src/main/res/drawable/bg_layout_blue.xml @@ -0,0 +1,11 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_text_tag_blue.xml b/app/src/main/res/drawable/bg_text_tag_blue.xml new file mode 100644 index 0000000..6b497b0 --- /dev/null +++ b/app/src/main/res/drawable/bg_text_tag_blue.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 173a637..738d045 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,18 +3,27 @@ diff --git a/app/src/main/java/com/casic/dcms/ui/TrendAnalysisActivity.java b/app/src/main/java/com/casic/dcms/ui/TrendAnalysisActivity.java index c0070c7..a9a5332 100644 --- a/app/src/main/java/com/casic/dcms/ui/TrendAnalysisActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/TrendAnalysisActivity.java @@ -10,15 +10,29 @@ import com.casic.dcms.databinding.ActivityTrendAnalysisBinding; import com.casic.dcms.utils.Constant; import com.casic.dcms.utils.TimeOrDateUtil; +import com.casic.dcms.widgets.DetailsMarkerView; +import com.github.mikephil.charting.components.Description; +import com.github.mikephil.charting.components.XAxis; +import com.github.mikephil.charting.components.YAxis; +import com.github.mikephil.charting.data.Entry; +import com.github.mikephil.charting.data.LineData; +import com.github.mikephil.charting.data.LineDataSet; +import com.github.mikephil.charting.interfaces.datasets.ILineDataSet; import com.jzxiang.pickerview.TimePickerDialog; import com.jzxiang.pickerview.data.Type; import com.jzxiang.pickerview.listener.OnDateSetListener; +import java.util.ArrayList; import java.util.Calendar; +import java.util.List; +import java.util.Random; public class TrendAnalysisActivity extends AndroidxBaseActivity { private final Context context = TrendAnalysisActivity.this; + private final List totalEntries = new ArrayList<>(); + private final List handleEntries = new ArrayList<>(); + private final List lineDataSets = new ArrayList<>(); @Override protected void setupTopBarLayout() { @@ -32,8 +46,56 @@ viewBinding.titleBarLayout.dateView.setText(TimeOrDateUtil.timestampToYearMonth(System.currentTimeMillis())); viewBinding.wholeCircleProgressBar.setCurrentValue(80); //初始化折线图 + viewBinding.lineChart.setDrawGridBackground(false); + viewBinding.lineChart.setDrawBorders(false); Calendar calendar = Calendar.getInstance(); - int maximum = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); + int maxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); + //TODO 这是模拟数据 + for (int i = 0; i < maxDay; i++) { + totalEntries.add(new Entry(i, new Random().nextInt(100), "total")); + } + for (int i = 0; i < maxDay; i++) { + handleEntries.add(new Entry(i, new Random().nextInt(80), "handle")); + } + //设置样式 + YAxis rightAxis = viewBinding.lineChart.getAxisRight(); + //设置图表右边的y轴禁用 + rightAxis.setEnabled(false); + YAxis leftAxis = viewBinding.lineChart.getAxisLeft(); + //设置x轴 + XAxis xAxis = viewBinding.lineChart.getXAxis(); + xAxis.setTextColor(ContextCompat.getColor(context, R.color.textColor)); + xAxis.setTextSize(12f); + xAxis.setAxisMinimum(0f); + xAxis.setAxisMaximum(maxDay); + xAxis.setDrawLabels(true);//绘制标签 指x轴上的对应数值 + xAxis.setDrawAxisLine(true);//是否绘制轴线 + xAxis.setDrawGridLines(false);//设置x轴上每个点对应的线 + xAxis.setGranularity(1f);//禁止放大后x轴标签重绘 + xAxis.setPosition(XAxis.XAxisPosition.BOTTOM); + //去掉描述 + Description description = new Description(); + description.setEnabled(false); + viewBinding.lineChart.setDescription(description); + //添加自定义Marker + DetailsMarkerView detailsMarkerView = new DetailsMarkerView(this); + detailsMarkerView.setChartView(viewBinding.lineChart); + viewBinding.lineChart.setMarker(detailsMarkerView); + //设置数据 + LineDataSet totalDataSet = new LineDataSet(totalEntries, "上报案卷"); + totalDataSet.setColor(ContextCompat.getColor(context, R.color.warnColor));//线条颜色 + totalDataSet.setCircleColor(ContextCompat.getColor(context, R.color.warnColor));//圆点颜色 + lineDataSets.add(totalDataSet); + + LineDataSet handleDataSet = new LineDataSet(handleEntries, "已处理案卷"); + handleDataSet.setColor(ContextCompat.getColor(context, R.color.onLineColor));//线条颜色 + handleDataSet.setCircleColor(ContextCompat.getColor(context, R.color.onLineColor));//圆点颜色 + lineDataSets.add(handleDataSet); + + LineData lineData = new LineData(lineDataSets); + lineData.setDrawValues(false); + viewBinding.lineChart.setData(lineData); + viewBinding.lineChart.invalidate(); } @Override diff --git a/app/src/main/java/com/casic/dcms/widgets/DetailsMarkerView.java b/app/src/main/java/com/casic/dcms/widgets/DetailsMarkerView.java new file mode 100644 index 0000000..7321c43 --- /dev/null +++ b/app/src/main/java/com/casic/dcms/widgets/DetailsMarkerView.java @@ -0,0 +1,59 @@ +package com.casic.dcms.widgets; + +import android.content.Context; +import android.widget.TextView; + +import com.casic.dcms.R; +import com.github.mikephil.charting.components.MarkerView; +import com.github.mikephil.charting.data.Entry; +import com.github.mikephil.charting.highlight.Highlight; +import com.github.mikephil.charting.utils.MPPointF; + +import java.text.DecimalFormat; +import java.util.Calendar; +import java.util.Locale; + +public class DetailsMarkerView extends MarkerView { + + private final DecimalFormat decimalFormat = new DecimalFormat("##0"); + private final TextView dayView; + private final TextView dataView; + + public DetailsMarkerView(Context context) { + super(context, R.layout.popu_marker); + dayView = findViewById(R.id.dayView); + dataView = findViewById(R.id.dataView); + } + + //每次重绘,会调用此方法刷新数据 + @Override + public void refreshContent(Entry e, Highlight highlight) { + super.refreshContent(e, highlight); + String data = (String) e.getData(); + try { + if (e.getY() == 0) { + dataView.setText("暂无数据"); + } else { + String type = ""; + if (data.equals("total")) { + type = "新增"; + } else { + type = "已处理"; + } + dataView.setText(String.format(Locale.CHINA, "%s:%s件", type, decimalFormat.format(e.getY()))); + } + Calendar calendar = Calendar.getInstance(); + int month = calendar.get(Calendar.MONTH) + 1; + int day = (int) (e.getX() + 1); + dayView.setText(String.format(Locale.CHINA, "%d月%s日", month, day)); + } catch (Exception e1) { + e1.printStackTrace(); + } + super.refreshContent(e, highlight); + } + + @Override + public MPPointF getOffset() { + return new MPPointF(-(getWidth() >> 1), -getHeight()); + } +} diff --git a/app/src/main/res/drawable/bg_layout_blue.xml b/app/src/main/res/drawable/bg_layout_blue.xml new file mode 100644 index 0000000..26ddc25 --- /dev/null +++ b/app/src/main/res/drawable/bg_layout_blue.xml @@ -0,0 +1,11 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_text_tag_blue.xml b/app/src/main/res/drawable/bg_text_tag_blue.xml new file mode 100644 index 0000000..6b497b0 --- /dev/null +++ b/app/src/main/res/drawable/bg_text_tag_blue.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_trend_analysis.xml b/app/src/main/res/layout/activity_trend_analysis.xml index d26d9b1..7adcf2d 100644 --- a/app/src/main/res/layout/activity_trend_analysis.xml +++ b/app/src/main/res/layout/activity_trend_analysis.xml @@ -147,7 +147,7 @@ + android:layout_height="180dp" /> diff --git a/.idea/misc.xml b/.idea/misc.xml index 173a637..738d045 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,18 +3,27 @@ diff --git a/app/src/main/java/com/casic/dcms/ui/TrendAnalysisActivity.java b/app/src/main/java/com/casic/dcms/ui/TrendAnalysisActivity.java index c0070c7..a9a5332 100644 --- a/app/src/main/java/com/casic/dcms/ui/TrendAnalysisActivity.java +++ b/app/src/main/java/com/casic/dcms/ui/TrendAnalysisActivity.java @@ -10,15 +10,29 @@ import com.casic.dcms.databinding.ActivityTrendAnalysisBinding; import com.casic.dcms.utils.Constant; import com.casic.dcms.utils.TimeOrDateUtil; +import com.casic.dcms.widgets.DetailsMarkerView; +import com.github.mikephil.charting.components.Description; +import com.github.mikephil.charting.components.XAxis; +import com.github.mikephil.charting.components.YAxis; +import com.github.mikephil.charting.data.Entry; +import com.github.mikephil.charting.data.LineData; +import com.github.mikephil.charting.data.LineDataSet; +import com.github.mikephil.charting.interfaces.datasets.ILineDataSet; import com.jzxiang.pickerview.TimePickerDialog; import com.jzxiang.pickerview.data.Type; import com.jzxiang.pickerview.listener.OnDateSetListener; +import java.util.ArrayList; import java.util.Calendar; +import java.util.List; +import java.util.Random; public class TrendAnalysisActivity extends AndroidxBaseActivity { private final Context context = TrendAnalysisActivity.this; + private final List totalEntries = new ArrayList<>(); + private final List handleEntries = new ArrayList<>(); + private final List lineDataSets = new ArrayList<>(); @Override protected void setupTopBarLayout() { @@ -32,8 +46,56 @@ viewBinding.titleBarLayout.dateView.setText(TimeOrDateUtil.timestampToYearMonth(System.currentTimeMillis())); viewBinding.wholeCircleProgressBar.setCurrentValue(80); //初始化折线图 + viewBinding.lineChart.setDrawGridBackground(false); + viewBinding.lineChart.setDrawBorders(false); Calendar calendar = Calendar.getInstance(); - int maximum = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); + int maxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); + //TODO 这是模拟数据 + for (int i = 0; i < maxDay; i++) { + totalEntries.add(new Entry(i, new Random().nextInt(100), "total")); + } + for (int i = 0; i < maxDay; i++) { + handleEntries.add(new Entry(i, new Random().nextInt(80), "handle")); + } + //设置样式 + YAxis rightAxis = viewBinding.lineChart.getAxisRight(); + //设置图表右边的y轴禁用 + rightAxis.setEnabled(false); + YAxis leftAxis = viewBinding.lineChart.getAxisLeft(); + //设置x轴 + XAxis xAxis = viewBinding.lineChart.getXAxis(); + xAxis.setTextColor(ContextCompat.getColor(context, R.color.textColor)); + xAxis.setTextSize(12f); + xAxis.setAxisMinimum(0f); + xAxis.setAxisMaximum(maxDay); + xAxis.setDrawLabels(true);//绘制标签 指x轴上的对应数值 + xAxis.setDrawAxisLine(true);//是否绘制轴线 + xAxis.setDrawGridLines(false);//设置x轴上每个点对应的线 + xAxis.setGranularity(1f);//禁止放大后x轴标签重绘 + xAxis.setPosition(XAxis.XAxisPosition.BOTTOM); + //去掉描述 + Description description = new Description(); + description.setEnabled(false); + viewBinding.lineChart.setDescription(description); + //添加自定义Marker + DetailsMarkerView detailsMarkerView = new DetailsMarkerView(this); + detailsMarkerView.setChartView(viewBinding.lineChart); + viewBinding.lineChart.setMarker(detailsMarkerView); + //设置数据 + LineDataSet totalDataSet = new LineDataSet(totalEntries, "上报案卷"); + totalDataSet.setColor(ContextCompat.getColor(context, R.color.warnColor));//线条颜色 + totalDataSet.setCircleColor(ContextCompat.getColor(context, R.color.warnColor));//圆点颜色 + lineDataSets.add(totalDataSet); + + LineDataSet handleDataSet = new LineDataSet(handleEntries, "已处理案卷"); + handleDataSet.setColor(ContextCompat.getColor(context, R.color.onLineColor));//线条颜色 + handleDataSet.setCircleColor(ContextCompat.getColor(context, R.color.onLineColor));//圆点颜色 + lineDataSets.add(handleDataSet); + + LineData lineData = new LineData(lineDataSets); + lineData.setDrawValues(false); + viewBinding.lineChart.setData(lineData); + viewBinding.lineChart.invalidate(); } @Override diff --git a/app/src/main/java/com/casic/dcms/widgets/DetailsMarkerView.java b/app/src/main/java/com/casic/dcms/widgets/DetailsMarkerView.java new file mode 100644 index 0000000..7321c43 --- /dev/null +++ b/app/src/main/java/com/casic/dcms/widgets/DetailsMarkerView.java @@ -0,0 +1,59 @@ +package com.casic.dcms.widgets; + +import android.content.Context; +import android.widget.TextView; + +import com.casic.dcms.R; +import com.github.mikephil.charting.components.MarkerView; +import com.github.mikephil.charting.data.Entry; +import com.github.mikephil.charting.highlight.Highlight; +import com.github.mikephil.charting.utils.MPPointF; + +import java.text.DecimalFormat; +import java.util.Calendar; +import java.util.Locale; + +public class DetailsMarkerView extends MarkerView { + + private final DecimalFormat decimalFormat = new DecimalFormat("##0"); + private final TextView dayView; + private final TextView dataView; + + public DetailsMarkerView(Context context) { + super(context, R.layout.popu_marker); + dayView = findViewById(R.id.dayView); + dataView = findViewById(R.id.dataView); + } + + //每次重绘,会调用此方法刷新数据 + @Override + public void refreshContent(Entry e, Highlight highlight) { + super.refreshContent(e, highlight); + String data = (String) e.getData(); + try { + if (e.getY() == 0) { + dataView.setText("暂无数据"); + } else { + String type = ""; + if (data.equals("total")) { + type = "新增"; + } else { + type = "已处理"; + } + dataView.setText(String.format(Locale.CHINA, "%s:%s件", type, decimalFormat.format(e.getY()))); + } + Calendar calendar = Calendar.getInstance(); + int month = calendar.get(Calendar.MONTH) + 1; + int day = (int) (e.getX() + 1); + dayView.setText(String.format(Locale.CHINA, "%d月%s日", month, day)); + } catch (Exception e1) { + e1.printStackTrace(); + } + super.refreshContent(e, highlight); + } + + @Override + public MPPointF getOffset() { + return new MPPointF(-(getWidth() >> 1), -getHeight()); + } +} diff --git a/app/src/main/res/drawable/bg_layout_blue.xml b/app/src/main/res/drawable/bg_layout_blue.xml new file mode 100644 index 0000000..26ddc25 --- /dev/null +++ b/app/src/main/res/drawable/bg_layout_blue.xml @@ -0,0 +1,11 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_text_tag_blue.xml b/app/src/main/res/drawable/bg_text_tag_blue.xml new file mode 100644 index 0000000..6b497b0 --- /dev/null +++ b/app/src/main/res/drawable/bg_text_tag_blue.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_trend_analysis.xml b/app/src/main/res/layout/activity_trend_analysis.xml index d26d9b1..7adcf2d 100644 --- a/app/src/main/res/layout/activity_trend_analysis.xml +++ b/app/src/main/res/layout/activity_trend_analysis.xml @@ -147,7 +147,7 @@ + android:layout_height="180dp" /> diff --git a/app/src/main/res/layout/popu_marker.xml b/app/src/main/res/layout/popu_marker.xml new file mode 100644 index 0000000..bd21d19 --- /dev/null +++ b/app/src/main/res/layout/popu_marker.xml @@ -0,0 +1,27 @@ + + + + + + + \ No newline at end of file