欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用Android原生控件ProgressBar加载GIF

程序员文章站 2024-02-05 20:35:10
...

    开题在之前的一篇博文安卓自定义View实现加载gif图片中我为大家分析了利用android.graphics.Movie将GIF文件以Byte的形式引入来加载GIF,大体加载GIF的过程为: 引入Gif资源--->把gif转成byte--->利用Movie对象提供的方法计算出gif的时长---->通过onDraw不断的把更新之后的当前帧绘制出来。

        今天为大家带来另一种较为轻便的动图或者loading设计实现的方案,今天的主题是使用Android原生控件ProgressBar加以改良,来实现loading或者类似gif的加载。先上图

使用Android原生控件ProgressBar加载GIF


    我先分析一下实现过程然后再为大家贴上具体实现代码。如开题所说,该方式并不是真正意思上的加载gif,而是利用progressbar中indeterminateDrawable属性加载提前做好的一帧一帧的图片来完成的。

   过程分析
      1.提前做好被加载的一帧一帧的图片资源
      2.在drawable文件目录下新建一个animation-list文件,并且把做好的一帧一帧的图片资源以item的形式加入,并指定该文件oneshot属性为false。
      3.给progressBar的indeterminationDrawable属性指定drawable文件目录下的animation-list文件。
   
   源码示例:
   drawable文件目录下的animation-list文件:animation_list_load_question.xml
 
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false">
    <item
        android:drawable="@drawable/ic_load_question_1"
        android:duration="150" />
    <item
        android:drawable="@drawable/ic_load_question_2"
        android:duration="150" />
    <item
        android:drawable="@drawable/ic_load_question_3"
        android:duration="150" />
    <item
        android:drawable="@drawable/ic_load_question_4"
        android:duration="150" />
    <item
        android:drawable="@drawable/ic_load_question_5"
        android:duration="150" />
    <item
        android:drawable="@drawable/ic_load_question_6"
        android:duration="150" />


</animation-list>

引用ProgressBar的xml文件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/rl_load_animation"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/color_ffffff">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="125px"
        android:text="难度系数:3.5"
        android:textColor="@color/color_939393"
        android:textSize="30px" />

    <FrameLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:layout_gravity="center"
        android:gravity="center">

        <ProgressBar
            android:layout_width="500px"
            android:layout_height="500px"
            android:indeterminateDrawable="@drawable/animation_list_load_question" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom|center"
            android:layout_marginBottom="40px"
            android:gravity="center"
            android:text="试题正在赶来\n..."
            android:textColor="@color/color_ffffff"
            android:textSize="30px" />
    </FrameLayout>
</RelativeLayout>
 其实类似的制作loading的方式我在很久之前的一个开源项目《曲园帮》中就做过类似的处理,只不过今天业务上又遇到类似的处理方式,索性拿出来分享给大家。