阶段一:为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, ...
随机推荐
- 【已解决】Https请求——基础连接已经关闭 发送时发生错误
本人在做商用项目的推送消息功能时,借助第三方推送服务.这里避免有打广告的嫌疑,就不报名字了.由于是通过调用API接口,所以Post方法是自己写的,但是在开发环境是可以正常推送的,但是一上线就出各种问题 ...
- Windows Server 2008 小操作汇总
用惯了Windows2003,去配置2008的时候还真有点摸不着头脑.干脆把有用到的都列在这里,方便后续查找. 一.安装IIS.Telnet 点击:开始 -> 管理工具 -> 服 ...
- CSS样式表分类
1.内联样式表 <p style="font-size:11px;">内联样式表</p> 2.内嵌样式表 写在head标签里 <style typ ...
- iOS开发中静态库之".framework静态库"的制作及使用篇
iOS开发中静态库之".framework静态库"的制作及使用篇 .framework静态库支持OC和swift .a静态库如何制作可参照上一篇: iOS开发中静态库之" ...
- PHP 高级编程(3/5) - 使用SPL(标准PHP库)实现观察者模式
SPL(标准PHP库 - Standard PHP Library)是PHP5面向对象功能中重要的部分.原文解释是这样的“The Standard PHP Library (SPL) is a col ...
- 文本比较算法:Needleman/Wunsch算法
本文介绍基于最长公共子序列的文本比较算法——Needleman/Wunsch算法.还是以实例说明:字符串A=kitten,字符串B=sitting那他们的最长公共子序列为ittn(注:最长公共子序列不 ...
- .NET Core采用的全新配置系统[7]: 将配置保存在数据库中
我们在<聊聊默认支持的各种配置源>和<深入了解三种针对文件(JSON.XML与INI)的配置源>对配置模型中默认提供的各种ConfigurationSource进行了深入详尽的 ...
- 一个难倒 3年 android开发经验 " 工程师 " 的 "bug"
一个关于 imageView 设置 scaleType 的问题. 就在刚才 晚上9 点多的时候,我的一个外包伙伴发一个工程代码我,叫我去看下这样一个"bug",说折腾了很久,图片选 ...
- # ios开发 @property 和 Ivar 的区别
ios开发 @property 和 Ivar 的区别 @property 属性其实是对成员变量的一种封装.我们先大概这样理解: @property = Ivar + setter + getter I ...
- c 线程(平行世界)
我们已经知道如何使用进程来做一些事情了,然而 它并不是在什么地方都是最适合的. 我们看看进程的缺点是什么: 线程隆重登场 1. 如何创建线程 创建线程可以使用多种线程库,在此我们使用最流行的一种:PO ...