国际惯例,效果图。
这个是周日历,日期自动计算高亮,接受单击切换。
需求。
需求关键部分:当天日期高亮。
分析
1.可以用现成的日历框架(太懒的做法,好像也没看到周日历效果)
2.把星期的名字用LinearLayout
(WeightSum=7)里添加平分的TextView
(weight=1)来实现, 可以,但是七个TextView
有点多。
3.相同的ConstraintLayout
里ChainStyle的形式添加7个TextView
(太多的xml属性要写)。
4.用ListView
实现(被RecyclerView
取代了)。
5.用RecyclerView
实现。(不能提现出RecylerView
各种缓存,服用机制的优越性)。
最后决定:用View
来实现。
(一次实现可能有点费劲。先画星期的名字)。
实现
先把View
七等分,然后每一个小点进行文字的绘制(Tips:开始的时候加一点距离,这样‘一’的位置刚好在预示的位置)。
本文只把View的关键代码贴上去。
- 重写
onMeasure
方法,保证宽度等于屏幕宽度,高度为20dp。
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
setMeasuredDimension(measuredWidth, DisplayUtils.dip2px(20F))
}
- 需要的变量
/**
* 屏幕宽度(pixel)
*/
private var len by Delegates.notNull<Int>()
/**
* 打印的文字
*/
private var textArray = arrayOf("一", "二", "三", "四", "五", "六", "日")
/**
* 刷子
*/
private lateinit var mPaint: Paint
需要获取屏幕的宽度像素,有Context对象的地方获取。
len = context.displayMetrics.widthPixels
- 绘制
重写onDraw
方法,按照屏幕宽度的七等分来进行文案绘制。
override fun onDraw(canvas: Canvas?) {
super.onDraw(canvas)
//进行0..6的遍历,画Text
for (i: Int in textArray.indices) {
canvas?.drawText(
textArray[i],
(i * len) / 7F + DisplayUtils.dip2px(20F),
DisplayUtils.dip2px(15F).toFloat(),
mPaint
)
}
canvas?.save()
}
最后效果:
下一篇介绍画日期。