阶段一:为View设置阴影和弹出动画(天气应用)
“阶段一”是指我第一次系统地学习Android开发。这主要是对我的学习过程作个记录。
上一篇阶段一:通过网络请求,获得并解析JSON数据(天气应用)完成了应用的核心功能,接下来就要对它进行优化。今天我先优化它的部分UI和设置一些动画。
首先,说明一下,这部分都是我现学现做的,弄的时候也挺折腾的,所以我想先把整个过程的心得分享一下。
我是打算把应用弄成google的Material design风格,它的内容很多,就这一步来说,只要实现两点,一是显示信息的TextView有阴影,像卡片似的,二是这些TextView是从左向右弹出来的。清楚要实现什么效果之后,就去寻找实现的方法。有这么明确的目的,对于现在的我,最好就是百度一下,因为这么细的地方,工具类的书很少会讲到,然后我还会打开官方提供的API文档和金山词霸。因为这过程有这么几种情况,一是关键词不对,搜不到相关内容,这没办法,只能换关键词继续搜,二是搜到的教程讲得云里雾里的,这有可能是作者的问题,也有可能是我不懂这方面的知识,所以就需要查看API文档,另外即使教程讲得很清楚,最好也查看文档对照一下,除了能了解更多之外,还有就是因为有可能存在版本差异。
另外阅读API文档是比较苦的,不只是因为它是全英文的,还因为它的内容很多。看教程时,看到某些标签或关键词,但又不知道在文档的哪里,可以在Android Studio中输入代码,然后按住ctrl,指向代码,就会显示它是属于哪个包,另外还可以直接按ctrl + shift + N输入关键词,也会显示出来。下面讲解时,我会给出这些标签是在文档的哪里。最后,因为我弄不了它的动态图,所以想看动画效果的朋友可以自己写一下,很简单的两步。
一、实现TextView带阴影
先上效果图

虽然阴影不大,但是应该能看出有什么变化吧。这里跟上一篇相比,多了几个TextView,这都是用来显示天气信息的,只要在上一篇解析JSON数据那里修改一下就可以了。
然后下面是代码,这个我是根据网上的一篇教程来做的

这是一个放在res/drawable/下的xml文件。
下面是先把它添加到styles.xml中,然后在TextView中引用这个style

说明:
(1)这个<layer-list>里面可以存放其它drawable对象,只不过其它对象要包括在<item></item>里面,每一个对象就是一个item。这种关系有点像布局文件中布局方式和其中的view。
(2)<shape>就是画一个形状出来。
(3)<solid>只有color属性,这个标签的作用就是用这个color填充这个形状。
(4)<corners>只有在形状为rectangle矩形时,才有作用,就是把矩形变成圆角。
(5)<item android:left="1dp" android:bottm="1dp">就是控制上层形状偏移,其实这不太像偏移,因为从AS的预览效果来看,它没有移动的感觉,而是减掉了1dp的长度。当然这预览效果也有点怪,在<item>里写一个属性时,能正常预览,但写多一个就完全变形了。
这个实现阴影的原理是两个相同的矩形重叠在一起,然后上层偏移,底层显露的部分就是阴影。所以底层形状的颜色就是阴影的颜色。上层的颜色就是TextView的background颜色。
这里的所有标签的介绍和解释都在下面的这个Drawable中,这个是点击API Guides之后出现的

二、实现TextView从左向右弹出
动画部分内容很多,我蒙了很久,才知道只需View Animation中的Tween animation里的<scale>属性就能做到我要的效果。
先在xml中设置动画属性

这是一个在res/anim/下的xml文件(anim是自己创建的文件夹)
说明:
(1)这里其实可以直接用<scale>作为根元素。
(2)<set>是一个可以包含其它元素的容器,类似于上面的<layer_list>。
(3)fromXScale="0.0",toXScale="1.0",这意思是从无到有,而且最终为正常大小,小于1.0是缩小,大于1.0是放大,所以0.0代表大小为0,1.0代表正常大小。注意这里y轴是没有发生变化的。因为我需要的是TextView在x轴方向上从左向右弹出的效果。如果想从右开始,就把pivotX设置为100%就可以了。
(4)pivotX和pivotY="0%",这意思是动画开始的位置,0%相当于原点,50%就是中点。坐标情况跟之前讲阶段一:drawText的位置问题和Stroke、drawArc的相关问题时提到的一样,x越往右越大,y越往下越大。
(5)其实fromXScale和pivotX这两个属性的关系有点奇妙,好比现在我这里的fromYScale和toYScale都是1.0,这时pivotY="0%"是没意义的,其实删掉这个属性也是没问题的,因为y轴方向没变化,所以也就没有所谓的开始位置。
(6)duration="300",意思是动画从播放到结束用时300毫秒,也就0.3秒,也就是说这个属性是设置动画的持续时间。
(7)android:interpolator="@android:anim/accelerate_interpolator",这句作用是调用系统提供的速度控制器,这里是调用加速器,加速播放,系统提供的还有其它播放模式的控制器。
然后在.java中设置动画播放

其实我实现的效果是4个显示天气信息的TextView依次弹出来,要做到这个效果,我是在<set>标签中添加android:startOffset="300"这个属性,其实还可以在.java中添加zoominAnimation.setStartOffset(300);这个方法,作用是延迟300毫秒再开始播放动画。当然,要4个TextView依次弹出来,还要分别设置。
上面的<set>、<scale>标签和其它属性,都在上面API文档那图的Animation里有详细介绍,从那里你会知道更多更全的有关Animation的事情。
阶段一:为View设置阴影和弹出动画(天气应用)的更多相关文章
- IOS项目之弹出动画终结篇
在之前写过IOS项目之弹出动画一.IOS项目之弹出动画二.IOS项目之弹出动画三,今天来一个终极封装已经上传到Github上弹出动画总结篇UIPopoverTableView. UIPopoverTa ...
- IOS项目之弹出动画二
在IOS项目之弹出动画一中只是实现也功能,并没有体现面向对象的思想 ,今天就试着把它封装了一下,弹出视图的内容可以根据自定义,此处只是用UIDatePicker来演示 我把它传到了GitHub上 ...
- IOS项目之弹出动画三
前面写了弹出动画两个,今天做商城时又用到了,看着这个用着蛮普遍的,所以记了下来 // // mallMoreView.h // XQB // // Created by City--Online on ...
- mac关闭渐隐和弹出动画效果
苹果系统应用程序的窗口和对话框每次使用的时候都有华丽的特效,但是如果你感觉这种特效显得有点慢(MacGG闲的蛋疼),那该如何取消掉他呢? 方法很简单,打开"终端"(Finder-& ...
- IOS项目之弹出动画一
小区宝首页导航栏左边有一个物业按钮,点击时会出现一个视图动画,之前用的是一个POP第三方,想着几个POP动画就要引用一堆的第三方有点麻烦,就试着自己写了一下,功能实现了,下一步就是优化将其封装一下.下 ...
- WPF制作子窗体的弹出动画效果
创建一个WPF应用程序WpfApplication1,新建个窗体DialogWin <Windowx:Class="WpfApplication1.DialogWin" xm ...
- 原生Js_实现简单的下拉折叠菜单(添加弹出动画效果)
用javascript实现简单的下拉折叠菜单效果 实现步骤 (a)获得各操作的dom对象: (b)在所有菜单按钮对象上添加单击事件: (c)设置所有菜单按钮样式为空,并将当前按钮的样式设置为“acti ...
- 【VS开发】MFC动态设置对话框属性 弹出或嵌入
参考: MFC的对话框CDialog是怎么控制窗口可调整大小的属性的呢?打开资源文件,对话框资源的属性列表中,有一个"Border"项,改变该项的值就可以改变窗口边框风格.实际上w ...
- swift uiview弹出动画
UIView.animateWithDuration(0.5, delay: 0.0, usingSpringWithDamping: 0.3, initialSpringVelocity: 0.0, ...
随机推荐
- "过期不候"--具备生命周期的数据的技术实现方案
"过期不候"--具备生命周期的数据的技术实现方案 1 引言 本文可以作为之前的一个 原理性文章 对应的 技术实现部分 . 此处给出其上文的直达电梯: http://www.cn ...
- Leetcode 笔记 100 - Same Tree
题目链接:Same Tree | LeetCode OJ Given two binary trees, write a function to check if they are equal or ...
- C# 线程同步的三类情景
C# 已经提供了我们几种非常好用的类库如 BackgroundWorker.Thread.Task等,借助它们,我们就能够分分钟编写出一个多线程的应用程序. 比如这样一个需求:有一个 Winform ...
- 敏捷团队中的QA由来
QA,全称为Quality Analyst,即质量分析师(有些称为Quality Assurance,即质量保证师).为什么它总跟质量扯在一块?感觉这个角色明明做的都是测试的事情,为什么不直接叫做te ...
- [Javascript] 爬虫 模拟新浪微博登陆
概述: 由于业务需要,要编写爬虫代码去爬去新浪微博用户的信息. 虽然在网上能找到不少信息,但由于新浪微博改版,其登陆机制进行了修改,故很多老的文章就不适合用了. 经过一番摸索,成功模拟新浪微博的登陆 ...
- CentOS 6.6 升级GCC G++ (当前最新版本为v6.1.0) (完整)
---恢复内容开始--- CentOS 6.6 升级GCC G++ (当前最新GCC/G++版本为v6.1.0) 没有便捷方式, yum update.... yum install 或者 添加y ...
- 使用Red Gate Sql Data Compare 数据库同步工具进行SQL Server的两个数据库的数据比较、同步
Sql Data Compare 是比较两个数据库的数据是否相同.生成同步sql的工具. 这一款工具由Red Gate公司出品,我们熟悉的.NET Reflector就是这个公司推出的,它的SQLTo ...
- Boostrap入门(一)
1.第一步:下载Boostrap有关文件 Boostrap中文网:http://www.bootcss.com/ -->--> 2.第二步: 如下代码:引入相关文件即可. <!DOC ...
- join和split的区别
join() 方法用于把数组中的所有元素放入一个字符串.元素是通过指定的分隔符进行分隔的. <script> var a=new Array(); a[0]="XHTML&quo ...
- 分布式系统理论基础 - 一致性、2PC和3PC
引言 狭义的分布式系统指由网络连接的计算机系统,每个节点独立地承担计算或存储任务,节点间通过网络协同工作.广义的分布式系统是一个相对的概念,正如Leslie Lamport所说[1]: What is ...