Android UI设计系列之ImageView实现ProgressBar旋转效果(1)

提起ProgressBar,想必大家都比较熟悉,使用起来也是比较方便,直接在XML文件中引用,然后添加属性,运行就OK了,虽然使用ProgressBar很方便但是在我们开发的每一个应用基本上都有自己的主体风格,如果使用了系统自带的效果图,给人的感觉是和总体风格太不搭配了,看上去很是别扭,我们自己开发也觉得不爽,于是就想着自定义一下效果,其实自定义ProgressBar的效果也不难,大概可分为三步走吧:
一、在anim文件夹下使用animation-list定义动画集

<?xml version="1.0" encoding="UTF-8"?>
<animation-list android:oneshot="false" xmlns:android="http://schemas.android.com/apk/res/android">
 <item android:duration="50" android:drawable="@drawable/circle_10001" />
 <item android:duration="50" android:drawable="@drawable/circle_10002" />
 <item android:duration="50" android:drawable="@drawable/circle_10003" />
 <item android:duration="50" android:drawable="@drawable/circle_10004" />
 <item android:duration="50" android:drawable="@drawable/circle_10005" />
 <item android:duration="50" android:drawable="@drawable/circle_10006" />
 <item android:duration="50" android:drawable="@drawable/circle_10007" />
</animation-list>

二、在style.xml文件中定义风格
[html] view plain copy 在CODE上查看代码片派生到我的代码片

<style name="CircleProgressStyle" parent="@android:style/Widget.ProgressBar.Large">
 <item name="android:indeterminateDrawable">@anim/anim_progress_circle</item>
</style>

三、在使用ProgressBar的xml文件中设置其style
[html] view plain copy 在CODE上查看代码片派生到我的代码片

<ProgressBar
 android:layout_width="50dip"
 android:layout_height="50dip"
 style="@style/CircleProgressStyle"/>

通过以上步骤,基本上就可以实现自己想要的效果了,这也是我在开发中一直习惯使用的方式,当然了使用其它方式同样可以实现这种效果,今天我主要是想讲一下使用AnimationDrawable 和ImageView结合来实现上述效果,所以以上方法就不再详解了(如果大家想了解其它的方式,留你邮箱,给你回信)。
现在进入正题,首先看一下项目结构

在drawable文件夹下新建circle.xml文件,内容如下:
[html] view plain copy 在CODE上查看代码片派生到我的代码片

<?xml version="1.0" encoding="UTF-8"?>
<animation-list
 android:oneshot="false"
 xmlns:android="http://schemas.android.com/apk/res/android">
 <item android:duration="50" android:drawable="@drawable/circle_10001" />
 <item android:duration="50" android:drawable="@drawable/circle_10002" />
 <item android:duration="50" android:drawable="@drawable/circle_10003" />
 <item android:duration="50" android:drawable="@drawable/circle_10004" />
 <item android:duration="50" android:drawable="@drawable/circle_10005" />
 <item android:duration="50" android:drawable="@drawable/circle_10006" />
 <item android:duration="50" android:drawable="@drawable/circle_10007" />
 <item android:duration="50" android:drawable="@drawable/circle_10008" />
 <item android:duration="50" android:drawable="@drawable/circle_10009" />
 <item android:duration="50" android:drawable="@drawable/circle_10010" />
 <item android:duration="50" android:drawable="@drawable/circle_10011" />
 <item android:duration="50" android:drawable="@drawable/circle_10012" />
 <item android:duration="50" android:drawable="@drawable/circle_10013" />
 <item android:duration="50" android:drawable="@drawable/circle_10014" />
 <item android:duration="50" android:drawable="@drawable/circle_10015" />
</animation-list>

在main.xml文件中做简单布局,没什么需要注释和解释的,你一看就懂,内容如下:
[html] view plain copy 在CODE上查看代码片派生到我的代码片

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 android:background="#ffffff">
 <ImageView
 android:id="@+id/imageview"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_gravity="center"
 android:src="@drawable/circle" />
 <Button
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:onClick="start"
 android:text="旋转" />
</LinearLayout>

在MainActivity中实现的代码:

public class MainActivity extends Activity { 

 private ImageView imageView;
 private AnimationDrawable animationDrawable; 

 @Override
 public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.main);
 initWedgits();
 } 

 /**
 * 初始化各组件
 */
 private void initWedgits() {
 try {
 imageView = (ImageView) findViewById(R.id.imageview);
 animationDrawable = (AnimationDrawable) imageView.getDrawable();
 } catch (Exception e) {
 e.printStackTrace();
 }
 } 

 public void start(View view) {
 try {
 animationDrawable.start();
 } catch (Exception e) {
 e.printStackTrace();
 }
 }
}

代码编写完成后运行程序,在没有点击按钮时ImageView显示一张静态图,当点击按钮后,就可以实现图片的旋转了,效果如下:

(忘记做了动画效果图,呜呜......以后补上)

可以看到只要我们点击了按钮,图片就搁在那一直旋转,是不是很神奇?赶脚和ProgressBar的效果一样,而且不用再在style.xml文件中定义样式了,顿时感觉这种方法比使用ProgressBar好了点(自恋中,(*^__^*) 嘻嘻……不要扔砖哦),但是细心的童靴就会发现一个问题,为什么把animationDrawable.start()方法放到start()方法中呢?为什么不直接放到initWedgits() 中呢?那好,为了打消大家的疑虑,现在我就把在start()方法中的代码注释掉,直接把animationDrawable.start()放到initWedgits()方法中,修改代码如下:

public class MainActivity extends Activity { 

 private ImageView imageView;
 private AnimationDrawable animationDrawable; 

 @Override
 public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.main);
 initWedgits();
 } 

 /**
 * 初始化各组件
 */
 private void initWedgits() {
 try {
 imageView = (ImageView) findViewById(R.id.imageview);
 animationDrawable = (AnimationDrawable)imageView.getDrawable();
 animationDrawable.start();
 } catch (Exception e) {
 e.printStackTrace();
 }
 } 

 public void start(View view) {
 try {
 // animationDrawable.start();
 } catch (Exception e) {
 e.printStackTrace();
 }
 }
}

这时候,你一定会想,运行之后不论点击不点击按钮(实际上你把按钮点烂,图片都不会转滴,因为我把它注释掉了,(*^__^*) 嘻嘻……)图片都会旋转,嗯,我们运行一下程序,结果你会发现图片并没有像我们想象中的那样旋转。咦?奇了怪了,图片怎么不旋转呢?是不是哪写错了,于是从头到尾检查了一遍代码,当确定了代码没有问题之后,你就郁闷了,估计会想是不是因为没有刷新的缘由呀(我刚开始就是这样想的,呜呜~~~~(>_<)~~~~ )?于是赶紧使用了View的刷新方法,把所有的都试了,图片还是不能旋转,你就更郁闷了,怎么会这样呢?是不是在onCreate方法中不能这样调用animationDrawable.start()?于是又尝试了把animationDrawable.start()方法放入到onResume()方法中,但结果图片还是不旋转,最后使用了最后一招又把该代码放入到onWindowFocusChanged(boolean hasFocus)方法中,这样一试,图片终于旋转了,呵呵,好开心呀,这时候你会很开心,因为以后使用的话直接在onWindowFocusChanged(boolean hasFocus)方法中调用animationDrawable的start()方法就行了,不再需要利用其它的事件来触发图片的旋转了,紧接着你估计就会想了为什么animationDrawable的start()方法非得放到这里才会执行了呢?出于习惯你应该会想到去找官方文档查看一下,找呀找呀找呀,终于找到了,官方文档的说明截个图如下:

哦,原来是这样,大致意思就是说不要在onCreate方法中调用AnimationDrawable的start()方法,因为此时的AnimationDrawable还没有完全附加到视图窗口上,如果想你想立即播放动画而不想用事件来触发的话(就是最开始我们使用的在start()方法中调用AnimationDrawable的start()方法),你就需要在onWindowFocusChanged(boolean hasFocus)方法中来调用AnimationDrawable的start()方法了,看完了官方文档,就知道以后怎么使用了,嘻嘻,再次高兴一下......
老习惯,贴一下代码

public class MainActivity extends Activity { 

 private ImageView imageView;
 private AnimationDrawable animationDrawable; 

 @Override
 public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.main);
 initWedgits();
 } 

 /**
 * 初始化各组件
 */
 private void initWedgits() {
 try {
 imageView = (ImageView) findViewById(R.id.imageview);
 animationDrawable = (AnimationDrawable) imageView.getDrawable();
 } catch (Exception e) {
 e.printStackTrace();
 }
 }
<p> @override
 public void onWindowFocusChanged(boolean hasFocus) {
 super.onWindowFocusChanged(hasFocus);</p><p> if(hasFocus)
 animationDrawable.start();
 }</p>
 public void start(View view) {
 try {
 //animationDrawable.start();
 } catch (Exception e) {
 e.printStackTrace();
 }
 }
}

另外,我尝试了从网上看到的另外几种方法,其中一个简单的实现就是在imageView的post()方法中调用AnimationDrawable的start()方法而不需要在onWindowFocusChanged(boolean hasFocus)方法中调用,测试了一下果然有效,至于其他的实现方式就不再贴出代码了,如果谁有兴趣可以自己动手问问度娘,毕竟自己动手,丰衣足食嘛,呵呵
好了,到此为止使用ImageView和AnimationDrawable结合的方式实现ProgressBar效果讲解完毕,感谢您的阅读。

源码下载:http://xiazai.jb51.net/201606/yuanma/Android-ImageView-ProgressBar(jb51.net).rar

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

(0)

相关推荐

  • 解析android中ProgressBar的用法

    范例说明Android的Widget,有许多是为了与User交互而特别设计的,但也有部分是作为程序提示.显示程序运行状态的Widget.现在介绍的范例,与前一章介绍过的ProgressDialog对话框的应用目的相似,但由于前章介绍的ProgressDialog是继承自Android.app.ProgressDialog所设计的互动对话窗口,在应用时,必须新建ProgressDialog对象,在运行时会弹出"对话框"作为提醒,此时应用程序后台失去焦点,直到进程结束后,才会将控制权交给应

  • Android使用Shape实现ProgressBar样式实例

    使用Shape实现样式 使用Shape中的ring实现,如下布局ring.xml: <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="ring" android:thickness="5dp" android:useLevel="false" > <gradient android:endColor

  • Android三种方式实现ProgressBar自定义圆形进度条

    进度条样式在项目中经常可以见到,下面小编给大家分享Android三种方式实现ProgressBar自定义圆形进度条. Android进度条有4种风格可以使用. 默认值是progressBarStyle. 设置成progressBarStyleSmall后,图标变小. 设置成progressBarStyleLarge后,图标变大 设置成progressBarStyleHorizontal后,变成横向长方形. 自定义圆形进度条ProgressBar的一般有三种方式: 一.通过动画实现 定义res/a

  • Android控件之ProgressBar用法实例分析

    本文实例讲述了Android控件之ProgressBar用法.分享给大家供大家参考.具体如下: ProgressBar位于android.widget包下,其继承于View,主要用于显示一些操作的进度.应用程序可以修改其长度表示当前后台操作的完成情况.因为进度条会移动,所以长时间加载某些资源或者执行某些耗时的操作时,不会使用户界面失去响应.ProgressBar类的使用非常简单,只需将其显示到前台,然后启动一个后台线程定时更改表示进度的数值即可. 以下ProgressBar跟Handle结合,模

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

    使用PathMeasure简单模仿系统ProgressBar,效果如下: 还蛮像的吧,有的人问了,系统自带的你闲的搞这个干嘛,当然是纯粹为了学习PathMeasure这个类. PathMeasure是用来测量Path路径的,可以截取路径中某一段路径,通过改变这段路径的起点.终点,达到类似VectorDrawable中的路径动画效果: 直接new就可以获得PathMeasure对象: PathMeasure pathMeasure = new PathMeasure(); 或者 PathMeasu

  • android中ProgressDialog与ProgressBar的使用详解

    一 .ProgressDialogProgressDialog与ProgressBar在UI中动态显示一个加载图标显示程序运行状态.ProgressDialog是继承自Android.app.ProgressDialog所设计的互动对话窗口,使用时,必须新建ProgressDialog对象,在运行时会弹出"对话框"作为提醒,此时应用程序后台失去焦点(即此时无法对UI组件进行操作),直到进程结束后,才会将控制权交给应用程序,如果在Activity当中不希望后台失焦,又希望提示User有某

  • android ListView和ProgressBar(进度条控件)的使用方法

    ListView控件的使用:ListView控件里面装的是一行一行的数据,一行中可能有多列,选中一行,则该行的几列都被选中,同时可以触发一个事件,这种控件在平时还是用得很多的.使用ListView时主要是要设置一个适配器,适配器主要是用来放置一些数据.使用起来稍微有些复杂,这里用的是android自带的SimpleAdapter,形式如下:android.widget.SimpleAdapter.SimpleAdapter(Context context, List<? extends Map<

  • Android中ProgressBar用法简单实例

    本文实例讲述了Android中ProgressBar用法.分享给大家供大家参考,具体如下: 在android中会经常用到ProgressBar,下面通过举例来说明如何使用ProgressBar. import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.View; import android.vi

  • Android UI设计系列之ImageView实现ProgressBar旋转效果(1)

    提起ProgressBar,想必大家都比较熟悉,使用起来也是比较方便,直接在XML文件中引用,然后添加属性,运行就OK了,虽然使用ProgressBar很方便但是在我们开发的每一个应用基本上都有自己的主体风格,如果使用了系统自带的效果图,给人的感觉是和总体风格太不搭配了,看上去很是别扭,我们自己开发也觉得不爽,于是就想着自定义一下效果,其实自定义ProgressBar的效果也不难,大概可分为三步走吧: 一.在anim文件夹下使用animation-list定义动画集 <?xml version=

  • Android UI设计系列之自定义ListView仿QQ空间阻尼下拉刷新和渐变菜单栏效果(8)

    好久没有写有关UI的博客了,刚刚翻了一下之前的博客,最近一篇有关UI的博客:Android UI设计系列之自定义Dialog实现各种风格的对话框效果(7) ,实现各种风格效果的对话框,在那篇博客写完后由于公司封闭开发封网以及其它原因致使博客中断至今,中断这么久很是惭愧,后续我会尽量把该写的都补充出来.近来项目有个需求,要做个和QQ空间类似的菜单栏透明度渐变和下拉刷新带有阻尼回弹的效果.于是花点时间动手试了试,基本上达到了QQ空间的效果,截图如下: 通过观察QQ空间的运行效果,发现当往上滚动时菜单

  • Android UI设计系列之自定义ViewGroup打造通用的关闭键盘小控件ImeObserverLayout(9)

    转载请注明出处:http://blog.csdn.net/llew2011/article/details/51598682 我们平时开发中总会遇见一些奇葩的需求,为了实现这些需求我们往往绞尽脑汁有时候还茶不思饭不香的,有点夸张了(*^__^*)--我印象最深的一个需求是在一段文字中对部分词语进行加粗显示.当时费了不少劲,不过还好,这个问题最终解决了,有兴趣的童靴可以看一下:Android UI设计之<六>使用HTML标签,实现在TextView中对部分文字进行加粗显示. 之前产品那边提了这样

  • Android UI设计系列之自定义Dialog实现各种风格的对话框效果(7)

    虽然Android给我们提供了众多组件,但是使用起来都不是很方便,我们开发的APK都有自己的风格,如果使用了系统自带的组件,总是觉得和应用的主题不着边际并且看起来也不顺心,那我们就需要自定义了,为了方便大家对自定义组件的学习,我接下来准备了几遍有关自定义的Dialog的文章,希望对大家有帮助. 在开发APK中最常见的估计就数弹出对话框了,这种对话框按照按钮数量来分大致是三种:一个按钮,两个按钮,三个按钮.现在要讲的就是按照按钮数量分为以上三类吧(当然了可以有更多的按钮,只要你愿意). 自定义Di

  • Android UI设计系列之自定义SwitchButton开关实现类似IOS中UISwitch的动画效果(2)

    做IOS开发的都知道,IOS提供了一个具有动态开关效果的UISwitch组件,这个组件很好用效果相对来说也很绚丽,当我们去点击开关的时候有动画效果,但遗憾的是Android上并没有给我们提供类似的组件(听说在Android4.0的版本上提供了具有动态效果的开关组件,不过我还没有去看文档),如果我们想实现类似的效果那该怎么办了呢?看来又得去自定义了. 公司的产品最近一直在做升级,主要做的就是把界面做的更绚丽更美观给用户更好的体验(唉,顾客是上帝......),其中的设置功能中就有开关按钮,原来的开

  • Android UI设计系列之自定义EditText实现带清除功能的输入框(3)

    最近公司的产品在陆续做升级,上级领导给的任务是优化代码结构以及项目架构,力争把项目写的精巧简练,于是我们满工程找冗余... 我们都知道每一个项目基本上都是有登陆页的,在登陆页中肯定是少不了输入框了,当我们在输入框中输入数据后如果输入的内容不正确或者是错误的或者是想重新输入,如果嗯键盘上的删除键就得一个一个的去删除,这时候我们或许就想要是能有一个标记当点击了这个标记能把我们刚刚输入的内容清空就好了.这样可以极大的提升用户体验,就拿QQ的登陆来说吧,效果如下: 当点击密码框右侧的小×图标时输入的内容

  • Android UI设计系列之自定义DrawView组件实现数字签名效果(5)

    最近项目中有个新的需求,用户在完交易需要进行输入支付密码付款的时候,要让用户签下自己的签名,提起到数字签名这个东西,感觉有点高大上,后来想想数字签名的原理也不是太复杂,主要实现原理就是利用了View的绘图原理,把用户在屏幕上的手指移动轨迹显示在屏幕上,接着把在屏幕上显示的轨迹View转换成一张图片,最后把图片保存到本地或者上传到服务器... 还是老规矩,首先看一下工程目录吧: public class DrawView extends View { /** * 签名画笔 */ private P

  • Android UI设计系列之自定义TextView属性实现带下划线的文本框(4)

    在Android开发过程中,如果Android系统自带的属性不能满足我们日常开发的需求,那么就需要我们给系统控件添加额外的属性了.假如有个需求是实现带下划线的文本显示(下划线),如果不使用自定义属性的话实现起来也不太难(起码我认为的实现方式是有许多种的),今天就讲解一下如何使用自定义属性来实现上述带下划线的文本框吧.还好Android中自定义属性不是很复杂,也可以归纳为三步走吧. 老规矩,还是先贴出工程目录吧: 一.添加属性文件 在values文件夹中新建attrs.xml文件,在文件中新建属性

  • Android UI设计系列之HTML标签实现TextView设置中文字体加粗效果(6)

    搞软件开发的都知道项目中各种需求都有,而有时候各种奇葩的需求真是让人大跌眼镜,为了实现这些奇葩的需求我们往往苦逼的废寝忘食,我现在的项目中就有一个应该算得上奇葩的需求吧,需求是这样的:在一段文字中实现对部分文字加粗 这个看上去也不难并且有点小儿科,因为TextView中有个属性是Android:textStyle,它其中一个值是bold,也就是说是对将要显示的文字进行加粗,于是我就在TextView控件中添加了此属性,代码如下: <TextView android:layout_width=&quo

  • Android UI设计与开发之使用ViewPager实现欢迎引导页面

    本系列文章都会以一个程序的实例开发为主线来进行讲解,以求达到一个循序渐进的学习效果,这样更能加深大家对于程序为什么要这样写的用意,理论加上实际的应用才能达到事半功倍的效果,不是吗? 最下方有源码的下载地址,几乎源码的每一行都有注释,写的通俗易懂,非常清晰,如有不懂的可以留言,本博主一定尽心尽力,为大家答题解惑,希望大家多多支持,好的,话不多说,让我们回归到今天的正题. 一.实现的效果图 也许是养成了这样一个习惯,每次看别人的代码前,必须要先看实现的效果图达到了一个什么样的效果,是不是跟自己想要实

随机推荐