全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Android  view自定义实现动态进度条

Android  自定义view实现动态进度条

效果图:



这个是看了梁肖的demo,根据他的思路自己写了一个,但是我写的这个貌似计算还是有些问题,从上面的图就可以看出来,左侧、顶部、右侧的线会有被截掉的部分,有懂得希望能给说一下,改进一下,这个过程还是有点曲折的,不过还是觉得收获挺多的。比如通动画来进行动态的展示(之前做的都是通过Handler进行更新的所以现在换一种思路觉得特别好),还有圆弧的起止角度,矩形区域的计算等!关于绘制我们可以循序渐进,比如最开始先画圆,然后再画周围的线,最后设置动画部分就可以了。不多说了,上代码了。

代码

自定义View

public class ColorProgressBar extends View{
  //下面这两行在本demo中没什么用,只是前几天看别人的代码时学到的按一定尺寸,设置其他尺寸的方式,自动忽略或者学习一下也不错
//  private int defaultStepIndicatorNum= (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,40,getResources().getDisplayMetrics());
//  int mCircleRadius=0.28f*defaultStepIndicatorNum;


  //布局的宽高
  private int mWidth;
  private int mHeight;
  //直径
  private int mDiameter=500;

  //底层圆画笔
  private Paint mPaintbg;
  //顶层圆的画笔
  private Paint mPaintft;
  //周围线的画笔
  private Paint mPaintLine;

  //外层线条的长度
  private int mLongItem=dip2px(20);
  //线条与圆的间距
  private int mDistanceItem=dip2px(10);
  //进度条的最大宽度(取底层进度条与顶层进度条宽度最大的)
  private int mProgressWidth;

  //底层圆的颜色
  private int mBackColor;
  //顶层圆的颜色
  private int mFrontColor;
  //底层圆、顶层圆的宽度
  private float mBackWidth;
  private float mFrontWidth;
  //设置进度
  private float currentvalue;
  //通过动画演示进度
  private ValueAnimator animator;
  private int curvalue;



  public ColorProgressBar(Context context) {
    this(context,null,0);
  }

  public ColorProgressBar(Context context, AttributeSet attrs) {
    this(context, attrs,0);
  }

  public ColorProgressBar(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    TypedArray ta=context.obtainStyledAttributes(attrs, R.styleable.ColorProgressBar);
    mBackColor= ta.getColor(R.styleable.ColorProgressBar_back_color, Color.BLACK);
    mFrontColor=ta.getColor(R.styleable.ColorProgressBar_front_color,mBackColor);
    mBackWidth=ta.getDimension(R.styleable.ColorProgressBar_back_width,dip2px(10));
    mFrontWidth=ta.getDimension(R.styleable.ColorProgressBar_front_width,dip2px(10));
    mProgressWidth=mBackWidth>mFrontWidth?(int)mBackWidth:(int)mFrontWidth;
    //注意释放资源
    ta.recycle();
    init();
  }

  /**
   * 都是画笔初始化
   */
  private void init() {
    mPaintbg=new Paint(Paint.ANTI_ALIAS_FLAG);
    mPaintbg.setStrokeWidth(mProgressWidth);
    mPaintbg.setColor(mBackColor);
    mPaintbg.setStrokeCap(Paint.Cap.ROUND);
    mPaintbg.setStyle(Paint.Style.STROKE);

    mPaintft=new Paint(Paint.ANTI_ALIAS_FLAG);
    mPaintft.setColor(mFrontColor);
    mPaintft.setStyle(Paint.Style.STROKE);
    mPaintft.setStrokeWidth(mFrontWidth);
    mPaintft.setStrokeCap(Paint.Cap.ROUND);

    mPaintLine=new Paint(Paint.ANTI_ALIAS_FLAG);
    mPaintLine.setColor(Color.BLACK);
    mPaintLine.setStrokeWidth(5);

  }

  @Override
  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
//   宽度=高度=(长指针+指针与圆盘的间距+进度条的粗细+半径)*2
    Log.e("测量数据","LongItem:"+mLongItem+"mDistanceItem:"+mDistanceItem+"mProgressWidth:"+mProgressWidth+"mDiameter:"+mDiameter/2);
    mWidth=(int)2*(mLongItem+mDistanceItem+mProgressWidth*2+mDiameter/2);
    mHeight=(int)2*(mLongItem+mDistanceItem+mProgressWidth*2+mDiameter/2);
    Log.e("自定义View","高度"+mHeight+"宽度"+mWidth);
    setMeasuredDimension(mWidth,mHeight);
  }


  @Override
  protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    //绘制底层圆弧,矩形的具体计算见图片
    canvas.drawArc(new RectF(mProgressWidth/2+mDistanceItem+mLongItem,mProgressWidth/2+mDistanceItem+mLongItem,mWidth-mProgressWidth/2-mDistanceItem-mLongItem,mHeight-mProgressWidth/2-mDistanceItem-mLongItem),0,360,true,mPaintbg);
//    SweepGradient gradient=new SweepGradient();
    //绘制边缘线
    canvas.save();
    canvas.rotate(144,mWidth/2,mHeight/2);
    for(int i=0;i<=30;i++){
      canvas.rotate(-9,mWidth/2,mHeight/2);
      if(i%5==0){
        canvas.drawLine(mWidth/2,5,mWidth/2,mLongItem,mPaintbg);
      }else {
        canvas.drawLine(mWidth/2,25,mWidth/2,mLongItem,mPaintLine);
      }
    }

    canvas.restore();
    //给画笔设置渐变
    SweepGradient sweepGradient=new SweepGradient(mWidth/2,mHeight/2,Color.RED,Color.YELLOW);
    mPaintft.setShader(sweepGradient);
    //绘制顶层圆弧,currentvalue在改变时呈现动态效果
    canvas.drawArc(new RectF(mProgressWidth/2+mDistanceItem+mLongItem,mProgressWidth/2+mDistanceItem+mLongItem,mWidth-mProgressWidth/2-mDistanceItem-mLongItem,mHeight-mProgressWidth/2-mDistanceItem-mLongItem),135,currentvalue,false,mPaintft);
    mPaintft.setTextSize(100);
    mPaintft.setTextAlign(Paint.Align.CENTER);
    //绘制文本
    canvas.drawText(String.format("%.0f",currentvalue),mWidth/2,mHeight/2+50,mPaintft);
    invalidate();
  }

  /**
   * 设置动画
   * @param value
   */
  public void setCurrentValue(float value){
//    currentvalue=value;
    animator=ValueAnimator.ofFloat(currentvalue,value);
    animator.setDuration(3000);
    animator.setTarget(currentvalue);
    animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
      @Override
      public void onAnimationUpdate(ValueAnimator valueAnimator) {
        currentvalue= (float) valueAnimator.getAnimatedValue();
        curvalue=curvalue/10;
      }
    });
    animator.start();

  }
  private int dip2px(float dip){
    float density=getContext().getResources().getDisplayMetrics().density;
    return (int)(dip*density+0.5f);
  }
}

矩形计算

Activity调用

 @Override
  protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.colorprogressbar);
    mBtStart1= (Button) findViewById(R.id.bt1);

    bar1= (ColorProgressBar) findViewById(R.id.cp1);

    mBtStart1.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View view) {
        bar1.setCurrentValue(270);
      }
    });

  }

自定义属性

 <declare-styleable name="ColorProgressBar">
    <attr name="back_color" format="color"></attr>
    <attr name="front_color" format="color"></attr>
    <attr name="back_width" format="dimension"></attr>
    <attr name="front_width" format="dimension"></attr>
  </declare-styleable>

布局

注意:为了使用自定义属性需要添加一行代码(AS)

xmlns:app=http://schemas.android.com/apk/res-auto

布局

<LinearLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">
    <Button
      android:id="@+id/bt1"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="start1"/>

    <com.demo.demo.networkdemo.colorprogressbar.widget.ColorProgressBar
      android:id="@+id/cp1"
      android:layout_width="232dp"
      android:layout_height="match_parent"
      android:layout_gravity="center_horizontal"
      app:back_color="@color/colorPrimary"
      app:front_color="@color/colorAccent"
      android:background="@mipmap/ic_launcher"/>


  </LinearLayout>

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# Android  # view自定义  # view自定义实现进度条  # 动态进度条  # 进度条  # Android 自定义View实现多节点进度条功能  # Android自定义View实现水平带数字百分比进度条  # Android自定义View实现音频播放圆形进度条  # Android自定义View实现渐变色进度条  # Android自定义View实现加载进度条效果  # Android自定义带进度条WebView仿微信加载过程  # Android 自定义view和属性动画实现充电进度条效果  # android 自定义view实现彩虹进度条功能  # 自定义  # 都是  # 就可以  # 会有  # 看了  # 说了  # 不多  # 我们可以  # 希望能  # 然后再  # 写了  # 也不错  # 循序渐进  # 能给  # 前几天  # 谢谢大家  # 我写  # 两行  # 见图 


相关文章: 外汇网站制作流程,如何在工商银行网站上做外汇买卖?  建站主机如何选?高性价比方案全解析  建站之星导航菜单设置与功能模块配置全攻略  公司网站制作需要多少钱,找人做公司网站需要多少钱?  清单制作人网站有哪些,近日“兴风作浪的姑奶奶”引起很多人的关注这是什么事情?  如何用好域名打造高点击率的自主建站?  相亲简历制作网站推荐大全,新相亲大会主持人小萍萍资料?  如何快速上传自定义模板至建站之星?  深圳 网站制作,深圳招聘网站哪个比较好一点啊?  商务网站制作工程师,从哪几个方面把握电子商务网站主页和页面的特色设计?  行程制作网站有哪些,第三方机票电子行程单怎么开?  如何在云虚拟主机上快速搭建个人网站?  如何通过二级域名建站提升品牌影响力?  枣阳网站制作,阳新火车站打的到仙岛湖多少钱?  C++中引用和指针有什么区别?(代码说明)  广州美橙建站如何快速搭建多端合一网站?  网站代码制作软件有哪些,如何生成自己网站的代码?  制作网站的模板软件,网站怎么建设?  大同网页,大同瑞慈医院官网?  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  如何在Ubuntu系统下快速搭建WordPress个人网站?  如何快速查询域名建站关键信息?  魔毅自助建站系统:模板定制与SEO优化一键生成指南  建站之星IIS配置教程:代码生成技巧与站点搭建指南  淘宝制作网站有哪些,淘宝网官网主页?  头像制作网站在线制作软件,dw网页背景图像怎么设置?  小型网站建站如何选择虚拟主机?  如何用花生壳三步快速搭建专属网站?  建站之星免费模板:自助建站系统与智能响应式一键生成  如何获取PHP WAP自助建站系统源码?  建站主机是否等同于虚拟主机?  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  香港网站服务器数量如何影响SEO优化效果?  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  家庭服务器如何搭建个人网站?  网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?  北京网站制作公司哪家好一点,北京租房网站有哪些?  武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊?  北京网站制作网页,网站升级改版需要多久?  建站主机服务器选购指南:轻量应用与VPS配置解析  零基础网站服务器架设实战:轻量应用与域名解析配置指南  南宁网站建设制作定制,南宁网站建设可以定制吗?  在线教育网站制作平台,山西立德教育官网?  如何用虚拟主机快速搭建网站?详细步骤解析  黑客如何利用漏洞与弱口令入侵网站服务器?  为什么Go需要go mod文件_Go go mod文件作用说明  网站制作中优化长尾关键字挖掘的技巧,建一个视频网站需要多少钱?  建站之星五站合一营销型网站搭建攻略,流量入口全覆盖优化指南  如何在Mac上搭建Golang开发环境_使用Homebrew安装和管理Go版本  如何快速上传建站程序避免常见错误? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。