全网整合营销服务商

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

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

Android自定义View 使用PathMeasure简单模仿系统ProgressBar(四)

使用PathMeasure简单模仿系统ProgressBar,效果如下:

还蛮像的吧,有的人问了,系统自带的你闲的搞这个干嘛,当然是纯粹为了学习PathMeasure这个类。

PathMeasure是用来测量Path路径的,可以截取路径中某一段路径,通过改变这段路径的起点、终点,达到类似VectorDrawable中的路径动画效果:

直接new就可以获得PathMeasure对象:

PathMeasure pathMeasure = new PathMeasure();

或者

PathMeasure pathMeasure = new PathMeasure(path, forceClosed);

其中path代表一个Path对象,forceClosed代表你测量的path是否闭合,如果为true,那么测量长度的时候周长会按path.close()来算。

也可以调用以下方法设置路径:

pathMeasure.setPath(path, forceClosed);

获得路径的长度:

float length = pathMeasure.getLength();

截取路径,新截取到的赋值给一个新Path对象mDstPath

pathMeasure.getSegment(start, stop, mDstPath, true);

其中start和stop为起止长度,第四个参数代表是否startWithMoveTo,是否从moveTo位置开始,一般为true。

要实现上面的效果,那就用属性动画写一个0到1的百分比,根据当前的百分比和原路径的长度,动态改变新路径的起止点长度:

1、写自定义属性、构造方法、初始化Paint、Path、测量宽高。注意Path要两个,一个装有原始数据,一个去装新截取的路径数据:

  mPath = new Path();
  mDst = new Path();

2、初始化PathMeasure,并设置路径,获得原始长度:

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
 mPath.addCircle(w / 2, h / 2, mRadius, Path.Direction.CW);
 mPathMeasure = new PathMeasure();
 mPathMeasure.setPath(mPath, false);
 mPathLength = mPathMeasure.getLength();
}

因为给mPathMeasure 设置的路径必须要装载数据,所以此时mPath需要加上你想画的东西,画一个圆又要有宽高,onDraw中又不能new对象,所以我把这些操作放到了onSizeChanged中。

3、写一个动画,获取当前长度的百分比mPathPercent:

private void startAnim() {
 ValueAnimator anim = ValueAnimator.ofFloat(0, 1);
 anim.setInterpolator(new DecelerateInterpolator());
 anim.setRepeatCount(ValueAnimator.INFINITE);
 anim.setDuration(mAnimDuration);
 anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
  @Override
  public void onAnimationUpdate(ValueAnimator animation) {
   mPathPercent = (float) animation.getAnimatedValue();
   invalidate();
  }
 });
 anim.start();

 //再加一个旋转动画以及两倍的时长,形成旋转视差
 ObjectAnimator animRotate = ObjectAnimator.ofFloat(this, View.ROTATION, 0, 360);
 animRotate.setInterpolator(new LinearInterpolator());
 animRotate.setRepeatCount(ValueAnimator.INFINITE);
 animRotate.setDuration(2 * mAnimDuration);
 animRotate.start();
}

4、动态改变起止点长度,截取新路径并绘制:

@Override
protected void onDraw(Canvas canvas) {
 float stop = mPathLength * mPathPercent;
 float start = (float) (stop - ((0.5 - Math.abs(mPathPercent - 0.5)) * mPathLength * 4));
 mDst.reset();
//  mDst.lineTo(0, 0);
 mPathMeasure.getSegment(start, stop, mDst, true);
 canvas.drawPath(mDst, mPaint);
}

注意此时绘制的路径是新路径mDst,而不是装有原始数据的老路径mPath~

5、顺便加几个控制的方法:

 public void start() {
  mIsLoading = true;
  setVisibility(View.VISIBLE);
  startAnim();
 }

 public void stop() {
  mIsLoading = false;
  setVisibility(View.GONE);
 }

 public boolean isLoading() {
  return mIsLoading;
 }

Button btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View v) {
  if (loadingView.isLoading()) {
   loadingView.stop();
  } else {
   loadingView.start();
  }
 }
});

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


# Android  # View  # PathMeasure  # ProgressBar  # Android自定义谷歌风格ProgressBar  # Android编程实现自定义ProgressBar样式示例(背景色及一级、二级进度条颜色)  # Android三种方式实现ProgressBar自定义圆形进度条  # Android编程ProgressBar自定义样式之动画模式实现方法  # android ListView和ProgressBar(进度条控件)的使用方法  # Android ProgressBar进度条和ProgressDialog进度框的展示DEMO  # Android ProgressBar进度条使用详解  # Android编程之自定义ProgressBar示例  # 原始数据  # 几个  # 你想  # 我把  # 这段  # 又要  # 自定义  # 问了  # 就用  # 有的人  # 再加  # 两倍  # 时长  # 中又  # 大家多多  # 就可以  # 为给  # 画一  # 而不是  # 系统自带 


相关文章: 子杰智能建站系统|零代码开发与AI生成SEO优化指南  如何在Mac上搭建Golang开发环境_使用Homebrew安装和管理Go版本  常州自助建站费用包含哪些项目?  如何在宝塔面板中修改默认建站目录?  如何选择服务器才能高效搭建专属网站?  西安制作网站公司有哪些,西安货运司机用的最多的app或者网站是什么?  网站企业制作流程,用什么语言做企业网站比较好?  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  成都响应式网站开发,dw怎么把手机适应页面变成网页?  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  如何用AWS免费套餐快速搭建高效网站?  如何在Windows环境下新建FTP站点并设置权限?  如何自定义建站之星模板颜色并下载新样式?  可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?  MySQL查询结果复制到新表的方法(更新、插入)  网站制作免费,什么网站能看正片电影?  网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?  建站之星收费标准详解:套餐费用及年费价格表一览  建站主机如何安装配置?新手必看操作指南  视频网站制作教程,怎么样制作优酷网的小视频?  已有域名和空间如何快速搭建网站?  C#如何使用XPathNavigator高效查询XML  网站建设设计制作营销公司南阳,如何策划设计和建设网站?  Thinkphp 中 distinct 的用法解析  建站之星如何助力企业快速打造五合一网站?  公司网站制作价格怎么算,公司办个官网需要多少钱?  专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?  如何用搬瓦工VPS快速搭建个人网站?  手机网站制作与建设方案,手机网站如何建设?  javascript中的try catch异常捕获机制用法分析  建站上市公司网站建设方案与SEO优化服务定制指南  已有域名建站全流程解析:网站搭建步骤与建站工具选择  微信推文制作网站有哪些,怎么做微信推文,急?  宁波自助建站系统如何快速打造专业企业网站?  北京建设网站制作公司,北京古代建筑博物馆预约官网?  青浦网站制作公司有哪些,苹果官网发货地是哪里?  如何用美橙互联一键搭建多站合一网站?  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  如何快速搭建响应式可视化网站?  零服务器AI建站解决方案:快速部署与云端平台低成本实践  七夕网站制作视频,七夕大促活动怎么报名?  如何快速查询网站的真实建站时间?  python的本地网站制作,如何创建本地站点?  网站海报制作教学视频教程,有什么免费的高清可商用图片网站,用于海报设计?  宝塔Windows建站如何避免显示默认IIS页面?  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  制作宣传网站的软件,小红书可以宣传网站吗?  上海网站制作网站建设公司,建筑电工证网上查询系统入口?  如何用景安虚拟主机手机版绑定域名建站?  *服务器网站为何频现安全漏洞? 

您的项目需求

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