文档章节

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

猴亮屏
 猴亮屏
发布于 2017/07/14 15:14
字数 1385
阅读 27
收藏 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里填充居中,效果比较满意!

© 著作权归作者所有

共有 人打赏支持
猴亮屏

猴亮屏

粉丝 36
博文 522
码字总数 56900
作品 4
北京
Android工程师
私信 提问
程序员蜕变史,小白变大牛

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

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
Android开源中国客户端学习 上拉刷新 底部加载 的listview

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

SuShine
2013/06/26
0
9

没有更多内容

加载失败,请刷新页面

加载更多

Spring应用学习——AOP

1. AOP 1. AOP:即面向切面编程,采用横向抽取机制,取代了传统的继承体系的重复代码问题,如下图所示,性能监控、日志记录等代码围绕业务逻辑代码,而这部分代码是一个高度重复的代码,也就...

江左煤郎
今天
4
0
eclipse的版本

Eclipse各版本代号一览表 Eclipse的设计思想是:一切皆插件。Eclipse核心很小,其它所有功能都以插件的形式附加于Eclipse核心之上。 Eclipse基本内核包括:图形API(SWT/Jface),Java开发环...

mdoo
今天
3
0
SpringBoot源码:启动过程分析(一)

本文主要分析 SpringBoot 的启动过程。 SpringBoot的版本为:2.1.0 release,最新版本。 一.时序图 还是老套路,先把分析过程的时序图摆出来:时序图-SpringBoot2.10启动分析 二.源码分析 首...

Jacktanger
今天
4
0
小白带你认识netty(二)之netty服务端启动(上)

上一章 中的标准netty启动代码中,ServerBootstrap到底是如何启动的呢?这一章我们来瞅下。 server.group(bossGroup, workGroup);server.channel(NioServerSocketChannel.class).optio...

天空小小
今天
3
0
聊聊storm trident batch的分流与聚合

序 本文主要研究一下storm trident batch的分流与聚合 实例 TridentTopology topology = new TridentTopology(); topology.newStream("spout1", spout) .p......

go4it
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部