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形式的判别,其他的都是最基本的制作办法,也没有什么可说的,咱们看源码或第二步完成进程就能够了。
本文正在参与「金石方案」