Android简易实战教程--第五十话《动画扫描》
祝新年快乐!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简易实战教程--第五十话《动画扫描》的更多相关文章
- Android简易实战教程--第五十一话《使用Handler实现增加、减少、暂停计数》
转载博客请注明出处:道龙的博客 之前,写过一篇使用异步任务AysncTask实现倒计时的小案例,喜欢的话可以参考博客:Android简易实战教程--第三十三话< AsyncTask异步倒计时&g ...
- Android简易实战教程--第四十话《Spinner》
对于Spinner控件的介绍和使用方法,可以先看之前写过的一篇博客:Spinner控件详解 本篇就基于这个知识点完成一个简单的小案例: 根据介绍,先写一个布局: <?xml version=&q ...
- Android简易实战教程--第三十话《撕衣美女》
此篇邪恶一些,给单身屌丝发点"福利",通过图片的绘制,给美女脱掉衣服. 原理:图片覆盖图片,通过画笔对顶端的图片做一些特效处理,即手指触摸的地方,设置为透明.即可显示最底部的美女图 ...
- Android简易实战教程--第四十二话《Spinner下拉级联效果》
本篇承接第四十话第四十话<Spinner> 参考博客:http://blog.csdn.net/yayun0516 进入正题: Strings加入第一级数据: <string-arr ...
- Android简易实战教程--第三十五话《音乐播放》
已经好几天不更新博客了,今天轻松一点模拟个简单的"音乐播放器".1分钟看完~ 整个简单布局,加几个控制按钮: <LinearLayout xmlns:android=&quo ...
- Android简易实战教程--第四十五话《几种对话框》
Android中提供了各种原生的对话框,在使用简单的功能的时候,还不比考虑自定义,使用原生的也能完成功能.本篇简单小案例就介绍三种对话框. 还是直接上代码吧: 布局中三个点击事件的按钮: <Li ...
- Android简易实战教程--第四十八话《Android - Timer、TimerTask和Handler实现倒计时》
之前本专栏文章中的小案例有写到:第三十九话<Chronometer实现倒计时> 以及使用异步实现倒计时:第三十三话< AsyncTask异步倒计时> 本篇文章 结合Timer. ...
- Android简易实战教程--第四十六话《RecyclerView竖向和横向滚动》
Android5.X后,引入了RecyclerView,这个控件使用起来非常的方便,不但可以完成listView的效果,而且还可以实现ListView无法实现的效果.当然,在新能方便也做了大大的提高. ...
- Android简易实战教程--第三十六话《电话录音》
今天完成一个简单的电话录音功能,即接通电话后,立即录下自己打电话的声音.实现起来比较简单:一个服务,一个TelephonyManager.一个MediaRecorder就够了. 1.布局提供一个开启录 ...
随机推荐
- POJ-1125 Stockbroker Grapevine---Floyd应用
题目链接: https://vjudge.net/problem/POJ-1125 题目大意: 股票经纪人要在一群人中散布一个谣言,而谣言只能在亲密的人中传递,题目各处了人与人之间的关系及传递谣言所用 ...
- 区块链3.0:拥抱EOS
EOS是当下最火的区块链技术,被社会广泛看好为下一代区块链3.0.不同于以太坊的学习,EOS的主语言是C++,本文作为EOS研究的首篇文章,重点介绍EOS的创新点,它的周边生态,各种概念原理的解释,以 ...
- hadoop in hue的搭建(基于cdh版本)
首先官网下载tar包 http://archive.cloudera.com/cdh5/cdh/5/hue-3.9.0-cdh5.5.4.tar.gz 在安装hue之前,还需要安装各种依赖包,首先要检 ...
- vue-cli 体验
vue-cli 是一个官方发布 vue.js 项目脚手架,使用 vue-cli 可以快速创建 vue 项目,GitHub地址是:https://github.com/vuejs/vue-cli 一. ...
- 大数据处理架构hadoop
Hadoop简介 Hadoop是Apache软件基金会旗下的一个开源分布式计算平台,为用户提供了系统底层细节透明的分布式基础架构.它是基于java语言开发的,具有很好的跨平台特性,其核心是分布式文件系 ...
- 开发一个成功APP的六个技巧
越来越多的人开始使用智能手机,平板电脑或其他的移动设备.出于这个原因,移动APP开发已成为当今软件开发中增长最快的领域之一.本文提供九个简单而有效的提示,可帮助您规划和实施成功的移动APP. 1.目标 ...
- 线段树——codevs 1690 开关灯
先来一发题目: 1690 开关灯 时间限制: 1 s 空间限制: 128000 KB 题目描述 Description YYX家门前的街上有N(2<=N<=100000)盏路灯,在晚上六点 ...
- [NOIp 2016]换教室
Description 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有 $2n$ 节课程安排在 $n$ 个时间段上.在第 $i$($1 \leq ...
- NOIP 2014
Prob.1 生活大爆炸版 石头剪刀布 模拟.代码: #include<cstdio> #include<cstring> #include<iostream> u ...
- [Codeforces Round#417 Div.2]
来自FallDream的博客,未经允许,请勿转载,谢谢. 有毒的一场div2 找了个1300的小号,结果B题题目看错没交 D题题目剧毒 E题差了10秒钟没交上去. 233 ------- A.Sag ...