Android打造炫酷进度条效果

Android打造炫酷进度条效果,第1张

概述本文实例为大家分享了Android炫酷进度条效果的具体代码,供大家参考,具体内容如下

本文实例为大家分享了AndroID炫酷进度条效果的具体代码,供大家参考,具体内容如下

学习:视频地址

HorizontalProgressbarWithProgress的代码

import androID.content.Context;import androID.content.res.TypedArray;import androID.graphics.Canvas;import androID.graphics.Paint;import androID.os.Build;import androID.support.annotation.RequiresAPI;import androID.util.AttributeSet;import androID.util.TypedValue;import androID.Widget.Progressbar;import trunk.doi.base.R;/** * 作者:Mr.Lee on 2017-10-17 15:51 * 邮箱:569932357@qq.com */public class HorizontalProgressbarWithProgress extends Progressbar{ private static final int DEFAulT_TEXT_SIZE=10;//sp private static final int DEFAulT_TEXT_color=0xFFFC00D1; private static final int DEFAulT_color_UNREACH=0xFFD3D6DA; private static final int DEFAulT_HEIGHT_UNREACH=2;//dp private static final int DEFAulT_color_REACH=DEFAulT_TEXT_color; private static final int DEFAulT_HEIGHT_REACH=2; private static final int DEFAulT_TEXT_OFFSET=10; protected int mTextSize=sp2px(DEFAulT_TEXT_SIZE); protected int mTextcolor=DEFAulT_TEXT_color; protected int mUnReachcolor=DEFAulT_color_UNREACH; protected int mUnReachHeigh=dp2px(DEFAulT_HEIGHT_UNREACH); protected int mReachHeigh=dp2px(DEFAulT_HEIGHT_REACH); protected int mReachcolor=DEFAulT_color_REACH; protected int mTextOffset=dp2px(DEFAulT_TEXT_OFFSET); protected Paint mPaint=new Paint(); protected int mRealWIDth; public HorizontalProgressbarWithProgress(Context context) {  super(context);  init(null); } public HorizontalProgressbarWithProgress(Context context,AttributeSet attrs) {  super(context,attrs);  init(attrs); } public HorizontalProgressbarWithProgress(Context context,AttributeSet attrs,int defStyleAttr) {  super(context,attrs,defStyleAttr);  init(attrs); } @RequiresAPI(API = Build.VERSION_CODES.LolliPOP) public HorizontalProgressbarWithProgress(Context context,int defStyleAttr,int defStyleRes) {  super(context,defStyleAttr,defStyleRes);  init(attrs); } private voID init(AttributeSet attrs) {  /**   * 获取dimension的方法有几种,区别不大   * 共同点是都会将dp,sp的单位转为px,px单位的保持不变   *   * getDimension() 返回float,   * getDimensionPixelSize 返回int 小数部分四舍五入   * getDimensionPixelOffset 返回int,但是会抹去小数部分   */  TypedArray array=getContext().obtainStyledAttributes(attrs,R.styleable.HorizontalProgressbarWithProgress);  mTextSize= (int) array.getDimension(R.styleable.HorizontalProgressbarWithProgress_progress_text_size,mTextSize);  mTextcolor=array.getcolor(R.styleable.HorizontalProgressbarWithProgress_progress_text_color,mTextcolor);  mUnReachcolor=array.getcolor(R.styleable.HorizontalProgressbarWithProgress_progress_unreach_color,mUnReachcolor);  mUnReachHeigh=(int) array.getDimension(R.styleable.HorizontalProgressbarWithProgress_progress_unreach_height,mUnReachHeigh);  mReachHeigh=(int) array.getDimension(R.styleable.HorizontalProgressbarWithProgress_progress_reach_height,mReachHeigh);  mTextOffset=(int) array.getDimension(R.styleable.HorizontalProgressbarWithProgress_progress_text_offset,mTextOffset);  mReachcolor=array.getcolor(R.styleable.HorizontalProgressbarWithProgress_progress_reach_color,mReachcolor);  array.recycle();  mPaint.setTextSize(mTextSize); } @OverrIDe protected synchronized voID onMeasure(int wIDthMeasureSpec,int heightmeasureSpec) {//  int wIDthMode=MeasureSpec.getMode(wIDthMeasureSpec);  int wIDth=MeasureSpec.getSize(wIDthMeasureSpec);  int heigh=measureHeight(heightmeasureSpec);  setMeasuredDimension(wIDth,heigh);  mRealWIDth=getMeasureDWIDth()-getpaddingleft()-getpaddingRight(); } private int measureHeight(int heightmeasureSpec) {  int result=0;  int mode=MeasureSpec.getMode(heightmeasureSpec);  int size=MeasureSpec.getSize(heightmeasureSpec);  if(mode==MeasureSpec.EXACTLY){   result=size;  }else{   int textHeigh= (int) (mPaint.descent()-mPaint.ascent());   result=getpaddingtop()+getpaddingBottom()+Math.max(Math.max(mReachHeigh,mUnReachHeigh),Math.abs(textHeigh));   if(mode==MeasureSpec.AT_MOST){    result=Math.min(result,size);   }  }  return result; } @OverrIDe protected synchronized voID onDraw(Canvas canvas) {  canvas.save();  canvas.translate(getpaddingleft(),getHeight()/2);  boolean noNeedUnReach=false;  String text=getProgress()+"%";  int textWIDth= (int) mPaint.measureText(text);  float radio =getProgress()*1.0f/getMax();  float progressX=radio*mRealWIDth;  if(progressX+textWIDth>mRealWIDth){   progressX=mRealWIDth-textWIDth;   noNeedUnReach=true;  }  float endX=progressX-mTextOffset/2;  if(endX>0){   mPaint.setcolor(mReachcolor);   mPaint.setstrokeWIDth(mReachHeigh);   canvas.drawline(0,endX,mPaint);  }  //draw text  mPaint.setcolor(mTextcolor);  int y = (int) (-(mPaint.descent()+mPaint.ascent())/2);  canvas.drawText(text,progressX,y,mPaint);  //draw unreach bar  if(!noNeedUnReach){   float startX=progressX+ mTextOffset/2+textWIDth;   mPaint.setcolor(mUnReachcolor);   mPaint.setstrokeWIDth(mUnReachHeigh);   canvas.drawline(startX,mRealWIDth,mPaint);  }  canvas.restore(); } protected int dp2px(int dpVal){  return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,dpVal,getResources().getdisplayMetrics()); } protected int sp2px(int spVal){  return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,spVal,getResources().getdisplayMetrics()); }}

RoundProgressbarWithProgress的代码

import androID.content.Context;import androID.content.res.TypedArray;import androID.graphics.Canvas;import androID.graphics.Paint;import androID.graphics.RectF;import androID.os.Build;import androID.support.annotation.RequiresAPI;import androID.util.AttributeSet;import trunk.doi.base.R;/** * 作者:Mr.Lee on 2017-10-18 10:48 * 邮箱:569932357@qq.com */public class RoundProgressbarWithProgress extends HorizontalProgressbarWithProgress { private int mRadius=dp2px(30); private int mMaxPaintWIDth; public RoundProgressbarWithProgress(Context context) {  super(context);  init(null); } public RoundProgressbarWithProgress(Context context,attrs);  init(attrs); } public RoundProgressbarWithProgress(Context context,defStyleAttr);  init(attrs); } @RequiresAPI(API = Build.VERSION_CODES.LolliPOP) public RoundProgressbarWithProgress(Context context,defStyleRes);  init(attrs); } private voID init(AttributeSet attrs){  mReachHeigh= (int) (mUnReachHeigh*2.5f);  TypedArray array=getContext().obtainStyledAttributes(attrs,R.styleable.RoundProgressbarWithProgress);  mRadius=(int) array.getDimension(R.styleable.RoundProgressbarWithProgress_radius,mRadius);  array.recycle();  mPaint.setStyle(Paint.Style.stroke);  mPaint.setAntiAlias(true);  mPaint.setDither(true);  mPaint.setstrokeCap(Paint.Cap.ROUND); } @OverrIDe protected synchronized voID onMeasure(int wIDthMeasureSpec,int heightmeasureSpec) {  mMaxPaintWIDth=Math.max(mReachHeigh,mUnReachHeigh);  //默认4个padding一致  int except=mRadius*2+mMaxPaintWIDth+getpaddingleft()+getpaddingRight();  int wIDth=resolveSize(except,wIDthMeasureSpec);  int height=resolveSize(except,heightmeasureSpec);  int realWIDth=Math.min(wIDth,height);  mRadius=(realWIDth-getpaddingleft()-getpaddingRight()-mMaxPaintWIDth)/2;  setMeasuredDimension(realWIDth,realWIDth); } @OverrIDe protected synchronized voID onDraw(Canvas canvas) {  String text=getProgress()+"%";  float textWIDth=mPaint.measureText(text);  float textHeight=(mPaint.ascent()+mPaint.descent())/2;  canvas.save();  canvas.translate(getpaddingleft(),getpaddingtop());  mPaint.setStyle(Paint.Style.stroke);  // draw unreachbar  mPaint.setcolor(mUnReachcolor);  mPaint.setstrokeWIDth(mUnReachHeigh);  canvas.drawCircle(mRadius,mRadius,mPaint);  //draw reach bar  mPaint.setcolor(mReachcolor);  mPaint.setstrokeWIDth(mReachHeigh);  float sweepAngle=getProgress()*1.0f/getMax()*360;  canvas.drawArc(new RectF(0,mRadius*2,mRadius*2),sweepAngle,false,mPaint);  //draw text  mPaint.setcolor(mTextcolor);  mPaint.setStyle(Paint.Style.FILL);  canvas.drawText(text,mRadius-textWIDth/2,mRadius-textHeight,mPaint);  canvas.restore(); }}

activity_vIEw_mv代码

<?xml version="1.0" enCoding="utf-8"?><relativeLayout  xmlns:androID="http://schemas.androID.com/apk/res/androID" xmlns:app="http://schemas.androID.com/apk/res-auto" androID:ID="@+ID/rl_vIEw"  androID:layout_wIDth="match_parent"  androID:layout_height="wrap_content" >  <trunk.doi.base.ui.activity.test.HorizontalProgressbarWithProgress   androID:ID="@+ID/progress_bar"      androID:layout_margintop="50dp"   androID:padding="5dp"   androID:layout_wIDth="match_parent"   androID:layout_height="wrap_content"   androID:max="100"   androID:progress="50"   app:progress_unreach_color="@color/pink"   app:progress_text_color="@color/yellow"   app:progress_reach_color="@color/red"   />  <androID.support.v7.Widget.AppCompatSeekbar   androID:ID="@+ID/seekbar"   androID:layout_wIDth="match_parent"   androID:layout_height="wrap_content"   androID:padding="5dp"   androID:layout_margintop="100dp"   />  <trunk.doi.base.ui.activity.test.RoundProgressbarWithProgress   androID:ID="@+ID/progress_bar2"      androID:layout_margintop="150dp"   androID:padding="5dp"   androID:layout_wIDth="match_parent"   androID:layout_height="wrap_content"   androID:max="100"   androID:progress="0"   app:progress_unreach_color="@color/pink"   app:progress_text_color="@color/yellow"   app:progress_reach_color="@color/red"   app:progress_reach_height="3dp"   app:progress_unreach_height="1dp"   app:radius="200dp"   /></relativeLayout>

VIEwMvActivity代码

import androID.os.Bundle;import androID.support.annotation.Nullable;import androID.support.v7.Widget.AppCompatSeekbar;import androID.vIEw.MotionEvent;import androID.vIEw.VIEw;import androID.Widget.relativeLayout;import androID.Widget.Seekbar;import butterknife.BindVIEw;import trunk.doi.base.R;import trunk.doi.base.base.BaseActivity;public class VIEwMvActivity extends BaseActivity { //没有集成Butterknife的findvIEwbyID() @BindVIEw(R.ID.progress_bar) HorizontalProgressbarWithProgress progress_bar; @BindVIEw(R.ID.progress_bar2) RoundProgressbarWithProgress progress_bar2; @BindVIEw(R.ID.seekbar) AppCompatSeekbar seekbar; private float mtouchstartY; private static final float touch_MOVE_MAX_Y=600; @OverrIDe protected int initLayoutID() {  return R.layout.activity_vIEw_mv; } @OverrIDe protected voID initVIEw(@Nullable Bundle savedInstanceState) { } @OverrIDe protected voID setListener() {  seekbar.setonSeekbarchangelistener(new Seekbar.OnSeekbarchangelistener() {   @OverrIDe   public voID onProgressChanged(Seekbar seekbar,int progress,boolean fromUser) {    progress_bar.setProgress(progress);    progress_bar2.setProgress(progress);   }   @OverrIDe   public voID onStartTrackingtouch(Seekbar seekbar) {   }   @OverrIDe   public voID onStopTrackingtouch(Seekbar seekbar) {   }  }); } @OverrIDe protected voID initData() { }}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。

总结

以上是内存溢出为你收集整理的Android打造炫酷进度条效果全部内容,希望文章能够帮你解决Android打造炫酷进度条效果所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1144085.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存