先看一下念书APP效果

lxf2023-05-15 00:53:25

先看一下念书APP效果:

先看一下念书APP效果

弹出窗口滑下来动时,上方的标示条也会随之往下弯折变为箭头符号样子。

剖析

废话不多说,先给标示条做一个X光查验看一下:

先看一下念书APP效果

  1. 未滚动时标示条便是一个普通的圆角
  2. 滚动的时候是一个箭头,箭头符号的两边是两个圆

标示条从点S滚动到点T环节中,圆L圆K的断线交叉产生箭头符号。箭头符号根据Path圆心点L点T圆心点K相互连接,转角处还要解决为圆弧,可以用PaintsetStrokeJoin()方式,此方法设定直线相接处的样式,选值有三个:

Paint.Join.MITER //钝角  
Paint.Join.Round //弧形  
Paint.Join.BEVEL //平行线

这儿取Round,该值的处理方式要以点T为圆心点、标示条相对高度的一半为直径画弧形,联接转角,如下图:

先看一下念书APP效果 先看一下念书APP效果 到此,标示条总体相对高度就确认了,便是QH长度,即ST 标示条相对高度

完成

最先给标示条特定一个最高可弯折高度值bendingHeight,现阶段弯折比例为bendingRatio

  • onMeasure()精确测量宽高比:
  1. 当弯折占比相当于0时,测高度便是标示条相对高度
  2. 当弯折占比超过0时,测高度便是标示条相对高度 弯折相对高度
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int width = MeasureSpec.getSize(widthMeasureSpec);
    int hMode = MeasureSpec.getMode(heightMeasureSpec);
    int hSize = MeasureSpec.getSize(heightMeasureSpec);
    int height;
    if (hMode == MeasureSpec.EXACTLY) {
        height = hSize;
    } else {
        if (bendingRatio <= 0) {
            height = barHeight   getPaddingTop()   getPaddingBottom();
        } else {
            int h = (int) (barHeight   bendingHeight * bendingRatio);
            height = Math.min(h   getPaddingTop()   getPaddingBottom(), hSize);
        }
    }
    setMeasuredDimension(width, height);
}
  • onDraw()制作,
  1. 当弯折占比相当于0时,制作圆角就可以
  2. 当弯折占比超过0时,先用Path制作箭头符号,再制作两边的圆
@Override
protected void onDraw(Canvas canvas) {
    float radius = barHeight / 2f;
    if (bendingRatio <= 0) {
        rectF.set(getPaddingLeft(), getPaddingTop(),
                getWidth() - getPaddingRight(), getPaddingTop()   barHeight);
        barPaint.setStyle(Paint.Style.FILL);
        canvas.drawRoundRect(rectF, radius, radius, barPaint);
    } else {
        path.reset();
        path.moveTo(getPaddingLeft()   radius, getPaddingTop()   radius);
        float x = getPaddingLeft()   (getWidth() - getPaddingLeft() - getPaddingRight()) / 2f;
        float y = getPaddingTop()   barHeight / 2f   bendingHeight * bendingRatio;
        path.lineTo(x, y);
        path.lineTo(getWidth() - getPaddingRight() - radius, getPaddingTop()   radius);
        barPaint.setStyle(Paint.Style.STROKE);
        canvas.drawPath(path, barPaint);
        canvas.drawCircle(getPaddingLeft()   radius, getPaddingTop()   radius,
                radius, circlePaint);
        canvas.drawCircle(getWidth() - getPaddingRight() - radius, getPaddingTop()   radius,
                radius, circlePaint);
    }
}

最后就必须启用setBendingRatio()方式即时变更弯折占比就可以。

实际效果

先看一下念书APP效果

到这儿文章内容就水完后,有写的不好的区域还望强调。 参照联接:SlidingIndicatorBar-项目地址

本站是一个以CSS、JavaScript、Vue、HTML为中心的前端开发技术网址。我们的使命是为众多前端工程师者提供全方位、全方位、好用的前端工程师专业知识和技术服务。 在网站上,大家可以学到最新前端开发技术,掌握前端工程师最新发布的趋势和良好实践。大家提供大量实例教程和实例,让大家可以快速上手前端工程师的关键技术和程序。 本站还提供了一系列好用的工具软件,帮助你更高效地开展前端工程师工作中。公司提供的一种手段和软件都要经过精心策划和改进,能够帮助你节约时间精力,提高研发效率。 此外,本站还拥有一个有活力的小区,你可以在社区里与其它前端工程师者沟通交流技术性、交流经验、处理问题。我们坚信,街道的能量能够帮助你能够更好地进步与成长。 在网站上,大家可以寻找你需要的一切前端工程师网络资源,使您成为一名更加出色的网页开发者。欢迎你添加我们的大家庭,一起探索前端工程师的无限潜能!