美文网首页
建立自己的王国:Android 自定义封装View(4)-(上)

建立自己的王国:Android 自定义封装View(4)-(上)

作者: 努尔江 | 来源:发表于2021-09-20 02:46 被阅读0次

国际惯例,效果图。


效果图

这个是周日历,日期自动计算高亮,接受单击切换。

需求。

需求图.png

需求关键部分:当天日期高亮。

分析

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的关键代码贴上去。

  1. 重写onMeasure方法,保证宽度等于屏幕宽度,高度为20dp。
   override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec)
        setMeasuredDimension(measuredWidth, DisplayUtils.dip2px(20F))
    }
  1. 需要的变量
   /**
     * 屏幕宽度(pixel)
     */
    private var len by Delegates.notNull<Int>()

    /**
     * 打印的文字
     */
    private var textArray = arrayOf("一", "二", "三", "四", "五", "六", "日")

    /**
     * 刷子
     */
    private lateinit var mPaint: Paint

需要获取屏幕的宽度像素,有Context对象的地方获取。

   len = context.displayMetrics.widthPixels
  1. 绘制
    重写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()
    }

最后效果:


Screenshot_20210920_024340.png

下一篇介绍画日期。

相关文章

网友评论

      本文标题:建立自己的王国:Android 自定义封装View(4)-(上)

      本文链接:https://www.haomeiwen.com/subject/qqzywltx.html