祝新年快乐!2017(一起)前行。

转载博客请注明出处:道龙的博客

本篇简答的小案例,使用动画知识,完成一个类似雷达扫描效果,并且加入自定义进度条。对于自定义进度条前面有很详细的解析和案例了,本篇就结合动画知识串起来,并且再加入之前写过的AsynckTask知识。

读者朋友也可以阅读之前两篇小案例,读者可以参考:Android简易实战教程--第三十三话《 AsyncTask异步倒计时》

Android简易实战教程--第三十四话《 自定义SeekBar以及里面的一些小知识》

本篇源代码下载GitHub地址,开启代码传送门---------->>>https://github.com/codeydl/Demo

那就开始写代码吧:

一、首先,定义一个布局,用于放置动画、自定义进度条位置。如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_main"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<!--标题-->
<TextView
android:background="@color/colorAccent"
android:text="扫描动画"
android:gravity="center"
android:padding="5dp"
android:textSize="25sp"
android:layout_width="match_parent"
android:layout_height="wrap_content"/> <!--容器-->
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<!--放置动画,设置一个背景-->
<FrameLayout
android:background="@drawable/ic_scanner_malware"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<!--设置图片,代表要添加动画的旋转指针-->
<ImageView
android:id="@+id/iv_main_scan"
android:src="@drawable/act_scanning_03"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</FrameLayout> <!--提示与进度条-->
<LinearLayout
android:layout_marginLeft="10dp"
android:orientation="vertical"
android:layout_gravity="center_vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/tv_main_scan"
android:textSize="18sp"
android:text="正在扫描中,请稍后"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<ProgressBar
android:id="@+id/pb_main_scan"
android:layout_marginTop="5dp"
style="@style/Base.Widget.AppCompat.ProgressBar.Horizontal"
android:progressDrawable="@drawable/my_progress"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout> </LinearLayout>
</LinearLayout>

这里进度条设置,使用自定义的进度条,我们可以这么来搞定:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!--指定背景:它的id需要使用系统的@android:id/background,背景选择一张图片。也可以选择自定义drawable结合shape-->
<item android:id="@android:id/background" android:drawable="@drawable/security_progress_bg"/>
<!--指定进度的样子-->
<item android:id="@android:id/progress" android:drawable="@drawable/security_progress"/> </layer-list>

二、然后进入主活动,我们这里分两个任务进行开发。

1、加载动画

//直接使用补间动画代码设置
RotateAnimation rotateAnimation = new RotateAnimation(0,360,
Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
rotateAnimation.setDuration(1000);
//设置线性,表示x和y坐标同比例变化。效果让动画匀速
rotateAnimation.setInterpolator(new LinearInterpolator());
//设置动画无限循环
rotateAnimation.setRepeatCount(Animation.INFINITE);
//开启动画
ivmainscan.startAnimation(rotateAnimation);

此时看看效果,可以看到转盘“雷达”旋转了起来。

2、加载进度条异步任务

加载进度条使用异步任务完成,异步任务的具体操作和功能描述,读者可关注我去参考本人相关博客,有详细解析。

下面在代码中加入详细的注释,就不多做赘述了,加载进度异步任务代码如下:

//@1:对应的参数是:1、doInBackground回调中的传入的参数类型;2、执行任务execute(...)中的参数类型
//@2:进度参数,与进度有关。onProgressUpdate的参数类型
//@3:1、doInBackground的返回值类型;2、执行结果onPostExecute传入的参数类型
new AsyncTask<Integer, Integer, Boolean>() { //第一段,准备耗时操作
@Override
protected void onPreExecute() {
// 主线程执行。准备执行前调用,用于界面初始化操作
tvmainscan.setText("引擎正在扫描中,请稍后...");
} //第二段
@Override
protected Boolean doInBackground(Integer... params) {
// 执行中。子线程执行,用于耗时操作
// 在这里可以拿到执行任务execute(...)传入的参数,可以以数组形式分别取到
int start = params[0];
int end = params[1]; //真正的耗时
for (int i = start; i < end; i++) {
SystemClock.sleep(50);//每加载一个进度,睡20微秒
publishProgress(i);
}
return true;//把值返回给onPostExecute
} //用于更新进度,进度改变时候的回调,一般用于进度结果的UI更新
@Override
protected void onProgressUpdate(Integer... values) {
// 主线程执行的回调,可更新进度。values参数接收doInBackground调用publishProgress时候推过来的参数。
// 每次推一个值。因此每次数组长度就是0
int progress = values[0];
pbmainscan.setProgress(progress);
} //第三段
@Override
protected void onPostExecute(Boolean result) {
// 主线程中执行。执行完成的回调,即获得数据后的回调,一般在这里进行结果UI展示
// 这里可以接收doInBackground的返回值,获取结果
if(result){
//说明进度加载成功。
Toast.makeText(getApplicationContext(),"扫描成功!",Toast.LENGTH_SHORT).show();
tvmainscan.setText("恭喜扫描完毕");
tvmainscan.setTextColor(Color.GREEN);
}else{
Toast.makeText(getApplicationContext(),"扫描失败!",Toast.LENGTH_SHORT).show();
tvmainscan.setText("很遗憾扫描失败");
tvmainscan.setTextColor(Color.RED);
}
//执行关闭的逻辑
//1、进度条设置为不可见
pbmainscan.setVisibility(View.GONE);
//2、动画停止扫描
ivmainscan.clearAnimation();
}
}.execute(0, 100);//最小进度为0,最大进度为100

代码注释特别详细,相信很轻松看完~

那么最后看看运行效果吧:

喜欢我的朋友可以关注我博客,有问题大家一起交流。也可以动手微信扫描下方二维码查看更多安卓文章:

打开微信搜索公众号  Android程序员开发指南  或者手机扫描下方二维码 在公众号阅读更多Android文章。

微信公众号图片:

Android简易实战教程--第五十话《动画扫描》的更多相关文章

  1. Android简易实战教程--第五十一话《使用Handler实现增加、减少、暂停计数》

    转载博客请注明出处:道龙的博客 之前,写过一篇使用异步任务AysncTask实现倒计时的小案例,喜欢的话可以参考博客:Android简易实战教程--第三十三话< AsyncTask异步倒计时&g ...

  2. Android简易实战教程--第四十话《Spinner》

    对于Spinner控件的介绍和使用方法,可以先看之前写过的一篇博客:Spinner控件详解 本篇就基于这个知识点完成一个简单的小案例: 根据介绍,先写一个布局: <?xml version=&q ...

  3. Android简易实战教程--第三十话《撕衣美女》

    此篇邪恶一些,给单身屌丝发点"福利",通过图片的绘制,给美女脱掉衣服. 原理:图片覆盖图片,通过画笔对顶端的图片做一些特效处理,即手指触摸的地方,设置为透明.即可显示最底部的美女图 ...

  4. Android简易实战教程--第四十二话《Spinner下拉级联效果》

    本篇承接第四十话第四十话<Spinner> 参考博客:http://blog.csdn.net/yayun0516 进入正题: Strings加入第一级数据: <string-arr ...

  5. Android简易实战教程--第三十五话《音乐播放》

    已经好几天不更新博客了,今天轻松一点模拟个简单的"音乐播放器".1分钟看完~ 整个简单布局,加几个控制按钮: <LinearLayout xmlns:android=&quo ...

  6. Android简易实战教程--第四十五话《几种对话框》

    Android中提供了各种原生的对话框,在使用简单的功能的时候,还不比考虑自定义,使用原生的也能完成功能.本篇简单小案例就介绍三种对话框. 还是直接上代码吧: 布局中三个点击事件的按钮: <Li ...

  7. Android简易实战教程--第四十八话《Android - Timer、TimerTask和Handler实现倒计时》

    之前本专栏文章中的小案例有写到:第三十九话<Chronometer实现倒计时> 以及使用异步实现倒计时:第三十三话< AsyncTask异步倒计时> 本篇文章 结合Timer. ...

  8. Android简易实战教程--第四十六话《RecyclerView竖向和横向滚动》

    Android5.X后,引入了RecyclerView,这个控件使用起来非常的方便,不但可以完成listView的效果,而且还可以实现ListView无法实现的效果.当然,在新能方便也做了大大的提高. ...

  9. Android简易实战教程--第三十六话《电话录音》

    今天完成一个简单的电话录音功能,即接通电话后,立即录下自己打电话的声音.实现起来比较简单:一个服务,一个TelephonyManager.一个MediaRecorder就够了. 1.布局提供一个开启录 ...

随机推荐

  1. UVA-562 Dividing coins---01背包+平分钱币

    题目链接: https://vjudge.net/problem/UVA-562 题目大意: 给定n个硬币,要求将这些硬币平分以使两个人获得的钱尽量多,求两个人分到的钱最小差值 思路: 它所给出的n个 ...

  2. 初学Java Web(9)——学生管理系统(简易版)总结

    项目开始时间:2018年4月8日14:37:47 项目完成时间:2018年4月9日10:03:30 技术准备 这个项目是自己用于巩固 J2EE 相关知识的练手项目,非常简单,但是相关的功能却非常实用, ...

  3. 使用C# (.NET Core) 实现适配器模式 (Adapter Pattern) 和外观模式 (Facade Pattern)

    本文的概念内容来自深入浅出设计模式一书 现实世界中的适配器(模式) 我带着一个国标插头的笔记本电脑, 来到欧洲, 想插入到欧洲标准的墙壁插座里面, 就需要用中间这个电源适配器. 面向对象的适配器 你有 ...

  4. CodeForces 918D MADMAX(博弈+记忆化搜索)

    time limit per test 1 second memory limit per test 256 megabytes input standard input output standar ...

  5. C#之冒泡排序

    以前在学校的时候看过冒泡排序,看的时候挺明白的,但是自己写的时候就写不出来,在网上搜索了一下,发现网上的冒泡排序算法几乎都不符合冒泡排序的原理,虽然也能实现,但是不正宗. 冒泡排序从字面意思理解:应该 ...

  6. MySQL InnoDB 索引原理

    本文由  网易云发布. 作者:范鹏程,网易考拉海购 InnoDB是 MySQL最常用的存储引擎,了解InnoDB存储引擎的索引对于日常工作有很大的益处,索引的存在便是为了加速数据库行记录的检索.以下是 ...

  7. Python基础Day01

    Python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言 ...

  8. [HNOI 2017]抛硬币

    Description 题库链接 两人抛硬币一人 \(a\) 次,一人 \(b\) 次.记正面朝上多的为胜.问抛出 \(a\) 次的人胜出的方案数. \(1\le a,b\le 10^{15},b\l ...

  9. 数论:px+py 不能表示的最大数为pq-p-q的证明

    对于互质的两个数p,q,px+py 不能表示的最大数为pq-p-q. 证明: 先证:pq-p-q不能被px+py表示. 假设pq-p-q可以被px+py表示 那么 px+py=pq-p-q       ...

  10. hdu 5592 BestCoder Round #65(树状数组)

    题意: ZYB有一个排列PP,但他只记得PP中每个前缀区间的逆序对数,现在他要求你还原这个排列. (i,j)(i < j)(i,j)(i<j)被称为一对逆序对当且仅当A_i>A_jA ...