package cn.flightfeather.thirdappmodule.dataanalysis
|
|
import android.content.Context
|
import android.graphics.Color
|
import android.os.Bundle
|
import android.support.v4.app.Fragment
|
import android.support.v7.widget.DividerItemDecoration
|
import android.support.v7.widget.LinearLayoutManager
|
import android.view.LayoutInflater
|
import android.view.View
|
import android.view.ViewGroup
|
import butterknife.ButterKnife
|
import butterknife.Unbinder
|
import cn.flightfeather.thirdappmodule.R
|
import cn.flightfeather.thirdappmodule.adapter.AllRecyclerViewAdapter
|
import cn.flightfeather.thirdappmodule.bean.vo.TaskVo
|
import cn.flightfeather.thirdappmodule.util.CommonUtils
|
import com.github.mikephil.charting.animation.Easing
|
import com.github.mikephil.charting.components.AxisBase
|
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.BarData
|
import com.github.mikephil.charting.data.BarDataSet
|
import com.github.mikephil.charting.data.BarEntry
|
import com.github.mikephil.charting.formatter.IAxisValueFormatter
|
import com.github.mikephil.charting.formatter.PercentFormatter
|
import kotlinx.android.synthetic.main.dialog_anysis_sub_progress.*
|
import java.text.DecimalFormat
|
import java.text.SimpleDateFormat
|
import java.util.*
|
|
/**
|
* 2018.11.09
|
* @author riku
|
* 顶层任务的详细进度信息
|
*/
|
class ProgressDetailFragment : Fragment() {
|
//需要activity传入一个具体的顶层任务对象,用于显示其详细进度信息
|
private var taskProgressVo: TaskVo? = null
|
private var unbinder: Unbinder? = null
|
override fun onCreate(savedInstanceState: Bundle?) {
|
super.onCreate(savedInstanceState)
|
if (arguments != null) {
|
taskProgressVo = arguments!!.getSerializable(ARG_PARAM1) as TaskVo
|
}
|
}
|
|
override fun onCreateView(
|
inflater: LayoutInflater, container: ViewGroup?,
|
savedInstanceState: Bundle?
|
): View? {
|
val view = inflater.inflate(R.layout.dialog_anysis_sub_progress, container, false)
|
unbinder = ButterKnife.bind(this, view)
|
initUI()
|
initStandardBarchart()
|
return view
|
}
|
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
super.onViewCreated(view, savedInstanceState)
|
}
|
|
override fun onAttach(context: Context) {
|
super.onAttach(context)
|
}
|
|
override fun onDetach() {
|
super.onDetach()
|
}
|
|
override fun onDestroyView() {
|
super.onDestroyView()
|
unbinder!!.unbind()
|
}
|
|
private fun initUI() {
|
val decimalFormat = DecimalFormat("#0.00")
|
tv_total_progress!!.isSelected = true
|
tv_top_task!!.text = taskProgressVo!!.name
|
//根据任务类型选择不同的图标
|
iv_top_task!!.setImageResource(CommonUtils.getIconByTaskType(taskProgressVo!!.typeno.toString()))
|
//数据
|
val daytaskprogresslist = ArrayList<TaskVo>()
|
daytaskprogresslist.addAll(taskProgressVo!!.daytaskList) //当前顶层任务的所有日任务
|
|
//设置列表显示对其方式
|
val layoutManager1 = LinearLayoutManager(activity)
|
layoutManager1.orientation = LinearLayoutManager.VERTICAL
|
rv_dialog_task_progress!!.layoutManager = layoutManager1
|
rv_dialog_task_progress!!.addItemDecoration(DividerItemDecoration(activity, DividerItemDecoration.VERTICAL))
|
//**总进度列表
|
val adapter1: AllRecyclerViewAdapter<TaskVo> = object : AllRecyclerViewAdapter<TaskVo>(daytaskprogresslist, R.layout.item_day_task_progress, activity) {
|
override fun bindView(holder: MyViewHolder, obj: TaskVo, bool: Boolean, position: Int) {
|
val simpleDateFormat = SimpleDateFormat("MM月dd日")
|
holder.setText(R.id.tv_item1, simpleDateFormat.format(obj.starttime))
|
holder.setText(R.id.tv_item2, obj.completetask.toString() + "/" + obj.totaltask.toString())
|
if (obj.totaltask == 0) holder.setText(R.id.tv_item3, NOTASK) else holder.setText(R.id.tv_item3, decimalFormat.format((obj.completetask.toFloat() / obj.totaltask.toFloat() * 100).toDouble()) + "%")
|
}
|
}
|
//**用户进度列表
|
val adapter2: AllRecyclerViewAdapter<TaskVo> = object : AllRecyclerViewAdapter<TaskVo>(daytaskprogresslist, R.layout.item_day_task_progress, activity) {
|
override fun bindView(holder: MyViewHolder, obj: TaskVo, bool: Boolean, position: Int) {
|
val simpleDateFormat = SimpleDateFormat("MM月dd日")
|
holder.setText(R.id.tv_item1, simpleDateFormat.format(obj.starttime))
|
holder.setText(R.id.tv_item2, obj.mycompletetask.toString() + "/" + obj.mytotaltask.toString())
|
if (obj.mytotaltask == 0) holder.setText(R.id.tv_item3, NOTASK) else holder.setText(R.id.tv_item3, decimalFormat.format((obj.mycompletetask.toFloat() / obj.mytotaltask.toFloat() * 100).toDouble()) + "%")
|
}
|
}
|
rv_dialog_task_progress!!.adapter = adapter1
|
tv_total_progress!!.setOnClickListener {
|
tv_total_progress!!.isSelected = true
|
tv_my_progress!!.isSelected = false
|
tv_total_progress!!.setTextColor(Color.WHITE)
|
tv_my_progress!!.setTextColor(Color.BLACK)
|
rv_dialog_task_progress!!.adapter = adapter1
|
}
|
tv_my_progress!!.setOnClickListener {
|
tv_my_progress!!.isSelected = true
|
tv_total_progress!!.isSelected = false
|
tv_my_progress!!.setTextColor(Color.WHITE)
|
tv_total_progress!!.setTextColor(Color.BLACK)
|
rv_dialog_task_progress!!.adapter = adapter2
|
}
|
}
|
|
//</editor-fold>
|
//<editor-fold desc="初始化任务进度直方图">
|
/*
|
柱状图,顶层任务的完成百分比
|
*/
|
private fun initStandardBarchart() {
|
val daytaskprogresslist = taskProgressVo!!.daytaskList //当前顶层任务的所有日任务
|
|
//坐标轴
|
val xAxis = barChart_progress!!.xAxis
|
xAxis.position = XAxis.XAxisPosition.BOTTOM
|
xAxis.setDrawGridLines(false)
|
xAxis.granularity = 1f //坐标间隔
|
// xAxis.setLabelCount(2, true);//进入时的标签个数
|
xAxis.setCenterAxisLabels(true) //标签处于图表中间
|
xAxis.axisMinimum = 0f
|
xAxis.valueFormatter = MyDateFormmater(daytaskprogresslist)
|
val rightAxis = barChart_progress!!.axisRight
|
rightAxis.isEnabled = false
|
// rightAxis.setDrawGridLines(false);
|
// rightAxis.setDrawAxisLine(false);
|
// rightAxis.setDrawLabels(false);
|
val leftAxis = barChart_progress!!.axisLeft
|
leftAxis.setDrawGridLines(false)
|
leftAxis.setDrawAxisLine(false)
|
leftAxis.setDrawLabels(false)
|
leftAxis.setDrawTopYLabelEntry(true)
|
leftAxis.zeroLineColor = Color.BLACK
|
leftAxis.setDrawZeroLine(true)
|
leftAxis.axisMinimum = 0f
|
leftAxis.axisMaximum = 100f
|
leftAxis.valueFormatter = PercentFormatter()
|
// LimitLine limitLine = new LimitLine(100f);
|
// limitLine.setLineColor(Color.BLACK);
|
// leftAxis.addLimitLine(limitLine);
|
|
//Entry数据
|
val totalEntries: MutableList<BarEntry> = ArrayList()
|
//每日总任务进度
|
val userEntries: MutableList<BarEntry> = ArrayList()
|
//每日用户进度
|
//Test*********
|
// totalEntries.add(new BarEntry(0f, 0f));
|
// totalEntries.add(new BarEntry(1f, 0f));
|
// totalEntries.add(new BarEntry(2f, 40f));
|
// totalEntries.add(new BarEntry(3f, 70f));
|
// totalEntries.add(new BarEntry(4f, 80f));
|
// totalEntries.add(new BarEntry(5f, 50f));
|
// totalEntries.add(new BarEntry(6f, 30f));
|
// totalEntries.add(new BarEntry(7f, 10f));
|
//
|
// userEntries.add(new BarEntry(0f, 0f));
|
// userEntries.add(new BarEntry(1f, 60f));
|
// userEntries.add(new BarEntry(2f, 70));
|
// userEntries.add(new BarEntry(3f, 70));
|
// userEntries.add(new BarEntry(4f, 35));
|
// userEntries.add(new BarEntry(5f, 35));
|
// userEntries.add(new BarEntry(6f, 35));
|
// userEntries.add(new BarEntry(7f, 35));
|
//*************
|
for (i in daytaskprogresslist.indices) { //初始化数据
|
var y1 = daytaskprogresslist[i].totaltask.toFloat()
|
y1 = if (y1 != 0f) daytaskprogresslist[i].completetask.toFloat() / daytaskprogresslist[i].totaltask.toFloat() * 100 else 100f
|
totalEntries.add(BarEntry(i.toFloat(), y1))
|
var y2 = daytaskprogresslist[i].mytotaltask.toFloat()
|
y2 = if (y2 != 0f) daytaskprogresslist[i].mycompletetask.toFloat() / daytaskprogresslist[i].mytotaltask.toFloat() * 100 else 100f
|
userEntries.add(BarEntry(i.toFloat(), y2))
|
}
|
val barDataSetTotal = BarDataSet(totalEntries, "总进度")
|
val barDataSetUser = BarDataSet(userEntries, "我的进度")
|
barDataSetTotal.axisDependency = YAxis.AxisDependency.LEFT
|
// barDataSetTotal.setAxisDependency(YAxis.AxisDependency.RIGHT);
|
barDataSetUser.axisDependency = YAxis.AxisDependency.LEFT
|
// barDataSetUser.setAxisDependency(YAxis.AxisDependency.RIGHT);
|
barDataSetTotal.color = Color.argb(128, 255, 0, 0)
|
barDataSetUser.color = Color.argb(128, 0, 255, 0)
|
val groupSpace = 0.06f
|
val barSpace = 0.02f // x2 dataset
|
val barWidth = 0.45f // x2 dataset
|
// (0.02 + 0.45) * 2 + 0.06 = 1.00 -> interval per "group"
|
val barData = BarData(barDataSetTotal, barDataSetUser)
|
// BarData barData = new BarData(barDataSetTotal);
|
barData.setValueFormatter(PercentFormatter())
|
barData.setValueTextSize(8f)
|
barData.isHighlightEnabled = false //高亮
|
barData.barWidth = barWidth
|
if (!totalEntries.isEmpty() || !userEntries.isEmpty()) { //数据全为空时,不显示
|
barChart_progress!!.data = barData
|
barChart_progress!!.setFitBars(true) //x轴坐标显示对应每个bar
|
barChart_progress!!.groupBars(0f, groupSpace, barSpace)
|
}
|
|
//General Chart Settings & Styling
|
barChart_progress!!.setNoDataText("任务还未开始执行,暂无数据") //Sets the title that should appear if the chart is empty.
|
// mStandardChart.setDrawBorders(false);//Enables / disables drawing the chart borders (lines surrounding the chart).
|
//图标描述
|
val description = Description()
|
description.text = ""
|
barChart_progress!!.description = description
|
|
// mStandardChart.setTouchEnabled(true);//触摸
|
// mStandardChart.setDragEnabled(true);//拖拽
|
barChart_progress!!.setScaleEnabled(false) //缩放
|
barChart_progress!!.animateY(1400, Easing.EasingOption.EaseOutSine)
|
barChart_progress!!.fitScreen()
|
|
//视图设置
|
barChart_progress!!.setVisibleXRangeMaximum(6f)
|
barChart_progress!!.setVisibleXRangeMinimum(6f)
|
|
// mStandardChart.invalidate();
|
}
|
|
//</editor-fold>
|
internal inner class MyDateFormmater(daytaskprogresslist: List<TaskVo>) : IAxisValueFormatter {
|
var mFormat: DecimalFormat
|
var daytaskprogresslist: List<TaskVo>
|
var simpleDateFormat = SimpleDateFormat("dd日")
|
override fun getFormattedValue(value: Float, axis: AxisBase): String {
|
return try {
|
simpleDateFormat.format(daytaskprogresslist[value.toInt()].starttime)
|
} catch (e: Exception) {
|
e.printStackTrace()
|
""
|
}
|
}
|
|
init {
|
mFormat = DecimalFormat("###,###,##0")
|
this.daytaskprogresslist = daytaskprogresslist
|
}
|
}
|
|
companion object {
|
private const val ARG_PARAM1 = "taskProgressVo" //参数标签
|
|
/**
|
* Use this factory method to create a new instance of
|
* this fragment using the provided parameters.
|
*
|
* @param taskProgressVo
|
* @return A new instance of fragment ProgressDetailFragment.
|
*/
|
// TODO: Rename and change types and number of parameters
|
fun newInstance(taskProgressVo: TaskVo?): ProgressDetailFragment {
|
val fragment = ProgressDetailFragment()
|
val args = Bundle()
|
args.putSerializable(ARG_PARAM1, taskProgressVo)
|
fragment.arguments = args
|
return fragment
|
}
|
|
//<editor-fold desc="初始化界面UI">
|
private const val NOTASK = "无任务"
|
}
|
}
|