文档章节

神奇ProgressBar——添加一个,显示四个,这是什么鬼?

猴亮屏
 猴亮屏
发布于 2017/07/14 15:14
字数 1385
阅读 23
收藏 0

定位bug:

1.确认我确实是在布局文件里面添加了一个PB,并没有从代码里动态添加,这就排除了动态添加错误问题。

2.PB是添加在fragment中的,通过调试,确认了以下结果:

  • 只new了一个activity出来
  • activity只走了一遍生命周期
  • 只new了一个fragment出来
  • fragment只走了一遍生命周期

这又排除了多容器创建和页面多次重绘导致PB被重复创建的问题。

3.这个PB根据需要,做成了类似ios上那种菊花样式(Ios的UI以现在来看是在太丑而且恶俗),实现原理为:

 <ProgressBar
        android:id="@+id/pb"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:indeterminateDrawable="@drawable/loading" />

loading.xml

<?xml version="1.0" encoding="UTF-8"?>
<animation-list android:oneshot="false"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:duration="150" android:drawable="@drawable/loading_01" />
    <item android:duration="150" android:drawable="@drawable/loading_02" />
    <item android:duration="150" android:drawable="@drawable/loading_03" />
    <item android:duration="150" android:drawable="@drawable/loading_04" />
    <item android:duration="150" android:drawable="@drawable/loading_05" />
    <item android:duration="150" android:drawable="@drawable/loading_06" />
    <item android:duration="150" android:drawable="@drawable/loading_07" />
    <item android:duration="150" android:drawable="@drawable/loading_08" />
    <item android:duration="150" android:drawable="@drawable/loading_09" />
    <item android:duration="150" android:drawable="@drawable/loading_10" />
    <item android:duration="150" android:drawable="@drawable/loading_11" />
    <item android:duration="150" android:drawable="@drawable/loading_12" />
</animation-list>

这里面的loading_01到loading_12都是各个时间段的菊花图片,这里的意思就是每个图片显示150毫秒后换到下一张图片。这样的显示效果是最像ios菊花的。

我尝试把android:indeterminateDrawable="@drawable/loading"属性去掉后,这个PB就恢复了android默认样式,而且在垃圾牌S6手机上显示就正常了,所以我就定位bug的源头就在这个属性。

经过搜索,了解到indeterminateDrawable这个属性与ProgressDrawable属性相对立,这个属性的意思就是设置「忽略PB的【进度】功能」的图片或动画,而ProgressDrawable属性则是设置「进度」图片和动画。

研究bug:

经过以上bug定位三步走,我定位到了引发bug的代码,但是为什么设置indeterminateDrawable属性在其他手机上正常而在垃圾S6上就出bug?

经过观察,发现在S6上PB要比在其他手机上小很多,我给PB加了一个红色背景,然后把wrap_content改为定值,从40dp开始逐渐加大,发现layout_width越大,里面的菊花就越多,而且菊花的尺寸并不随PB的尺寸一起变化,那么就可以知道是菊花图片尺寸的问题导致的。从而断定,loading.xml里面的item,并不是每150毫秒会以下一张图片替换上一张,也不是覆盖上一张,而是每150毫秒就会添加下一张图片,这些图片是替换、堆叠还是并列,都是由图片的容器PB来决定的!

那么为什么其他手机(小米、华为、乐视、oppo)显示正常呢,经过百度,原来我手里的这些国产手机屏幕的分辨率是1080P的全高清屏,分辨率为1080*1920,而出问题的这个垃圾6的分辨率为:2560*1440,属于非主流屏幕,我从网上下载的菊花图都是适配主流屏幕的,放到非主流屏幕上就会显示不正常!

解决bug:

终于找到了bug原因,下一步是考虑怎么解决:

  • 首先通过源码,了解到PB并没有提供让图片拉伸、居中这类scale方法,不能像ImageView一样方便的设置图片展示。
  • 然后考虑是否让UI妹子照猫画虎给我重做?这样她需要做好多尺寸让我一个个试,然后再用试好的尺寸弄出12朵菊花。。这种下流的事不能让妹子干,而且为了非主流的垃圾6改图会影响到主流屏幕适配。
  • 最后考虑换种方式实现ios菊花样式,于是有了:
<?xml version="1.0" encoding="UTF-8"?>
<!--<animation-list android:oneshot="false"-->
    <!--xmlns:android="http://schemas.android.com/apk/res/android">-->
    <!--<item android:duration="150" android:drawable="@drawable/loading_01" />-->
    <!--<item android:duration="150" android:drawable="@drawable/loading_02" />-->
    <!--<item android:duration="150" android:drawable="@drawable/loading_03" />-->
    <!--<item android:duration="150" android:drawable="@drawable/loading_04" />-->
    <!--<item android:duration="150" android:drawable="@drawable/loading_05" />-->
    <!--<item android:duration="150" android:drawable="@drawable/loading_06" />-->
    <!--<item android:duration="150" android:drawable="@drawable/loading_07" />-->
    <!--<item android:duration="150" android:drawable="@drawable/loading_08" />-->
    <!--<item android:duration="150" android:drawable="@drawable/loading_09" />-->
    <!--<item android:duration="150" android:drawable="@drawable/loading_10" />-->
    <!--<item android:duration="150" android:drawable="@drawable/loading_11" />-->
    <!--<item android:duration="150" android:drawable="@drawable/loading_12" />-->
<!--</animation-list>-->

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >

    <item>
        <rotate
            android:drawable="@drawable/loading_01"
            android:fromDegrees="0.0"
            android:pivotX="50.0%"
            android:pivotY="50.0%"
            android:toDegrees="1000" />
    </item>

</layer-list>

原理就是用动画让一张菊花不停的转,这样实现的效果其实更顺滑,也有更低的资源消耗,只是效果上不像真正的iOS菊花动起来那种一卡一卡的感觉。

此时在垃圾6上只会显示一朵菊花,而且这张图片也会自动在PB里填充居中,效果比较满意!

© 著作权归作者所有

共有 人打赏支持
猴亮屏

猴亮屏

粉丝 35
博文 517
码字总数 56802
作品 4
北京
Android工程师
Android开源中国客户端学习 上拉刷新 底部加载 的listview

这次学习一些osc客户端的 上拉刷新 底部加载 的listview 这里还是以加载新闻为例 osc上的下拉刷新 和底部自动加载下一页是和qq空间等app相似的,那就学习一下 其实osc是使用了一个开源的控件...

SuShine
2013/06/26
0
9
程序员蜕变史,小白变大牛

程序员的官方说法是从事于软件开发、维护的工作人员,所以他们的工作性质不是一般人所能接受的,整天面对的是一堆又一堆的代码,程序员的内心比常人容易焦躁也就不那么奇怪了。为此,程序员鼓...

Navicat数据库管理工具
2016/04/21
145
0
源码解析ButterKnife

0、引子 话说我们做程序员的,都应该多少是个懒人,我们总是想办法驱使我们的电脑帮我们干活,所以我们学会了各式各样的语言来告诉电脑该做什么——尽管,他们有时候也会误会我们的意思。 突...

waffle930
2016/09/22
19
0
为什么注解注入不成功但是xml就行了?

SSH,在用老版本练手。其中出了很多奇奇怪怪的事情,特别是整合过程。为什么会出现这种注解注入时报错:at least 1 matching results,但是根本就只有一个bean;然后我找了许久错误,实在没办...

语博兄
2015/04/29
169
3
继续聊WPF——进度条

ProgressBar控件与传统WinForm使用方法完全一样,我们只需关注: Minimum——最小值,默认为0; Maximum——最大值,默认为100. Value——当前值。 关键是它的控件模板,因为系统的默认主题不...

junwong
2012/04/18
838
0

没有更多内容

加载失败,请刷新页面

加载更多

转:XMLHttpRequest2 新技巧

”XMLHttpRequest 的异步调用网上找的例子运行没问题,但稍微改了一点点就报错”InvalidStateError: XMLHttpRequest has an invalid context“。断断续续 搞了3天终于通了,可以接收二进制文...

SamXIAO
32分钟前
1
0
=====D服务器定时任务=====

Linux定时任务 crontab linux系统是有cron这个系统服务来控制的,Liunx系统上包含很多的计划性工作,使用者自己可以设置计划任务,所以linux系统提供了使用者控制计划任务的命令 crontab的启...

覃光林
41分钟前
1
0
xilinx资源

本系列教学视频由赛灵思高级战略应用工程师带领你:从零开始,一步步深入 掌握 HLS 以及 UltraFAST 设计方法,帮助您成为系统设计和算法加速的大拿! http://www.eetrend.com/topics/2018-0...

whoisliang
52分钟前
2
0
企业级开源四层负载均衡解决方案--LVS

网盘链接 企业级开源四层负载均衡解决方案--LVS 本课程将在Linux环境下,学习配置使用LVS,对Web集群和MySQL集群进行负载均衡,并结合利用Keepalived实现负载均衡器的高可用,实现对后端Rea...

qq__2304636824
今天
3
0
Windows上安装Spacemacs

emacs安装 下载地址emacs 安装比较简单,解压后执行\bin\addpm.exe即可 emacs配置 emacs的默认配置文件路径和.emacs.d文件夹都是在Windows主目录下的 C:\Users\Administrator\AppData\Roami...

yxmsw2007
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部