package com.hjx.parent; import android.annotation.SuppressLint; import android.content.Intent; import android.content.res.ColorStateList; import android.graphics.Bitmap; import android.net.Uri; import android.os.Bundle; import android.text.Html; import android.view.View; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.content.res.ResourcesCompat; import com.bumptech.glide.Glide; import com.chad.library.adapter.base.BaseQuickAdapter; import com.chad.library.adapter.base.BaseViewHolder; import com.github.mikephil.charting.components.Legend; 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.formatter.ValueFormatter; import com.hjx.parent.databinding.ActivityHuyouDetailBinding; import com.hjx.parent.rx.BaseRxActivity; import com.prws.common.bean.Student; import com.prws.common.bean.homework.StDetail; import com.prws.common.net.NetWorks; import com.prws.common.utils.BitmapUtils; import com.prws.common.utils.ContentUtil; import com.trello.rxlifecycle2.android.RxLifecycleAndroid; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Locale; import java.util.TimeZone; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.schedulers.Schedulers; public class HuyouDetailActivity extends BaseRxActivity { private String id; private int type; // 0:周 1:阶段 private Student student; private StDetail mData; final String indent = "        "; private boolean a4 = false; @Override protected void onResume() { super.onResume(); binding.root.postDelayed(() -> { float scale = 1f * binding.getRoot().getWidth() / binding.root.getWidth(); if (scale >= 1) return; binding.root.setScaleX(scale); binding.root.setScaleY(scale); }, 100); } @SuppressLint("CheckResult") @Override public void initView(Bundle savedInstanceState) { id = getIntent().getStringExtra("id"); type = getIntent().getIntExtra("type", 0); student = (Student) getIntent().getSerializableExtra("student"); if (type == 1) binding.tvTitle.setText("阶段作业学习总结"); Glide.with(this).load(student.photo).into(binding.ivAvatar); binding.tvStuName.setText(student.stuName); setupChart(); NetWorks.service_url.getHuyouDetail(NetWorks.getHeader(), id) .subscribeOn(Schedulers.io()) .map(response -> response.getData()) .map(data -> { if (type == 1) data.formatCollection(); return data; }) .observeOn(AndroidSchedulers.mainThread()) .compose(RxLifecycleAndroid.bindActivity(getRxLifecycle())) .subscribe((data, th) -> { mData = data; if (th != null) th.printStackTrace(); if (data != null) showData(data); }); binding.btnShare.setOnClickListener(v -> { Uri shareUri = prepareShare(); if (shareUri != null) { Intent shareIntent = new Intent(Intent.ACTION_SEND); shareIntent.setType("image/jpeg"); shareIntent.putExtra(Intent.EXTRA_STREAM, shareUri); shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); startActivity(shareIntent); } }); binding.btnSwitch.setOnClickListener(v -> { switchPage(); }); } private SimpleDateFormat getFormatWithGmt8(String pattern) { SimpleDateFormat format = new SimpleDateFormat(pattern, Locale.CHINA); format.setTimeZone(TimeZone.getTimeZone("GMT+16")); return format; } @SuppressLint("SetTextI18n") private void showData(StDetail data) { binding.tvGrade.setText(data.grade); binding.tvSubject.setText(data.homeworkSubject); String start = getFormatWithGmt8("yyyy.M.d").format(data.startTime); String end = new SimpleDateFormat(" - M.d", Locale.CHINA).format(data.endTime); binding.tvDate.setText(start + end); if (data.points == null) data.points = new ArrayList<>(); if (data.points.size() == 0) { binding.cpBefore.setValue(0); binding.cpAfter.setValue(0); binding.pgBefore.setText("0"); binding.pgAfter.setText("0"); } else { float before = 0; float after = 0; for (StDetail.Point point: data.points) { before += point.beforeState; after += point.afterState; } before = (int) (100f * before / data.points.size() + 0.5f); after = (int) (100f * after / data.points.size() + 0.5f); binding.cpBefore.setValue(before); binding.cpAfter.setValue(after); DecimalFormat format = new DecimalFormat("0"); binding.pgBefore.setText(format.format(before)); binding.pgAfter.setText(format.format(after)); String comment; if (after >= 90) { comment = "知识点掌握的比较扎实,多练习多巩固掌握一般的知识点会有很大帮助。"; } else if (after >= 80) { comment = "知识点掌握程度有进步,还要再继续学习,多练习,不断巩固。"; } else if (after >= 60) { comment = "薄弱知识点还有进步空间,再多做一些类似题目来巩固知识点,继续努力。"; } else { comment = "你的薄弱知识点还需要再深入了解,有不清楚的地方及时问老师,继续加油。"; } String percent = new DecimalFormat("0%").format(after / 100); String temp = indent + "通过学习,你的薄弱知识点掌握程度为 %s," + comment; temp = String.format(temp, fromColor(percent, "#F24E38")); binding.tvWeakRate.setText(Html.fromHtml(temp, Html.FROM_HTML_MODE_COMPACT)); } binding.tvTotalRate.setText(new DecimalFormat("0").format(100f * data.correct / data.total)); binding.tvTotalCorrect.setText(String.valueOf(data.correct)); binding.tvTotalError.setText(String.valueOf(data.total - data.correct)); if (data.total == 0) { binding.tvRating.setText(""); } else { float rate = 100f * data.correct / data.total; String comment; if (rate >= 90) { comment = "掌握程度比较优秀,你对知识的理解和运用能力非常强,这是你努力的结果。请继续保持这份优秀,在未来的学习中,可以继续挑战更难的题目,勇攀高峰。"; } else if (rate >= 80) { comment = "掌握良好。接下来,跟随老师的学习规划,针对薄弱环节重点突破。加油,只要持之以恒,坚持下去,你一定会更加出色。"; } else if (rate >= 60) { comment = "掌握程度一般。不过别灰心,你有提升的潜力。跟随老师的步伐,制定合理的学习计划,多做一些练习题来巩固知识。老师相信你一定可以做到。"; } else { comment = "掌握程度较为薄弱。但不要放弃,这正是你奋起直追的好时机。认真分析自己的问题,从基础开始逐步提升。老师会一直支持你,只要你有决心,就没有克服不了的困难。"; } String rateStr = new DecimalFormat("0%").format(rate / 100f); String temp; if (type == 0) { temp = indent + "在本周作业中,你的综合正确率是 %s," + comment; } else { temp = indent + "你的综合正确率是 %s," + comment; } temp = String.format(temp, fromColor(rateStr, "#3BC3B6")); binding.tvRating.setText(Html.fromHtml(temp, Html.FROM_HTML_MODE_COMPACT)); } List entries = new ArrayList<>(); if (type == 0) { entries.add(new Entry(1, data.mondayCorrection)); entries.add(new Entry(2, data.tuesdayCorrection)); entries.add(new Entry(3, data.wednesdayCorrection)); entries.add(new Entry(4, data.thursdayCorrection)); entries.add(new Entry(5, data.fridayCorrection)); } else { for (int i = 0; i < data.correctionList.size(); i ++) { StDetail.Correction c = data.correctionList.get(i); entries.add(new Entry(i, c.correction)); } XAxis xAxis = binding.lineChart.getXAxis(); xAxis.setLabelCount(Math.min(entries.size(), 5), true); xAxis.setValueFormatter(new ValueFormatter() { SimpleDateFormat format = new SimpleDateFormat("M.d", Locale.CHINA); @Override public String getFormattedValue(float value) { int index = (int) value; if (index < 0 || index >= data.correctionList.size()) return ""; Date date = data.correctionList.get(index).date; return format.format(date); } }); } LineDataSet set = new LineDataSet(entries, ""); set.setColor(0xFF3BC3B6); set.setCircleColor(0xFF3BC3B6); set.setDrawFilled(true); set.setDrawCircles(type == 0 || entries.size() == 1); set.setDrawValues(false); set.setHighlightEnabled(false); set.setDrawHighlightIndicators(false); set.setFillDrawable(ResourcesCompat.getDrawable(getResources(), R.drawable.bg_line_chart_fill2, null)); binding.lineChart.setData(new LineData(set)); binding.lineChart.invalidate(); if (!data.points.isEmpty()) { int exNo = 0, goodNo = 0, normalNo = 0, weakNo = 0; float total = 0; for (StDetail.Point point: data.points) { total += point.afterState; if (point.afterState >= 0.9) { exNo ++; } else if (point.afterState >= 0.8) { goodNo ++; } else if (point.afterState >= 0.6) { normalNo ++; } else { weakNo ++; } } binding.tvExcellent.setText(String.valueOf(exNo)); binding.tvGood.setText(String.valueOf(goodNo)); binding.tvNormal.setText(String.valueOf(normalNo)); binding.tvWeak.setText(String.valueOf(weakNo)); float exRate = 100f * exNo / data.points.size(); float goodRate = 100f * goodNo / data.points.size(); float normalRate = 100f * normalNo / data.points.size(); float weakRate = 100f * weakNo / data.points.size(); binding.cpGood.setValue(goodRate + normalRate + weakRate); binding.cpNormal.setValue(normalRate + weakRate); binding.cpWeak.setValue(weakRate); binding.tvAvePoint.setText(new DecimalFormat("0").format(100f * total / data.points.size())); } List points = new ArrayList<>(); for (StDetail.Point point: data.points) { if (point.beforeState < 1) points.add(point); } binding.tableRoot.setClipToOutline(true); binding.rvPoint.setAdapter(new Adapter(points)); binding.tableRoot.setVisibility(points.isEmpty() ? View.GONE : View.VISIBLE); binding.flPointDesc.setVisibility(points.isEmpty() ? View.GONE : View.VISIBLE); binding.flEmptyPoints.setVisibility(points.isEmpty() ? View.VISIBLE : View.GONE); } private void setupChart() { binding.lineChart.getLegend().setForm(Legend.LegendForm.NONE); binding.lineChart.setScaleEnabled(false); binding.lineChart.setTouchEnabled(false); binding.lineChart.setDescription(null); binding.lineChart.getAxisRight().setEnabled(false); YAxis yAxis = binding.lineChart.getAxisLeft(); yAxis.setDrawAxisLine(false); yAxis.setDrawGridLines(true); yAxis.setGridColor(0xFFDDDDDD); yAxis.setTextColor(0xFF333333); if (type == 0) { yAxis.setTextSize(16); yAxis.setXOffset(16); } else { yAxis.setTextSize(13); } yAxis.setAxisMinimum(0); yAxis.setAxisMaximum(1); yAxis.setLabelCount(5, true); yAxis.setValueFormatter(new ValueFormatter() { @Override public String getFormattedValue(float value) { return new DecimalFormat("0%").format(value); } }); XAxis xAxis = binding.lineChart.getXAxis(); xAxis.setPosition(XAxis.XAxisPosition.BOTTOM); xAxis.setDrawAxisLine(false); xAxis.setDrawGridLines(false); xAxis.setTextColor(0xFF333333); xAxis.setTextSize(16); xAxis.setYOffset(16); if (type == 0) { xAxis.setAxisMinimum(0.5f); xAxis.setAxisMaximum(5.5f); xAxis.setLabelCount(11, true); xAxis.setValueFormatter(new ValueFormatter() { @Override public String getFormattedValue(float value) { if (value == 1) { return "周一"; } else if (value == 2) { return "周二"; } else if (value == 3) { return "周三"; } else if (value == 4) { return "周四"; } else if (value == 5) { return "周五"; } return ""; } }); } else { xAxis.setTextSize(13); } } private String fromColor(String str, String color) { return String.format("%s", color, str); } private void switchPage() { Intent intent = new Intent(getIntent()); intent.putExtra("a4", !a4); startActivity(intent); finish(); } private Uri prepareShare() { try { binding.toolbar.setVisibility(View.INVISIBLE); Bitmap bitmap = BitmapUtils.shotView(binding.root); binding.toolbar.setVisibility(View.VISIBLE); String fileName = student.stuName + "_周作业学习报告_" + System.currentTimeMillis(); return ContentUtil.saveBitmapToGallery(this, bitmap, fileName); } catch (Exception e) { e.printStackTrace(); } return null; } @Override protected ActivityHuyouDetailBinding getViewBinding() { a4 = getIntent().getBooleanExtra("a4", false); View view; if (a4) view = getLayoutInflater().inflate(R.layout.activity_huyou_detail_a4, null); else view = getLayoutInflater().inflate(R.layout.activity_huyou_detail, null); return ActivityHuyouDetailBinding.bind(view); } public static class Adapter extends BaseQuickAdapter { public Adapter(@Nullable List data) { super(R.layout.item_huyou_point, data); } @Override protected void convert(@NonNull BaseViewHolder holder, StDetail.Point point) { DecimalFormat format1 = new DecimalFormat("0%"); DecimalFormat format2 = new DecimalFormat("0"); holder.setText(R.id.tvName, point.pointName); holder.setText(R.id.tvBefore, format1.format(point.beforeState)); holder.setText(R.id.tvAfter, format1.format(point.afterState)); holder.setText(R.id.tvGap, format2.format(point.gap * 100)); holder.setGone(R.id.ivFlag, getData().indexOf(point) == 0); holder.getView(R.id.tvName).setTooltipText(point.pointName); TextView before = holder.getView(R.id.tvBeforeState); TextView after = holder.getView(R.id.tvAfterState); if (point.beforeState >= 0.9) { before.setText("掌握优秀"); before.setBackgroundTintList(ColorStateList.valueOf(0xFF4FBB7A)); } else if (point.beforeState >= 0.8) { before.setText("掌握良好"); before.setBackgroundTintList(ColorStateList.valueOf(0xFF489AFA)); } else if (point.beforeState >= 0.6) { before.setText("掌握一般"); before.setBackgroundTintList(ColorStateList.valueOf(0xFFF58725)); } else { before.setText("掌握薄弱"); before.setBackgroundTintList(ColorStateList.valueOf(0xFFEA5127)); } if (point.afterState >= 0.9) { after.setText("掌握优秀"); after.setBackgroundTintList(ColorStateList.valueOf(0xFF4FBB7A)); } else if (point.afterState >= 0.8) { after.setText("掌握良好"); after.setBackgroundTintList(ColorStateList.valueOf(0xFF489AFA)); } else if (point.afterState >= 0.6) { after.setText("掌握一般"); after.setBackgroundTintList(ColorStateList.valueOf(0xFFF58725)); } else { after.setText("掌握薄弱"); after.setBackgroundTintList(ColorStateList.valueOf(0xFFEA5127)); } holder.setText(R.id.tvHuyou, format1.format(point.correctness)); } } }