【Android 自定义 View 实现横行时间轴】// 定义画笔Paint mDatePaint = new Paint();mDatePaint.setColor(Color.parseColor("#666666"));mDatePaint.setTextSize(dip2px(mContext, 12));mDatePaint.setStyle(Paint.Style.FILL);mDatePaint.setTextAlign(Paint.Align.CENTER);mDatePaint.setAntiAlias(true);Paint mNamePain = new Paint();mNamePain.setColor(Color.parseColor("#666666"));mNamePain.setTextSize(dip2px(mContext, 13));mNamePain.setStyle(Paint.Style.FILL);mNamePain.setTextAlign(Paint.Align.CENTER);mNamePain.setAntiAlias(true);// 定义坐标变量float dateX = bX + statusBitmap.getWidth() / 2f;float dateY;dateY = mViewHeight / 2 - dip2px(mContext, 19);// 画文字,在图标上canvas.drawText("有效时间", dateX, dateY, mNamePain);canvas.drawText("09.27-09.29", dateX, dateY - dateTextHeight mDatePaint);// 画文字,在图标下dateY = mViewHeight / 2 + dip2px(mContext, 19);canvas.drawText("09.27-09.29", dateX, dateY, mDatePaint);canvas.drawText("有效时间", dateX, dateY + dateTextHeigh, mNamePain);4. 由局部到整体
上面已经完成了只有一个时间点的绘制,接下来思考如果有多个时间点时如何绘制 。只有一个时间点时计算坐标是以控件的宽高进行计算,那么当有两个时间点的时候需要首先把控件均分成两部分,然后在均分的部分中计算对应的坐标,完成绘制 。当有三个时间点的时候需要均分为三部分,然后在各自的部分计算对应的坐标,完成绘制 。所以得到不论时间点的个数有多少绘制的方法不会改变,需要改变的是绘制时候用到的点的坐标 。其实已经可以看出,当多个点的时候需要循环一下,代码如下:
// 得到多个点时,其中每个部分的宽,itevW 也就等同与上面只有一个时间点时控件的宽float itemW = mViewWidth / mDataList.size();for (int i = 0; i < mDataList.size(); i++) { // 完成相关计算、绘制}

文章插图
5. 完善
到这里,整个分析及绘制就差不多要结束了 。
绘制虚线的方法:mLinePaint.setPathEffect(new DashPathEffect(new float[]{10, 10}, 0));
绘制虚线时遇到一个问题,在手机上不显示虚线效果,后来查到需要关闭 view 层的硬件加速:setLayerType(View.LAYER_TYPE_SOFTWARE, null);
绘制文本时的中心点计算需要注意下,可以 参考
paint、bitmap 等变量的初始化建议放到初始化方法中去做,不建议在 onDraw 方法中做 。
四、总结关于自定义 view 一定要多看,多尝试 。
推荐阅读
- android程序员hook技术之入门篇
- 在Android Studio中创建并引用aar
- iOS和Android OS的内存管理机制,这才是流畅的根本原因
- 防RSS采集,自定义WordPress RSS/Feed订阅发布推送
- 给Android开发者的几点启发性建议
- 找出Android卡顿的元凶——渲染性能优化
- 设置自定义404页面的重要性
- android6.0系统Healthd深入分析
- Google 是如何做 Code Review 的?| 原力计划
- win10下搭建flutter android应用开发环境
