这是最近项目的一个需求,做者写这篇文章目的不是想教你们如何作这个动画。不少动画不少效果,都有开源做者已经实现了,咱们只须要拿来用。在实际开发中开发效率才是第一步,源码的学习能够放在本身没事的时候来作。分享下我拿到一个需求时是怎样一步一步来攻克的。我的看法,不吝赐教!javascript
首先咱们先将动画分解,这一动画分为两部分java
而后咱们再来看布局,可能一开始拿到这个效果图,咱们直接就认为笔记本里面就是一个gridview或者一个横向的recyclerview。其实否则,咱们认真分析能够看出不论是gridview仍是横向recyclerview,它们的item第一行从左往右都是item0、item一、item二、item3,而咱们实现的效果是笔记本的左边页->右边页,也就是必需要左边半页填满后才向右边半页填数据,做者用了两个两行两列的girdview放在笔记本里面,实现了这一效果。以下图(注意看item的下标):
android
若是咱们本身来写这个翻页的效果,仍是有点复杂。通过搜索我发现了一个类库android-FlipView已经实现了这一效果,在这里也感谢原做者的贡献。android-FlipView支持左右翻页和上下翻页。
做者将api设计得尽量跟ListView同样。FlipView拥有一个通常的adapter,你能够在以下设置adapter:git
void setAdapter(ListAdapter adapter);
ListAdapter getAdapter();复制代码
获取可翻转的页数和当前页:github
int getPageCount();
int getCurrentPage();复制代码
相似于ListView中scrollTo, smoothScrollTo, scrollBy 和smoothScrollBy 做用的一些方法:api
void flipTo(int page);
void smoothFlipTo(int page);
void flipBy(int pageDelta);
void smoothFlipBy(int pageDelta);复制代码
翻页效果最大的难题已经解决,接下来问题就是数据封装,嵌套两个girdview了,这里简单贴下代码,感兴趣的能够直接去看源码。微信
/** * 当前数据8个一页,获取总页数 * 两种状况1:数据长度恰好是8的倍数,那么总页数=数据长度÷8 * 2:数据长度不为8的倍数,总页数=数据长度÷8 + 1 (为何加1?由于长度与8相除有余数,余数这一部分也要占一页) */
if (familyInfos.size() % 8 == 0) {
totalPage = familyInfos.size() / 8;
} else {
totalPage = familyInfos.size() / 8 + 1;
}
/**用一个新的集合来装每一页里面的数据,造成一个新的集合 * 循环总页数次 用List.subList(int start, int end)方式取出数据 注意这里的参数不是下标,从1开始 * 一样两种状况1:当当前页的数据恰好8个的时候直接取 * 2:最后一页的状况,就是从 页码*8->数据长度 */
List<List<FamilyInfo>> family = new ArrayList<>();
for (int i = 0; i < totalPage; i++) {
List newlist = null;
if (i * 8 + 7 < familyInfos.size() - 1) {
newlist = familyInfos.subList(i * 8, (i + 1) * 8);
} else {
newlist = familyInfos.subList(i * 8, familyInfos.size());
}
family.add(newlist);
}
adapter = new FlipViewAdapter(this, family);
flipView.setAdapter(adapter);复制代码
开始做者用的是gridview的setLayoutAnimation方法,不了解LayoutAnimation的能够去搜索下,可是这种方式只能在girdview第一次加载的时候才会有,后面咱们再须要开启动画就不行了。
因此只有一个item一个item的去作动画了。分析一下这个动画,这个抖动的动画是以item的中心点左右旋转。ok,那就用rotate旋转动画布局
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android" android:duration="100" android:fromDegrees="-2" android:pivotX="50%" android:pivotY="50%" android:repeatCount="infinite" android:repeatMode="reverse" android:toDegrees="2" /> <!-- duration 动画执行时间 fromDegrees 动画开始时的角度 toDegrees 动画结束时物件的旋转角度,正表明顺时针 pivotX 属性为动画相对于物件的X坐标的开始位置 pivotY 属性为动画相对于物件的Y坐标的开始位置 repeatCount 动画的重复次数 infinite表示循环 repeatMode 重复模式 restart:从新从头开始执行。reverse:反方向执行。 -->复制代码
以上只是一个大概的思路,感兴趣的能够去个人github看下源码。重点说明,由于是在平板上面作的,没有作适配。能够用模拟器看效果或者横屏模式。学习
本文做者:Rance935本文出处:Android翻页效果加苹果桌面应用抖动效果转载请在开头注明做者详细信息和本文出处
欢迎关注个人微信公众号和QQ群,分享Android 开发和互联网内容
Android技术分享:群号534813930
微信号:androidparks
公众号:AndroidParks
动画![]()