解析android中ProgressBar的用法
Android提供的ProgressBarWidget控件与ProgressDialog应用目标不同,在程序一开始即可在main.xmlLayout当中布局,先将部署在Layout里的ProgressBar的属性设为隐藏(一开始看不见),而后使用进程来“假装”程序忙碌中,但不同的是,可在进程当中取得运行时的进度,在“运行”的过程中,将运行进度通过TextView显示出来。本范例除了学习ProgressBarWidget的显示及使用之外,另一个学习关键则是Handler的使用,因为新起的进程无法访问Activity里的Widget,也无法将运行状态外送出来,所以需要通过Handler及Message对象,将进程里的状态往外传递,最后由Activity的Handler事件接收取得运行的状态。
为了让Thread运行过程中,可以不断地将信息往Activity传递,所以用了Android.os.Handler对象及Android.os.Message对象,且在类成员变量中声明了两个整数:GUI_STOP_NOTIFIER与GUI_THREADING_NOTIFIER,这两个整数将作为信息传递出来时的信号标识,前者为当Thread需要喊停的时候处理,后者为进程正在运行过程中所需处理的标识。
程序中设计了一个按钮,此按钮的工作是让原本部署在main.xml里的ProgressBar显示出来(原来是设置为Android:visibility="gone"),而因为默认在main.xml中没有指定它的indeterm-inate属性,所以即便在程序中强制调用了ProgressBar的setIndeterminate()方法,也无法改变ProgressBar.getProgress()的值,这个值将永远为0。因此,笔者想要使用循环图片动画作为运行过程中的动画,并用了一个Counter(整数)来递增,表示运行的百分比。
/*import程序略*/
publicclassEX04_17extendsActivity
{
privateTextViewmTextView01;
privateButtonmButton01;
privateProgressBarmProgressBar01;
publicintintCounter=0;
/*自定义Handler信息代码,用以作为标识事件处理*/
protectedstaticfinalintGUI_STOP_NOTIFIER=0x108;
protectedstaticfinalintGUI_THREADING_NOTIFIER=0x109;
/**Calledwhentheactivityisfirstcreated.*/
@Override
publicvoidonCreate(BundlesavedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mButton01=(Button)findViewById(R.id.myButton1);
mTextView01=(TextView)findViewById(R.id.myTextView1);
/*设置ProgressBarwidget对象*/
mProgressBar01=(ProgressBar)findViewById(R.id.myProgressBar1);
/*调用setIndeterminate方法赋值indeterminate模式为false*/
mProgressBar01.setIndeterminate(false);
/*当单击按钮后,开始进程工作*/
mButton01.setOnClickListener(newButton.OnClickListener()
{
@Override
publicvoidonClick(Viewv)
{
//TODOAuto-generatedmethodstub
/*单击按钮让ProgressBar显示*/
mTextView01.setText(R.string.str_progress_start);
/*将隐藏的ProgressBar显示出来*/
mProgressBar01.setVisibility(View.VISIBLE);
/*指定Progress为最多100*/
mProgressBar01.setMax(100);
/*初始Progress为0*/
mProgressBar01.setProgress(0);
/*开始一个进程*/
newThread(newRunnable()
{
publicvoidrun()
{
/*默认0至9,共运行10次的循环语句*/
for(inti=0;i<10;i++)
{
try
{
/*成员变量,用以识别加载进度*/
intCounter=(i+1)*20;
/*每运行一次循环,即暂停1秒*/
Thread.sleep(1000);
/*当Thread运行5秒后显示运行结束*/
if(i==4)
{
/*以Message对象,传递参数给Handler*/
Messagem=newMessage();
/*以what属性指定User自定义*/
m.what=EX04_17.GUI_STOP_NOTIFIER;
EX04_17.this.myMessageHandler.sendMessage(m);
break;
}
else
{
Messagem=newMessage();
m.what=EX04_17.GUI_THREADING_NOTIFIER;
EX04_17.this.myMessageHandler.sendMessage(m);
}
}
catch(Exceptione)
{
e.printStackTrace();
}
}
}
}).start();
}
});
}
/*Handler构建之后,会监听传来的信息代码*/
HandlermyMessageHandler=newHandler()
{
//@Override
publicvoidhandleMessage(Messagemsg)
{
switch(msg.what)
{
/*当取得标识为离开进程时所取得的信息*/
caseEX04_17.GUI_STOP_NOTIFIER:
/*显示运行终了*/
mTextView01.setText(R.string.str_progress_done);
/*设置ProgressBarWidget为隐藏*/
mProgressBar01.setVisibility(View.GONE);
Thread.currentThread().interrupt();
break;
/*当取得标识为持续在进程当中时所取得的信息*/
caseEX04_17.GUI_THREADING_NOTIFIER:
if(!Thread.currentThread().isInterrupted())
{
mProgressBar01.setProgress(intCounter);
/*将显示进度显示于TextView当中*/
mTextView01.setText
(
getResources().getText(R.string.str_progress_start)+
"("+Integer.toString(intCounter)+"%)/n"+
"Progress:"+
Integer.toString(mProgressBar01.getProgress())+
"/n"+"Indeterminate:"+
Boolean.toString(mProgressBar01.isIndeterminate())
);
}
break;
}
super.handleMessage(msg);
}
};
}
如下所示:
<ProgressBar
android:id="@+id/myProgressBar1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:max="100"
android:progress="0"
android:orientation="horizontal"
android:progressBarStyle=
"@android:style/Widget.ProgressBar.Horizontal"
android:indeterminateOnly="false"
android:visibility="gone"
/>
ProgressBar除了上述关于Android:progressBarStyle的属性设置之外,笔者也调查了在线Android的源代码(http://source.android.com),一些原本Android所使用的progressBarStyleHori-zontal属性,除默认“圆形”的图片之外,还有其他的主题及方形图片Drawable模式可以使用。
<resources>
<declare-styleablename="Theme">
<!--snip-->
<attrname="progressBarStyleHorizontal"format="reference"/>
</resources>
接下来看看,这段主题中的属性名称progressBarStyleHorizontal定义在frameworks/base/core/res/res/values/styles.xml里,如下所示:
<resources>
<stylename="Widget.ProgressBar.Horizontal">
<itemname="android:indeterminateOnly">false</item>
<itemname="android:progressDrawable">
@android:drawable/progress_horizontal
</item>
<itemname="android:indeterminateDrawable">
@android:drawable/progress_indeterminate_horizontal
</item>
<itemname="android:minHeight">20dip</item>
<itemname="android:maxHeight">20dip</item>
</style>
</resources>
由此可见,如果想让Android使用其他样式的ProgressBar,可以在原本的Layout(main.xml)里添加以下两项属性,以观察运行过程中的图片变化。
android:progressDrawable="@android:drawable/progress_horizontal"
android:indeterminateDrawable=
"@android:drawable/progress_indeterminate_horizontal"
相关文章
- noip2018提高组初赛解析_noip小学组
- Android 存储空间的最佳实践
- android studio不能输入中文_Android模拟器
- android开机动画多长时间_Android开机动画原理分析
- android开发笔记之 Android代码混淆打包
- Android事件分发机制完全解析,带你从源码的角度彻底理解(上)
- android 定时器实例,Android定时器和Handler用法实例分析
- android 定时器重置,Android定时器延迟和重置[通俗易懂]
- Android 使用ViewPager实现左右循环滑动图片
- android触摸屏事件,Android Touch事件分析
- android缩放动画中心缩放_安卓动画缩放调到多少比较好
- Android Services Library_android freeware
- 【Android 应用开发】自定义View 和 ViewGroup
- 【Android FFMPEG 开发】FFMPEG 音频重采样 ( 初始化音频重采样上下文 SwrContext | 计算音频延迟 | 计算输出样本个数 | 音频重采样 swr_convert )
- 【Android 异步操作】Handler 机制 ( Android 提供的 Handler 源码解析 | Handler 构造与消息分发 | MessageQueue 消息队列相关方法 )
- 【Android 插件化】Hook 插件化框架 ( Hook Activity 启动流程 | Hook 点分析 )
- 【错误记录】Android Studio 向 GitHub 提交代码报错 ( Push failed: Failed with error: Could not read | 使用命令行提交代码 )
- 【Android 逆向】逆向修改游戏应用 ( APK 解析工具 | 解包 -> 分析 -> 重打包 -> 签名 流程 )
- 【错误记录】编译 Android 版本的 ijkplayer 报错 ( You must define ANDROID_NDK before starting. | 下载指定版本 NDK )
- 【Android NDK 开发】CMake 中查找链接 Android 自带动态库位置说明 ( ndk-bundleplatformsandroid-29arch-armusrlib )
- 【Android 逆向】ART 函数抽取加壳 ③ ( 禁用 dex2oat 操作 HOOK 点介绍 | 集成 InLineHook )
- 【Android Gradle 插件】组件化中的 Gradle 构建脚本实现 ⑤ ( 优化 Gradle 构建脚本 | 构建脚本结构 | 闭包定义及用法 | 依赖配置 | android 块配置 )
- Android约束布局ConstraintLayout详解手机开发
- Android CircleImageView圆形ImageView详解手机开发
- Android Volley网络通信框架的使用(一):Volley的简单用法详解手机开发
- [android] 采用断点调试的方式观察pull解析的流程详解手机开发
- WI输入法下载 WI输入法Android 2.1官方版 手速超乎想象
- Android应当从iOS处窃取的五大最佳功能
- Connecting Android to Oracle: The Ultimate Guide for Seamless Integration.(android连接oracle)
- 解析Android应用启动后自动创建桌面快捷方式的实现方法
- 解析Android获取系统cpu信息,内存,版本,电量等信息的方法详解
- 解析android中的dip,dp,px,sp和屏幕密度
- Android中Parcelable的作用实例解析
- Android入门之PopupWindow用法实例解析
- Android入门之Gallery用法实例解析