大佬教程收集整理的这篇文章主要介绍了Android 仿摩拜单车共享单车进度条实现StepView效果,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
先看效果图:
Step1:定义StepBean@H_616_11@
定义五个状态,分别为:为完成、正在进行、已完成、终点完成、终点未完成。
public class StepBean{ public static final int STEP_UNDO = -1;//未完成 public static final int STEP_CURRENT = 0;//正在进行 public static final int STEP_COMPLETED = 1;//已完成 public static final int STEP_LAST_COMPLETED = 2;//终点完成 public static final int STEP_LAST_UNCOMPLETED = 3;//终点未完成 private String name; privatE int state; public String getName(){ return name; } public void setName(String Name){ this.name = name; } public int getState(){ return state; } public void setState(int statE){ this.state = state; } public StepBean(){ } public StepBean(String name,int statE){ this.name = name; this.state = state; } }
Step2:自定义HorizontalStepsViewInDicator @H_616_11@
public class HorizontalStepsViewInDicator extends View { privatE int defaultStepInDicatorNum = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,40,getresources().getDisplaymetrics());//定义默认的高度 private float mCompletedLineHeight;//完成线的高度 private float mCircleRadius;//圆的半径 private Drawable mCompleteIcon;//完成的默认图片 private Drawable mAttentionIcon;//正在进行的默认图片 private Drawable mDefaultIcon;//默认的背景图 private Drawable mLastCompleteIcon;//终点未完成图片 private Drawable mLastunCompleteIcon;//终点完成图片 private float mCenterY;//该view的Y轴中间位置 private float mLeftY;//左上方的Y位置 private float mRightY;//右下方的位置 private List<StepBean> mStepBeanList ;//当前有几步流程 privatE int mStepNum = 0; private float mLinePadding;//两条连线之间的间距 private List<Float> mCircleCenterPointPositionList;//定义所有圆的圆心点位置的集合 private Paint mUnCompletedPaint;//未完成Paint private Paint mCompletedPaint;//完成paint privatE int mUnCompletedLineColor = ContextCompat.getColor(getContext(),R.color.uncompleted_color);//定义默认未完成线的颜色 privatE int mCompletedLineColor = ContextCompat.getColor(getContext(),R.color.completed_color);//定义默认完成线的颜色 private PathEffect mEffects; privatE int mComplecTingPosition;//正在进行position private Path mPath; private OnDrawInDicatorListener mOnDrawListener; privatE int screenWidth; /** * 设置监听 * @param onDrawListener */ public void setOnDrawListener(OnDrawInDicatorListener onDrawListener){ mOnDrawListener = onDrawListener; } /** * get圆的半径 get circle radius * @return */ public float getCircleRadius(){ return mCircleRadius; } public HorizontalStepsViewInDicator(Context context){ this(context,null); } public HorizontalStepsViewInDicator(Context context,AttributeSet attrs){ this(context,attrs,0); } public HorizontalStepsViewInDicator(Context context,AttributeSet attrs,int defStylE){ super(context,defStylE); init(); } private void init(){ mStepBeanList = new ArrayList<>(); mPath = new Path(); mEffects = new DashPathEffect(new float[]{8,8,8},1); mCircleCenterPointPositionList = new ArrayList<>();//初始化 mUnCompletedPaint = new Paint(); mCompletedPaint = new Paint(); mUnCompletedPaint.setAntiAlias(true); mUnCompletedPaint.setColor(mUnCompletedLineColor); mUnCompletedPaint.setStyle(Paint.Style.stroke); mUnCompletedPaint.setstrokeWidth(2); mCompletedPaint.setAntiAlias(true); mCompletedPaint.setColor(mCompletedLineColor); mCompletedPaint.setStyle(Paint.Style.stroke); mCompletedPaint.setstrokeWidth(2); mUnCompletedPaint.setPathEffect(mEffects); mCompletedPaint.setStyle(Paint.Style.FILL); mCompletedLineHeight = 0.03f * defaultStepInDicatorNum;//已经完成线的宽高 mCircleRadius = 0.28f * defaultStepInDicatorNum;//圆的半径 mLinePadding = 1.0f * defaultStepInDicatorNum;//线与线之间的间距 mCompleteIcon = ContextCompat.getDrawable(getContext(),R.drawable.complted);//已经完成的icon mAttentionIcon = ContextCompat.getDrawable(getContext(),R.drawable.attention);//正在进行的icon mDefaultIcon = ContextCompat.getDrawable(getContext(),R.drawable.default_icon);//未完成的icon mLastCompleteIcon= ContextCompat.getDrawable(getContext(),R.drawable.last_complted);//终点已完成的icon mLastunCompleteIcon= ContextCompat.getDrawable(getContext(),R.drawable.last_uncomplted);//终点未完成的icon } @Override protected synchronized void onMeasure(int widthMeasureSpec,int heightMeasureSpeC){ int width = defaultStepInDicatorNum * 2; if(MeasureSpec.UNSPECIFIED != MeasureSpec.getMode(widthMeasureSpeC)){ screenWidth = MeasureSpec.getSize(widthMeasureSpec); } int height = defaultStepInDicatorNum; if(MeasureSpec.UNSPECIFIED != MeasureSpec.getMode(heightMeasureSpeC)){ height = Math.min(height,MeasureSpec.getSize(heightMeasureSpeC)); } width = (int) (mStepNum * mCircleRadius * 2 - (mStepNum - 1) * mLinePadding); setMeasuredDimension(width,height); } @Override protected void onSizeChanged(int w,int h,int oldw,int oldh){ super.onSizeChanged(w,h,oldw,oldh); //获取中间的高度,目的是为了让该view绘制的线和圆在该view垂直居中 mCenterY = 0.5f * getHeight(); //获取左上方Y的位置,获取该点的意义是为了方便画矩形左上的Y位置 mLeftY = mCenterY - (mCompletedLineHeight / 2); //获取右下方Y的位置,获取该点的意义是为了方便画矩形右下的Y位置 mRightY = mCenterY + mCompletedLineHeight / 2; mCircleCenterPointPositionList.clear(); for(int i = 0; i < mStepNum; i++){ //先计算全部最左边的padding值(getWidth()-(圆形直径+两圆之间距离)*2) float paddingLeft = (screenWidth - mStepNum * mCircleRadius * 2 - (mStepNum - 1) * mLinePadding) / 2; //add to list mCircleCenterPointPositionList.add(paddingLeft + mCircleRadius + i * mCircleRadius * 2 + i * mLinePadding); } /** * set listener */ if(mOnDrawListener!=null){ mOnDrawlistener.ondrawInDicator(); } } @Override protected synchronized void onDraw(Canvas canvas){ super.onDraw(canvas); if(mOnDrawListener!=null){ mOnDrawlistener.ondrawInDicator(); } mUnCompletedPaint.setColor(mUnCompletedLineColor); mCompletedPaint.setColor(mCompletedLineColor); //-----------------------画线-------draw line----------------------------------------------- for(int i = 0; i < mCircleCenterPointPositionList.size() -1; i++){ //前一个ComplectedXPosition final float preComplectedXPosition = mCircleCenterPointPositionList.get(i); //后一个ComplectedXPosition final float afterComplectedXPosition = mCircleCenterPointPositionList.get(i + 1); if(i <= mComplecTingPosition&&mStepBeanList.get(0).getState()!=StepBean.STEP_UNDO){//判断在完成之前的所有点 //判断在完成之前的所有点,画完成的线,这里是矩形,很细的矩形,类似线,为了做区分,好看些 canvas.drawRect(preComplectedXPosition + mCircleRadius - 10,mLeftY,afterComplectedXPosition - mCircleRadius + 10,mRightY,mCompletedPaint); } else{ mPath.moveTo(preComplectedXPosition + mCircleRadius,mCenterY); mPath.lineTo(afterComplectedXPosition - mCircleRadius,mCenterY); canvas.drawPath(mPath,mUnCompletedPaint); } } //-----------------------画线-------draw line----------------------------------------------- //-----------------------画图标-----draw icon----------------------------------------------- for(int i = 0; i < mCircleCenterPointPositionList.size(); i++){ final float currentComplectedXPosition = mCircleCenterPointPositionList.get(i); Rect rect = new Rect((int) (currentComplectedXPosition - mCircleRadius),(int) (mCenterY - mCircleRadius),(int) (currentComplectedXPosition + mCircleRadius),(int) (mCenterY + mCircleRadius)); StepBean stepsBean = mStepBeanList.get(i); if(stepsBean.getState()==StepBean.STEP_UNDO){ mDefaultIcon.setBounds(rect); mDefaultIcon.draw(canvas); }else if(stepsBean.getState()==StepBean.STEP_CURRENT){ mCompletedPaint.setColor(Color.WHITE); canvas.drawCircle(currentComplectedXPosition,mCenterY,mCircleRadius * 1.1f,mCompletedPaint); mAttentionIcon.setBounds(rect); mAttentionIcon.draw(canvas); }else if(stepsBean.getState()==StepBean.STEP_COMPLETED){ mCompleteIcon.setBounds(rect); mCompleteIcon.draw(canvas); }else if(stepsBean.getState()==StepBean.STEP_LAST_COMPLETED){ mLastCompleteIcon.setBounds(rect); mLastCompleteIcon.draw(canvas); }else if(stepsBean.getState()==StepBean.STEP_LAST_UNCOMPLETED){ mLastunCompleteIcon.setBounds(rect); mLastunCompleteIcon.draw(canvas); } } //-----------------------画图标-----draw icon----------------------------------------------- } /** * 得到所有圆点所在的位置 * @return */ public List<Float> getCircleCenterPointPositionList() { return mCircleCenterPointPositionList; } /** * 设置流程步数 * @param stepsBeanList 流程步数 */ public void setStepNum(List<StepBean> stepsBeanList) { this.mStepBeanList = stepsBeanList; mStepNum = mStepBeanList.size(); if(mStepBeanList!=null&&mStepBeanList.size()>0){ for(int i = 0;i<mStepNum;i++){ StepBean stepsBean = mStepBeanList.get(i); if(stepsBean.getState()==StepBean.STEP_COMPLETED){ mComplecTingPosition = i; } } } requestLayout(); } /** * 设置未完成线的颜色 * @param unCompletedLineColor */ public void setUnCompletedLineColor(int unCompletedLineColor){ this.mUnCompletedLineColor = unCompletedLineColor; } /** * 设置已完成线的颜色 * @param completedLineColor */ public void setCompletedLineColor(int completedLineColor){ this.mCompletedLineColor = completedLineColor; } /** * 设置默认图片 * @param defaultIcon */ public void setDefaultIcon(Drawable defaultIcon){ this.mDefaultIcon = defaultIcon; } /** * 设置已完成图片 * @param completeIcon */ public void setCompleteIcon(Drawable completeIcon){ this.mCompleteIcon = completeIcon; } public void setLastCompleteIcon(Drawable lastcompleteIcon){ this.mLastCompleteIcon = lastcompleteIcon; } public void setLastunCompleteIcon(Drawable lastunCompleteIcon){ this.mLastunCompleteIcon = lastunCompleteIcon; } /** * 设置正在进行中的图片 * @param attentionIcon */ public void setAttentionIcon(Drawable attentionIcon){ this.mAttentionIcon = attentionIcon; } /** * 设置对view监听 */ public interface OnDrawInDicatorListener{ void ondrawInDicator(); } }
Step3:自定义HorizontalStepView @H_616_11@
public class HorizontalStepView extends LinearLayout implements HorizontalStepsViewInDicator.onDrawInDicatorListener{ private RelativeLayout mTextContainer; private HorizontalStepsViewInDicator mStepsViewInDicator; private List<StepBean> mStepBeanList; privatE int mComplecTingPosition; privatE int mUnComplectedTextColor = ContextCompat.getColor(getContext(),R.color.uncompleted_text_color);//定义默认未完成文字的颜色; privatE int mComplectedTextColor = ContextCompat.getColor(getContext(),R.color.completed_color);//定义默认完成文字的颜色; privatE int mTextSize = 14;//default textSize private TextView mTextView; public HorizontalStepView(Context context){ this(context,null); } public HorizontalStepView(Context context,0); } public HorizontalStepView(Context context,int defStyleAttr){ super(context,defStyleAttr); init(); } private void init(){ View rootView = LayoutInflater.from(getContext()).inflate(R.layout.widget_horizontal_stepsview,this); mStepsViewInDicator = (HorizontalStepsViewInDicator) rootView.findViewById(R.id.steps_inDicator); mStepsViewInDicator.setOnDrawListener(this); mTextContainer = (RelativeLayout) rootView.findViewById(R.id.rl_text_container); } /** * 设置显示的文字 * @param stepsBeanList * @return */ public HorizontalStepView setStepViewTexts(List<StepBean> stepsBeanList) { mStepBeanList = stepsBeanList; mStepsViewInDicator.setStepNum(mStepBeanList); return this; } /** * 设置未完成文字的颜色 * @param unComplectedTextColor * @return */ public HorizontalStepView setStepViewUnComplectedTextColor(int unComplectedTextColor) { mUnComplectedTextColor = unComplectedTextColor; return this; } /** * 设置完成文字的颜色 * @param complectedTextColor * @return */ public HorizontalStepView setStepViewComplectedTextColor(int complectedTextColor) { this.mComplectedTextColor = complectedTextColor; return this; } /** * 设置StepsViewInDicator未完成线的颜色 * @param unCompletedLineColor * @return */ public HorizontalStepView setStepsViewInDicatorUnCompletedLineColor(int unCompletedLineColor) { mStepsViewInDicator.setUnCompletedLineColor(unCompletedLineColor); return this; } /** * 设置StepsViewInDicator完成线的颜色 * @param completedLineColor * @return */ public HorizontalStepView setStepsViewInDicatorCompletedLineColor(int completedLineColor) { mStepsViewInDicator.setCompletedLineColor(completedLineColor); return this; } /** * 设置StepsViewInDicator默认图片 * @param defaultIcon */ public HorizontalStepView setStepsViewInDicatorDefaultIcon(Drawable defaultIcon) { mStepsViewInDicator.setDefaultIcon(defaultIcon); return this; } /** * 设置StepsViewInDicator已完成图片 * @param completeIcon */ public HorizontalStepView setStepsViewInDicatorCompleteIcon(Drawable completeIcon) { mStepsViewInDicator.setCompleteIcon(completeIcon); return this; } /** * 设置StepsViewInDicator正在进行中的图片 * @param attentionIcon */ public HorizontalStepView setStepsViewInDicatorAttentionIcon(Drawable attentionIcon) { mStepsViewInDicator.setAttentionIcon(attentionIcon); return this; } public HorizontalStepView setStepsViewInDicatorLastCompleteIcon(Drawable lastCompleteIcon) { mStepsViewInDicator.setLastCompleteIcon(lastCompleteIcon); return this; } public HorizontalStepView setStepsViewInDicatorLastunCompleteIcon(Drawable lastunCompleteIcon) { mStepsViewInDicator.setLastunCompleteIcon(lastunCompleteIcon); return this; } /** * set textSize * @param textSize * @return */ public HorizontalStepView setTextSize(int textSizE) { if(textSize > 0) { mTextSize = textSize; } return this; } @Override public void ondrawInDicator() { if(mTextContainer != null) { mTextContainer.removeAllViews(); List<Float> complectedXPosition = mStepsViewInDicator.getCircleCenterPointPositionList(); if(mStepBeanList != null && complectedXPosition != null && complectedXPosition.size() > 0) { for(int i = 0; i < mStepBeanList.size(); i++) { mTextView = new TextView(getContext()); mTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP,mTextSizE); mTextView.setText(mStepBeanList.get(i).getName()); int spec = MeasureSpec.makeMeasureSpec(0,MeasureSpec.UNSPECIFIED); mTextView.measure(spec,spec); // getMeasuredWidth int measuredWidth = mTextView.getMeasuredWidth(); mTextView.setX(complectedXPosition.get(i) - measuredWidth / 2); mTextView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT)); if(i <= mComplecTingPosition) { mTextView.setTypeface(null); mTextView.setTextColor(mComplectedTextColor); } else{ mTextView.setTextColor(mUnComplectedTextColor); } mTextContainer.addView(mTextView); } } } } }
Step4:如何使用?@H_616_11@
在布局文件xml中:
<cn.comnav.uTrain.ui.widget.HorizontalStepView android:id="@+id/hsv_step_view" android:layout_width="match_parent" android:layout_height="80dp" android:layouT_Below="@+id/ll_role" android:layout_marginBottom="40dp" />
private List<StepBean> stepsBeanList; private HorizontalStepView mHorizontalStepView; mHorizontalStepView=(HorizontalStepView)findViewById(R.id.hsv_step_view); stepsBeanList = new ArrayList<>(); StepBean stepBean0=null; StepBean stepBean1=null; StepBean stepBean2=null; StepBean stepBean3=null; switch (stepIndeX){ case 1: stepBean0 = new StepBean("手机绑定",1); stepBean1 = new StepBean("实名认证",0); stepBean2 = new StepBean("学时充值",-1); stepBean3 = new StepBean("开始用车",3); break; case 2: stepBean0 = new StepBean("手机绑定",1); stepBean2 = new StepBean("学时充值",0); stepBean3 = new StepBean("开始用车",3); break; case 3: stepBean0 = new StepBean("手机绑定",1); stepBean3 = new StepBean("开始用车",2); break; } stepsBeanList.add(stepBean0); stepsBeanList.add(stepBean1); stepsBeanList.add(stepBean2); stepsBeanList.add(stepBean3); mHorizontalStepView.setStepViewTexts(stepsBeanList);
以上所述是小编给大家介绍的Android 仿摩拜单车共享单车进度条实现StepView效果,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对编程小技巧网站的支持!
以上是大佬教程为你收集整理的Android 仿摩拜单车共享单车进度条实现StepView效果全部内容,希望文章能够帮你解决Android 仿摩拜单车共享单车进度条实现StepView效果所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。