hello啊,各位老铁,说实在话,真的是良久不见,屈指一数,这次断更了有少许时日了,没别的理由,便是懒,不想更[手动捂脸],哈哈,之后尽量会多更一更,现在储藏了有一些技术文章了,后续陆陆续续就写起来了,2023,开年第一篇,搞一个无比简略的自定义View吧。

这个自定义View,其实便是一个简略的进展条,无非便是平行四边形形状的,加了突变以及状况色彩的切换。

今日的内容大致如下:

1、作用及代码详细调用。

2、详细完成进程。

3、开源地址。

4、总结及留意事项。

一、作用及代码详细调用。

作用展现

作用的话,没什么杂乱的,便是一个朴实的平行四边形,无非便是带了一点突变的色彩如下图所示:

一个超简单的渐变平行四边形进度条

一个超简单的渐变平行四边形进度条

一个超简单的渐变平行四边形进度条

一个超简单的渐变平行四边形进度条

此进展条,比较适用于常见的,路程提示,油量多少等需求的场景,进展条的色彩,进展值,以及告警值,都能够动态设置,为了便利咱们运用,咱们能够下载源码检查,或许运用Maven依靠也行,如果运用Maven,能够参照下面的调用方式。

详细调用

1、在你的根项目下的build.gradle文件下,引进maven。

allprojects {
    repositories {
        maven { url "https://gitee.com/AbnerAndroid/almighty/raw/master" }
    }
}

2、在你需求运用的Module中build.gradle文件下,引进依靠。

dependencies {
    implementation 'com.vip:mprogress:1.0.2'
}

代码运用

<com.vip.mprogress.MileageProgress
        android:id="@+id/mp_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

特点介绍

特点 类型 概述
mp_background color 整体的布景色彩
mp_angle_width dimension 平行四边形视点的宽(倾斜度)
mp_anamorphism_color reference 突变色彩(传递色彩数组,定义array资源)
mp_max_progress Int 最大进展
mp_default_progress Int 默许进展
mp_warn_progress Int 告警进展(低于多少就改变进展色彩)
mp_warn_background color 告警色彩
mp_is_dim_progress boolean 是否含糊色彩(进展前进头的色彩)

办法介绍

办法 参数 概述
changeProgress Int 传递进展值

二、详细完成进程

制作一个平行四边形,这儿选用的是path途径制作,只需求记录四点坐标就能够了,也便是四个极点的坐标。

一个超简单的渐变平行四边形进度条

设置默许宽高

宽度和高度,依据在XML中设置得宽高进行适应,这儿需求做一个简略的判别,也便是,如果XML中设置的是wrap_content,咱们尽量给一个默许的宽度或高度,让其展现出来。

设置默许的宽度和高度,需求在onMeasure办法中进行形式判别,当宽度或高度取得的形式为MeasureSpec.AT_MOST,咱们独自给一个默许的值,代码如下:

   override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec)
        val widthMode = MeasureSpec.getMode(widthMeasureSpec)
        val heightMode = MeasureSpec.getMode(heightMeasureSpec)
        var windowWidth = heightMeasureSpec
        var windowHeight = heightMeasureSpec
        if (widthMode == MeasureSpec.AT_MOST) {
            windowWidth = getScreenWidth()
        }
        if (heightMode == MeasureSpec.AT_MOST) {
            windowHeight = mDefaultHeight
        }
        setMeasuredDimension(windowWidth, windowHeight)
    }

这儿简略的概述一下,MeasureSpec有三个形式,分别为MeasureSpec.EXACTLY,MeasureSpec.AT_MOST和MeasureSpec.UNSPECIFIED。

MeasureSpec.EXACTLY是准确形式,当咱们将控件的layout_width或layout_height指定为详细数值时,如andorid:layout_width=”50dp”,或许为match_parent时,既控件巨细现已确定的状况,都是准确形式。

MeasureSpec.AT_MOST是最大形式,当控件的layout_width或layout_height指定为wrap_content时,控件巨细一般随着控件的子空间或内容进行变化,此刻控件尺度只要不超过父控件答应的最大尺度即可。因此,此刻的形式是AT_MOST。

MeasureSpec.UNSPECIFIED是未指定尺度,这种状况不多,一般都是父控件是AdapterView,经过measure办法传入的形式。

是否要设置一个默许的高度或许宽度,取决于实际的事务状况,一般状况下,运用者都会自己来设置宽和高,至于在此做一层束缚,仅仅为了能让View视图展现出来。

制作视图

制作,上述现已说过,找到四个极点即可,顺次进行衔接,如下代码所示,mAngleWidth变量为平行四边形的倾斜度。

 	val path = Path()
        path.apply {
            moveTo(0f, height.toFloat())//第一个点的方位
            lineTo(mAngleWidth, 0f)//第二个
            lineTo(width.toFloat(), 0f)//第三个
            lineTo((width - mAngleWidth), height.toFloat())//第四个
            close()
            canvas.drawPath(this, mPaint!!)
        }

突变色

完成突变色,也是非常的简略,画笔Paint有个设置的办法setShader,也便是着色器,能够协助咱们完成想要的突变色彩,Shader有五个子类,分别是:BitmapShader、LinearGradient、RadialGradient、SweepGradient和ComposeShader,详细的就不多介绍了,独自介绍一下LinearGradient。

LinearGradient是用来创立线性突变作用的,它是沿着某条直线的方向突变的,有四个结构函数,这儿咱们选取下面这个结构。

 public LinearGradient(float x0, float y0, float x1, float y1,
                       @NonNull long[] colors, @Nullable float[] positions, 
                       @NonNull TileMode tile) {
  }

此结构函数中有七个参数,前四个是坐标点,前两个x0,y0是这条突变直线的起点,后两个x1,y1是这条突变直线的结尾,第五个参数为int数组colors,也便是需求的突变色彩,色彩值从开端到结束顺次排开即可,第六个参数为方位,和前边的色彩数组是一一对应的,用来符号色彩的方位,最终一个参数是色彩突变的形式,有三种形式。

TileMode.CLAMP:超出其原始边界,则仿制边缘色彩。

TileMode.REPEAT:重复填充以前的突变色。

TilmMode.MIRROR:镜像填充。

设置shader,如下代码。

 val linearShader = LinearGradient(
            0f, 0f, width.toFloat(), height.toFloat(), colorArray,
            progressArray, Shader.TileMode.CLAMP
        )
        mPaint?.shader = linearShader

需求留意的是,是否需求含糊进展,也便是进展前边的一块,我这儿我选用的方式是,色彩数组和方位数组都添加两个,第二个方位到三个方位,稍微添加一点position即可完成,比如原来是(0f,1f),现在改为了四个,就成了(0f,0,5f,0,54f,1f)类似这样,当然了第二个进展值需求动态处理的,毕竟是一个进展条。

一个超简单的渐变平行四边形进度条

详细的代码完成,咱们能够去看源码,没有什么特别杂乱的当地,都是比较根底的Api操作。

三、开源地址。

现在项目现已开源,需求的朋友能够检查:github.com/AbnerMing88…

四、总结及留意事项。

如此一个简略的自定义View,需求把握的就三点,一个是LinearGradient突变色的处理,一个便是path途径的轨迹,最终一个是MeasureSpec形式的判别,其他的都是最基本的制作办法,也没有什么可说的,咱们看源码或第二步完成进程就能够了。

本文正在参与「金石方案」