03.MPAndroidChart堆叠柱状图自定义显示MarkView

先上一张效果图

/**
 * 堆叠柱状图的mark_view
 */
@SuppressLint("ViewConstructor")
public class BarChartMarkView extends MarkerView {

    private TextView mDateTv;
    private BarData mBarData;
    private RecyclerView mMarkRv;
    private RelativeLayout mMarkRl;
    private List<String> mDateList;
    private int[] mLineColorArr = {0xff45D6E1, 0xff675AAD, 0xffFB80D8, 0xff0e7e71, 0xff0066cc, 0xffFF8040, 0xffDD5246, 0xffF2350D};

    public BarChartMarkView(Context context, List<String> dateList, BarData barData) {
        super(context, R.layout.multi_mark_view);
        mMarkRl = findViewById(R.id.mark_rl);
        mDateTv = findViewById(R.id.date_tv);
        mMarkRv = findViewById(R.id.mark_rv);
        mMarkRv.setLayoutManager(new LinearLayoutManager(context));
        this.mDateList = dateList;
        this.mBarData = barData;
    }

    private List<MarkBean> setMarkData(BarEntry entry) {
        List<MarkBean> markBeanList = new ArrayList<>();
        BarDataSet barDataSet = (BarDataSet) mBarData.getDataSetByIndex(0);
        for (int i = 0; i < barDataSet.getStackLabels().length; i++) {
            MarkBean bean = new MarkBean();
            bean.setName(barDataSet.getStackLabels()[i]);
            try {
                if (i < entry.getYVals().length) {
                    bean.setValue(entry.getYVals()[i] + "");
                } else {
                    break;
                }
            } catch (IndexOutOfBoundsException e) {
                LogUtil.e("-->" + e);
            }
            markBeanList.add(bean);
        }
        return markBeanList;
    }

    // runs every time the MarkerView is redrawn, can be used to update the
    // content (user-interface)
    @Override
    public void refreshContent(Entry entry, Highlight highlight) {
        try {
            mMarkRv.setAdapter(new MarkViewAdapter(setMarkData((BarEntry) entry)));
            mDateTv.setText(mDateList.get((int) entry.getX()));
        } catch (Exception e) {
            LogUtil.e("-->" + e);
        }
        super.refreshContent(entry, highlight);
    }

    @Override
    public MPPointF getOffset() {
        return new MPPointF(-(getWidth() / 2), -getHeight());
    }

    public void setMarkColor(int color) {
        int strokeWidth = 5;// 3dp 边框宽度
        int roundRadius = 15;// 8dp 圆角半径
        GradientDrawable gradientDrawable = new GradientDrawable();
//        gradientDrawable.setColor(Color.parseColor("#eeeeee"));
        gradientDrawable.setCornerRadius(roundRadius);
        gradientDrawable.setStroke(strokeWidth, color);
        mMarkRl.setBackground(gradientDrawable);
    }

    class MarkViewAdapter extends BaseQuickAdapter<MarkBean, BaseViewHolder> {

        MarkViewAdapter(@Nullable List<MarkBean> data) {
            super(R.layout.adapter_multi_mark_view_item, data);
        }

        @Override
        protected void convert(BaseViewHolder helper, MarkBean bean) {
            helper.setText(R.id.name_tv, bean.getName())
                    .setBackgroundColor(R.id.legend_bg, mLineColorArr[helper.getAdapterPosition()])
                    .setTextColor(R.id.name_tv, mLineColorArr[helper.getAdapterPosition()])
                    .setTextColor(R.id.value_tv, mLineColorArr[helper.getAdapterPosition()])
                    .setText(R.id.value_tv, bean.getValue());
        }
    }

    class MarkBean {
        private String name;
        private String value;

        private String getName() {
            return name;
        }

        private void setName(String name) {
            this.name = name;
        }

        private String getValue() {
            return value;
        }

        void setValue(String value) {
            this.value = value;
        }
    }

}

就是由原来简单的布局换成了一个RecyclerView去加载一个带有颜色的列表,看上去就好看了

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值