android图标随着进度条动画,Android开发之ProgressBar字体随着进度条的加载而滚动...

在网上翻阅了很多关于ProgressBar滚动效果,但是始终没有找到适合项目中的这种效果,故自己写这篇文章,记录一下写作过程,给大家做一个参考。先看下最终效果效果图

d916a804da60590aee23f0d7e17027e9.gif

我这里用的是LICEcap软件录制的gif图,效果有点掉帧,哪位仁兄有比较好的录制gif的软件烦请相告,小弟在此先行谢过。

首先看下xml代码,只有两个系统控件,一个TextView和一个ProgressBar,Button只是为了方便触发进度条的效果,实际项目中可以根据需求来做。首先看下xml中的代码:

android:id="@+id/activity_main"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

android:layout_margin="5dp">

android:layout_marginTop="50dp"

android:id="@+id/progress_precent"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="0%"

android:textColor="#ff00"

android:textSize="12sp"

android:padding="3dp"/>

android:id="@+id/pb_progressbar"

style="?android:attr/progressBarStyleHorizontal"

android:layout_width="match_parent"

android:layout_height="5dp"

android:max="100"

android:progress="0"

android:progressDrawable="@drawable/progressbar_color" />

android:id="@+id/btn_start"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_marginTop="30dp"

android:text="start" />

样式:progressbar_color.xml

在onCreate()方法中得到控件的宽度,代码如下:

// 得到progressBar控件的宽度

ViewTreeObserver vto2 = pbProgressbar.getViewTreeObserver();

vto2.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {

@Override

public void onGlobalLayout() {

pbProgressbar.getViewTreeObserver().removeGlobalOnLayoutListener(this);

width = pbProgressbar.getWidth();

Log.i("TAG", "MainActivity onCreate()=="+pbProgressbar.getWidth());

}

});

先说下具体实现思路,再贴上最终代码

实现思路是我们需要ProgressBar达到最大值时,TextView的位置移动到最远处。要想得到progressBar的任意百分比可以移动到对应百分比的位置,咱们就需要知道每一个百分比移动的距离。说的还不够明白的话咱们看看下面的公式,可以更好的理解。

// 进度条的最小单位,默认是1,你也可以是其他数值,我在demo中为了方便使用了1:

进度条的最小单位 / 进度条的最大值 = 每一个百分比移动的距离/总的距离(控件的总宽度)

可以推导出:

每一个百分比要移动距离 = (进度条的最小单位 / 进度条的最大值)*总的距离(控件的总宽度)

因为要做移动动画效果,咱们为了避免ANR,直接开一个分线程来控制界面,主要代码如下

//开启分线程

new Thread(new Runnable() {

@Override

public void run() {

//每一段要移动的距离

scrollDistance = (float) ((1.0 / pbProgressbar.getMax()) * width);

for (int i = 1; i <= status; i++) {

runOnUiThread(new Runnable() {

@Override

public void run() {

currentStatue++;

currentPosition += scrollDistance;

pbProgressbar.incrementProgressBy(1);

//做一个平移动画的效果

progressPrecent.setTranslationX(currentPosition);

progressPrecent.setText(currentStatue + "%");

}

});

try {

Thread.sleep(80);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}).start();

大功告成,但是当我们运行起来的时候发现,当ProgressBar达到最大值时,上面的字体超出了屏幕范围而看不到了。效果如图所示:

cc03c54876712e7bd3075a1c5fc1e217.gif

这给使用者造成了很大的困惑,静下心来分析一下,可以知道TextView一直在对应ProgressBar数据的右面,语言功底不太好,咱们上图看:

73c37475fa92dd048783186a06ce215c.gif

可以看出,当数据为0%时就在progressBar对应数据的右方,当数据为最大值时,超出屏幕显示不了就不足为其了。咱们现在如果想让progressBar是最大值时还能显示,就需要当偏移的距离加上字体的宽度和字体右面的Padding值大于progressBar宽度的时候不偏移。接着修改代码如下:

//开启分线程

new Thread(new Runnable() {

@Override

public void run() {

//每一段要移动的距离

scrollDistance = (float) ((1.0 / pbProgressbar.getMax()) * width);

for (int i = 0; i < status; i++) {

runOnUiThread(new Runnable() {

@Override

public void run() {

// 控制进度条的增长进度

pbProgressbar.incrementProgressBy(1);

currentStatue++;

tvPrecent.setText(currentStatue + "%");

// 得到字体的宽度

tvWidth = tvPrecent.getWidth();

currentPosition += scrollDistance;

//做一个平移动画的效果

// 这里加入条件判断

if (tvWidth + currentPosition <= width - tvPrecent.getPaddingRight()) {

tvPrecent.setTranslationX(currentPosition);

}

}

});

try {

Thread.sleep(80);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}).start();

我们运行起来,再来看下效果:

0fd1b8ab4e3cd00566a0d198ed46fa6d.gif

到这里咱们就完成了,有不清楚或者写错的地方欢迎留言指正,我会第一时间答复。需要源码的朋友可以去github上下载,双手奉上github地址:字体随着ProgressBar的加载而滚动 。

总结

以上所述是小编给大家介绍的Android开发之ProgressBar字体随着进度条的加载而滚动,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/332564.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spark ui_Spark UI的见解

spark ui作为apache-spark-job解剖的后续文章&#xff0c;我将分享您如何使用Spark UI进行作业调整。 我将继续使用先前文章中使用的相同示例&#xff0c;新的spark应用程序将在以下方面完成工作 –阅读纽约市停车票 –通过“板ID”进行汇总并计算违规日期 –保存结果 此代…

Android布局加载慢,Android布局优化(四)X2C — 提升布局加载速度200%

系列文章前言在Android布局优化(一)从布局加载原理说起中我们说到了布局加载的两大性能瓶颈&#xff0c;通过IO操作将XML加载到内存中并进行解析和通过反射创建View。这里介绍一种避免运行时通过IO操作读取布局文件的“黑科技”—X2C。个人认为这个技术在实际项目中使用可能会需…

api 获取网络使用情况_您的API是什么情况?

api 获取网络使用情况免责声明&#xff1a;在纯REST中&#xff0c;API是不透明的&#xff0c;URL应该是对先前请求的响应中作为链接发送的内容。 但是&#xff0c;我不是在讲纯REST&#xff0c;而是在讲更实用的API&#xff0c;其中涉及REST的一些概念以及通用的API最佳实践。 …

判断字符串是不是application/x-www-form-urlencoded字符串(URL编码格式的字符串)

import java.util.BitSet;/*** 判断一个字符串是不是URL编码字符串的工具类&#xff0c;即判断字符串是不是application/x-www-form-urlencoded字符串** author liaowenxiong* date 2022/1/14 11:32*/public class URLEncodeUtils {private static BitSet bitSet;static {bitSe…

数据查询和业务流分开_传统数仓和大数据数仓的区别是什么?

概念与容器为什么先说这个&#xff0c;其实很简单&#xff1a;因为绝大多数人都把这两个概念混为一谈。然后就会出现各种各样的问题&#xff1a;oracle不是数据库么&#xff0c;怎么又是数据仓库&#xff1f;Hive不是数据仓库么&#xff1f;怎么又是数据库&#xff1f;数据仓库…

android 多语言不起作用,Android本地化语言环境不起作用,所有区域代码都存在问题...

我需要将除瑞士之类的子语言环境添加到我的应用程序中,而不是普通的德语.我找到的德语资源文件夹的语言环境扩展名为de.所以我的文件夹名为“values-de”.这很好.然后我添加了“values-de_CH”并继续收到错误“无效的资源目录名称”.我也试过“values-de_rCH”和“values-de_ch…

aws 性能_AWS上的应用程序自动扩展–选项和对性能的影响

aws 性能至关重要的是扩展软件应用程序&#xff0c;以避免由于网站的客户群或需要处理大型数据集的应用程序等导致的工作负载增加而导致性能瓶颈的情况。云服务提供商通常是访问其他应用程序的最佳方法随需应变的资源&#xff0c;可根据应用程序的负载变化来放大或缩小。 1.什…

java中月日年这种怎么转换成年月日_最“热乎”的Java社招面试经历分享(共40个面试题)...

面试时间&#xff1a;2020年10月12日1、final finally finalize的区别2、synchronized关键字的作用以及在什么时候使用&#xff0c;concurrent包里面其它的锁。3、有遇到过死锁的问题吗&#xff1f;(死锁的原理和解决方法)4、hashmap的实现原理&#xff0c;hashmap和hashtable的…

(案例)使用Cookie保存用户最后一次访问的时间

文章目录需求分析示例代码需求 1.访问一个Servlet&#xff0c;如果获取不到上一次访问的时间&#xff0c;则提示&#xff1a;您好&#xff0c;欢迎访问。 2.如果可以获取上一次访问的时间&#xff0c;则提示&#xff1a;您好&#xff0c;欢迎回来&#xff0c;您上次访问时间为…

aws lambda使用_使用AWS Lambda,S3和AWS CloudFront进行动态内容缓存

aws lambda使用快速提供内容对于任何网站或应用程序具有更好的客户体验都是必不可少的。 如果您将网站或应用程序托管在AWS Cloud中&#xff0c;那么无论从何处访问应用程序&#xff0c;都可以以较低的延迟快速提供内容。 AWS提供了CloudFront服务&#xff0c;用于将内容缓存在…

android+阴影+xml,Android 阴影视图 ShadowViewHelper

软件介绍ShadowViewHelper 是 Android 的阴影布局。xml:android:id"id/activity_main_shadow_view_b"android:layout_width"wrap_content" android:layout_height"wrap_content"android:layout_gravity"center"android:layout_marginT…

docker-compose观察实时日志_基于 Flink SQL CDC 的实时数据同步方案

整理&#xff1a;陈政羽(Flink 社区志愿者) Flink 1.11 引入了 Flink SQL CDC&#xff0c;CDC 能给我们数据和业务间能带来什么变化&#xff1f;本文由 Apache Flink PMC&#xff0c;阿里巴巴技术专家伍翀 (云邪)分享&#xff0c;内容将从传统的数据同步方案&#xff0c;基于 F…

android dialog 字体,android – 为AlertDialog的MultiSelectItems设置自定义字体(字体)

AlertDialog.Builder使用AlertController.AlertParams构建对话框.我检查了AlertDialog.Builder #create()调用AlertController.AlertParams #application()如果设置了项目,则创建ListView并分配适配器(AlertParams#createListView()).我基于createListView源创建了自定义适配器…

困难是成功路上的垫脚石_Java是开发的垫脚石。 学习吧!

困难是成功路上的垫脚石Java是全世界使用最广泛的编程语言之一 。 尽管也有很多其他编程语言&#xff0c;但是没有什么可以比Java更好的了。 Java是用于开发移动应用程序&#xff0c;游戏&#xff0c;Web应用程序&#xff0c;桌面应用程序和许多其他令人兴奋的事物的出色语言之…

python 3.6.5 shell_Linux 安装 Python3.6.5

1. 安装依赖环境 yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel 2. 下载 Python 3.6.5 wget https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tgz 3. 创建安装…

你真的会用Mac中的Finder吗?

参加&#xff1a;https://zhuanlan.zhihu.com/p/144139903

用c语言实现mfc系统,MFC实现学生选课系统

本文实例为大家分享了MFC实现学生选课系统的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下先上效果图&#xff1a;主要功能&#xff1a;输入学号&#xff0c;从数据库中查找学号&#xff0c;若找到相匹配的学号&#xff0c;则显示数据库中姓名、学历、导师&#xff…

spring 构造函数注入_Spring构造函数依赖注入示例

spring 构造函数注入欢迎使用Spring构造函数依赖注入示例指南。 基于构造器的依赖注入是Spring 依赖注入的一种 。 依赖注入的另一种类型是Setter注入和字段注入。 有关Spring依赖注入的更多信息&#xff1a; Spring二传手注射的例子 Spring田间注入 依赖注入–构造函数与现…

python用pip安装numpy mac_Mac下python安装numpy,pandas,matplotlib

numpy是数据分析的库&#xff0c;我的目的是分析股票的数据&#xff0c;Pandas 有两种自己独有的基本数据结构Series &#xff08;一维&#xff09;和 DataFrame&#xff08;二维&#xff09;&#xff0c;它们让数据操作更简单了。它也是 Python 的一个库&#xff0c;所以&…