版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】Android如何自定义StepView仿外卖配送进度
在下给大家分享一下Android如何自定义StepView仿外卖配送进度,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!效果图使用可在layout文件下设置以下属性。<?xml
version="1.0"
encoding="utf-8"?>
<resources>
<declare-styleable
name="StepView">
<attr
name="step_size"
format="dimension"/><!--step的size,也就是image的大小-->
<attr
name="line_size"
format="dimension"/><!--线宽-->
<attr
name="text_size"
format="dimension"/><!--文字大小-->
<attr
name="text_line_margin"
format="dimension"/><!--文字和线之间的间距-->
<attr
name="normal_line_color"
format="color"/><!--一般线的颜色-->
<attr
name="normal_text_color"
format="color"/><!--一般文字的颜色-->
<attr
name="target_text_color"
format="color"/><!--一般文字的颜色-->
<attr
name="passed_line_color"
format="color"/><!--已经过线的颜色-->
<attr
name="step_count"
format="integer"/><!--总step数-->
<attr
name="current_step"
format="integer"/><!--当前step位置-->
<attr
name="normal_step_iv"
format="reference"/><!--一般图片-->
<attr
name="passed_step_iv"
format="reference"/><!--已经过的图片-->
<attr
name="target_step_iv"
format="reference"/><!--当前step图片-->
<attr
name="step_is_touch"
format="boolean"/><!--step是否可点-->
<attr
name="text_up_line"
format="boolean"/><!--文字是否在线上-->
</declare-styleable>
</resources>CheckBox
cbTouch
=
findViewById(R.id.cb_touch);
CheckBox
cbIsDown
=
findViewById(R.id.cb_is_down);
final
StepView
stepView
=
findViewById(R.id.step_view);
String[]
stepTexts
=
new
String[]{"订单已提交",
"商家已接单",
"配送中",
"已送达"};
stepView.setStepTexts(stepTexts);//传入每一进度的文字描述
stepView.setCurrentStep(2);//设置当前进度所在位置
stepView.setOnItemStepTouchListener(new
StepView.OnItemStepTouchListener()
{
@Override
public
void
onItemStepTouch(int
postion)
{
Log.d(TAG,
"当前点击位置:
"+postion);
}
});
cbTouch.setOnCheckedChangeListener(new
CompoundButton.OnCheckedChangeListener()
{
@Override
public
void
onCheckedChanged(CompoundButton
buttonView,
boolean
isChecked)
{
stepView.setStepIsTouch(isChecked);
}
});
cbIsDown.setOnCheckedChangeListener(new
CompoundButton.OnCheckedChangeListener()
{
@Override
public
void
onCheckedChanged(CompoundButton
buttonView,
boolean
isChecked)
{
stepView.setTextUpLine(!isChecked);
}
});步骤1、在构造函数中初始化文字、线、step图片的属性。public
StepView(Context
context,
@Nullable
AttributeSet
attrs,
int
defStyleAttr)
{
super(context,
attrs,
defStyleAttr);
init(context,
attrs);
}
private
void
init(Context
context,
AttributeSet
attrs)
{
mLinePaint
=
new
Paint();
mLinePaint.setAntiAlias(true);
mTextPaint
=
new
Paint();
mTextPaint.setAntiAlias(true);
mPreLineLength
=
0;
//默认的step图片
mNormalBitmap
=
BitmapFactory.decodeResource(getResources(),
R.drawable.ic_normal);
mPassedBitmap
=
BitmapFactory.decodeResource(getResources(),
R.drawable.ic_passed);
mTargetBitmap
=
BitmapFactory.decodeResource(getResources(),
R.drawable.ic_target);
TypedArray
typedArray
=
context.obtainStyledAttributes(attrs,
R.styleable.StepView);
//获取xml文件中的线的颜色值、size
mNormalLineColor
=
typedArray.getColor(R.styleable.StepView_normal_line_color,
Color.BLUE);
mPassedLineColor
=
typedArray.getColor(R.styleable.StepView_passed_line_color,
Color.WHITE);
int
lineSize
=
(int)
typedArray.getDimension(R.styleable.StepView_line_size,
2);
//获取xml文件中的文本的颜色值、size
mNormalTextColor
=
typedArray.getColor(R.styleable.StepView_normal_text_color,
Color.BLACK);
mTargetTextColor
=
typedArray.getColor(R.styleable.StepView_target_text_color,
Color.BLACK);
int
textSize
=
(int)
typedArray.getDimension(R.styleable.StepView_text_size,
10);
//获取xml文件中的step的size,设置给step图片的高度
int
stepSize
=
(int)
typedArray.getDimension(R.styleable.StepView_step_size,
0);
//获取xml文件中的文本和线之间的间距
mTextLineMargin
=
(int)
typedArray.getDimension(R.styleable.StepView_text_line_margin,
3);
//获取xml文件中的step总数
mStepCount
=
typedArray.getInt(R.styleable.StepView_step_count,
2);
//获取xml文件中的当前step位置
mCurrentStep
=
typedArray.getInt(R.styleable.StepView_current_step,
0);
//获取xml文件中step图片
BitmapDrawable
normalDrawable
=
(BitmapDrawable)
typedArray.getDrawable(R.styleable.StepView_normal_step_iv);
BitmapDrawable
passedDrawable
=
(BitmapDrawable)
typedArray.getDrawable(R.styleable.StepView_passed_step_iv);
BitmapDrawable
targetDrawable
=
(BitmapDrawable)
typedArray.getDrawable(R.styleable.StepView_target_step_iv);
//获取xml文件中step是否可点击TRUE可以,FALSE不可以,默认为FALSE
mStepIsTouch
=
typedArray.getBoolean(R.styleable.StepView_step_is_touch,
false);
//获取xml文件中text是否在线上,TRUE在线上,FALSE不在线上,默认为FALSE
mTextUpLine
=
typedArray.getBoolean(R.styleable.StepView_text_up_line,
true);
mTextPaint.setTextSize(textSize);
mLinePaint.setStrokeWidth(lineSize);
mNormalBitmap
=
normalDrawable.getBitmap();//将xml文件中指定的图片赋给对应的bitmap
mPassedBitmap
=
passedDrawable.getBitmap();
mTargetBitmap
=
targetDrawable.getBitmap();
mNormalBitmapWH
=
getBitmapWH(stepSize,
mNormalBitmap);
mPassedBitmapWH
=
getBitmapWH(stepSize,
mPassedBitmap);
mTargetBitmapWH
=
getBitmapWH(stepSize,
mTargetBitmap);
if
(stepSize
!=
0)
{//如果stepSize不为0,要对其进行压缩处理,使其高度等于stepSize
mNormalBitmap
=
zoomImg(mNormalBitmap,
mNormalBitmapWH);
mPassedBitmap
=
zoomImg(mPassedBitmap,
mPassedBitmapWH);
mTargetBitmap
=
zoomImg(mTargetBitmap,
mPassedBitmapWH);
}
mStepRectFs
=
new
RectF[mStepCount];//初始化step所对应的矩阵数组,点击step时会用到,用于确定点击的是哪个step
typedArray.recycle();
}2、在onMeasure中对StepView的宽高进行设置,并根据StepView的宽高计算每条直线的长度。@Override
protected
void
onMeasure(int
widthMeasureSpec,
int
heightMeasureSpec)
{
int
widthMode
=
MeasureSpec.getMode(widthMeasureSpec);
int
widthSize
=
MeasureSpec.getSize(widthMeasureSpec);
int
heightMode
=
MeasureSpec.getMode(heightMeasureSpec);
int
heightSize
=
MeasureSpec.getSize(heightMeasureSpec);
int
width
=
widthSize
-
getPaddingLeft()
-
getPaddingRight();//任何模式下with都是父容器给定的with-padding值
int
height
=
0;
if
(heightMode
==
MeasureSpec.EXACTLY)
{
height
=
heightSize
-
getPaddingTop()
-
getPaddingBottom();
}
else
{
height
=
dp2px(getContext(),
80);
}
setMeasuredDimension(width,
height);
mPreLineLength
=
width
/
(mStepCount
+
1);//计算每条线的长度,由于线比step多一个所以加1
}3、开始绘制,先画线,再画step和文字。@Override
protected
void
onDraw(Canvas
canvas)
{
if
(mStepCount
!=
0)
{
drawLine(canvas);//drawLine和drawStep分两次循环是为了防止部分线覆盖step
drawStep(canvas);
}
}4、画线,前一条线的stopX坐标是下一条线的startX坐标,并根据当前step所在的位置对lineColor进行设置。private
void
drawLine(Canvas
canvas)
{
float
lineStartX
=
getPaddingLeft();
float
lineStartY
=
getLineStartY();
float
lineStopX
=
0;
float
lineStopY
=
lineStartY;
for
(int
i
=
0;
i
<
mStepCount
+
1;
i++)
{
if
(i
<
mCurrentStep
-
1)
{
mLinePaint.setColor(mPassedLineColor);
}
else
if
(i
==
mCurrentStep
-
1)
{
mLinePaint.setColor(mPassedLineColor);
}
else
{
mLinePaint.setColor(mNormalLineColor);
}
lineStopX
=
lineStartX
+
mPreLineLength;
canvas.drawLine(lineStartX,
lineStartY,
lineStopX,
lineStopY,
mLinePaint);
lineStartX
=
lineStopX;
}
}5、画step和文字。private
void
drawStep(Canvas
canvas)
{
float
lineStartX
=
getPaddingLeft();
float
lineStartY
=
getLineStartY();
Bitmap
currentBitmap;
int[]
currentBitmapWH;
float
lineStopX;
float
bitmapLeft;
float
bitmapTop;
for
(int
i
=
0;
i
<
mStepCount;
i++)
{
if
(i
<
mCurrentStep
-
1)
{
currentBitmap
=
mPassedBitmap;
currentBitmapWH
=
mPassedBitmapWH;
mTextPaint.setColor(mNormalTextColor);
}
else
if
(i
==
mCurrentStep
-
1)
{
currentBitmap
=
mTargetBitmap;
currentBitmapWH
=
mTargetBitmapWH;
mTextPaint.setColor(mTargetTextColor);
}
else
{
currentBitmap
=
mNormalBitmap;
currentBitmapWH
=
mNormalBitmapWH;
mTextPaint.setColor(mNormalTextColor);
}
lineStopX
=
lineStartX
+
mPreLineLength;
bitmapLeft
=
lineStopX
-
currentBitmapWH[0]
/
2;
bitmapTop
=
lineStartY
-
currentBitmapWH[1]
/
2;
canvas.drawBitmap(currentBitmap,
bitmapLeft,
bitmapTop,
null);
mStepRectFs[i]
=
new
RectF(bitmapLeft,
bitmapTop,
bitmapLeft
+
currentBitmapWH[0],
bitmapTop
+
currentBitmapWH[1]);
if
(mStepTexts
!=
null)
{//当没有传入对应的texts时不需要划线
drawText(canvas,
i,
bitmapLeft
+
currentBitmapWH[1]
/
2,
bitmapTop,
currentBitmapWH[1]);//传入step中点坐标
}
lineStartX
=
lineStopX;
}
}
private
void
drawText(Canvas
canvas,
int
i,
float
x,
float
y,
float
bitmapH)
{
String
text
=
mStepTexts[i];
int[]
textWH
=
getTextWH(text);
int
textWidth
=
textWH[0];
int
textHeight
=
textWH[1];
float
bottom
=
0;
if
(mTextUpLine)
{//画文本时的基准点是left.bottom,使其中心点与step的中心点对其
bottom
=
y
-
mTextLineMargin;
}
else
{
bottom
=
y
+
bitmapH
+
mTextLineMargin
+
textHeight;
}
canvas.drawText(text,
x
-
textWidth
/
2,
bottom,
mTextPaint);
}6、对触摸事件进行处理。@Override
public
boolean
onTouchEvent(MotionEvent
event)
{
if
(!mStepIsTouch)
{//不能点击返回FALSE不处理
return
false;
}
switch
(event.getAction())
{
case
MotionEvent.ACTION_DOWN:
float
x
=
event.getX();
float
y
=
event.getY();
int
touchStep
=
getTouchStep(new
PointF(x,
y));//获取被点击的点的位置
if
(touchStep
!=
-1)
{
mCurrentStep
=
touchStep
+
1;
invalidate();
}
break;
}
return
true;
}7、step的触摸监
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年亲子协议模板
- 2025年增资协议合同条款
- 2025年度个人承包工程劳务合同模板4篇
- 2025年合作环境科学书籍出版协议
- 搅拌站项目合作开发合同(二零二五年)3篇
- 2025年度环保认证木地板采购与施工合同4篇
- 2025年度乡村旅游资源承包经营权转让合同4篇
- 2025年度股权质押担保与文化产业融合发展合同
- 二零二五年度足疗养生馆加盟投资协议
- 2025年度美容院美容师服务提成劳务合同模板
- 2024-2030年中国海泡石产业运行形势及投资规模研究报告
- 动物医学类专业生涯发展展示
- 2024年同等学力申硕英语考试真题
- 消除“艾梅乙”医疗歧视-从我做起
- 非遗文化走进数字展厅+大数据与互联网系创业计划书
- 2024山西省文化旅游投资控股集团有限公司招聘笔试参考题库附带答案详解
- 科普知识进社区活动总结与反思
- 加油站廉洁培训课件
- 现金日记账模板(带公式)
- 消化内科专科监测指标汇总分析
- 混凝土结构工程施工质量验收规范
评论
0/150
提交评论