自定义ViewPager的兼容性问题及解决办法
通过它我们可以给图片增加组合动画效果,也可以写成一个图片查看器。
比如我们首次安装应用的时候,很多就会用到ViewPager给我们做一个应用简介。今天要写的也是这个--怎么用ViewPager实现动画切换效果。
1.通过谷歌提供给我们的样例代码实现切换效果,因为我们进不了谷歌的官方api,所以我直接贴出代码
public class DepthPageTransformer implements ViewPager.PageTransformer {
private static final float MIN_SCALE = 0.75f;
public void transformPage(View view, float position) {
int pageWidth = view.getWidth();
if (position < -1) { // [-Infinity,-1)
// This page is way off-screen to the left.
view.setAlpha(0);
} else if (position <= 0) { // [-1,0]
// Use the default slide transition when moving to the left page
view.setAlpha(1);
view.setTranslationX(0);
view.setScaleX(1);
view.setScaleY(1);
} else if (position <= 1) { // (0,1]
// Fade the page out.
view.setAlpha(1 - position);
// Counteract the default slide transition
view.setTranslationX(pageWidth * -position);
// Scale the page down (between MIN_SCALE and 1)
float scaleFactor = MIN_SCALE
+ (1 - MIN_SCALE) * (1 - Math.abs(position));
view.setScaleX(scaleFactor);
view.setScaleY(scaleFactor);
} else { // (1,+Infinity]
// This page is way off-screen to the right.
view.setAlpha(0);
}
}
}
使用方法:
mViewPager = (ViewPager) findViewById(R.id.viewPager);
//为ViewPager添加动画效果
mViewPager.setPageTransformer(true,new DepthPageTransformer());
这里提供的是切换页面是透明度逐渐变化的效果,但是这种方法只支持android3.0以上的版本。因为是有api11以上才加入了属性动画。
如果需要兼容安卓3.0以下,需要加入一个jar包:JazzyViewPager第三方开源项目。可以去github搜索下载。后面我会把下载资源地址加上
或者把ViewPager类的全部内容考到自己的方法中(ViewPagerCompat),注释掉判断api版本的代码,然后引用此包而非引用ViewPager也可以解决兼容问题。
最后,自定义ViewPager。
通过分析谷歌给我们的样例代码,我们知道实现动画效果实际上就是值(float)之间的变化,而在本身ViewPager方法中position,offset,offsetPixels是通过页面滑动不断变化的。所以我们可以通过活用这三个参数实现动画切换效果。
public class MyViewPager extends ViewPager {
private View mLeft;
private View mRight;
private float mTrans;
private float mScale;
private static final float MIN_SCALE = 0.5f;
//通过map集合保存动画和视图
private Map<Integer, View> mChildren = new HashMap<Integer, View>();
public void setViewForPosition(View view, int position) {
mChildren.put(position, view);
//设置
//加入这个方法需要在main的 instantiateItem中注册声明,集体代码如下
// mViewPager.setViewForPosition(mImageView, position);
}
public void removeViewFromPosition(Integer position) {
mChildren.remove(position);
//移除
//加入这个方法需要在main的 destroyItem中注册使用,集体代码如下
//mViewPager.removeViewFromPosition(position);
}
public MyViewPager(Context context) {
super(context);
}
@Override
protected void onPageScrolled(int position, float offset, int offsetPixels) {
//获得当前的left和right的图片 position为0/1/2/3的整数值
mLeft = mChildren.get(position);
mRight = mChildren.get(position+1);
animStatck(mLeft, mRight, offset, offsetPixels);
super.onPageScrolled(position, offset, offsetPixels);
}
private void animStatck(View left, View right, float offset, int offsetPixels) {
//当右边的图片全部滑动至完全显示时
if (right != null) {
//从第A页到第B页 offset0~1
mScale = (1 - MIN_SCALE) * offset + MIN_SCALE;
mTrans = -getWidth() - getPageMargin() + offsetPixels;
if(offset==0){//如果不置为0,会在滑动时出现下一个页面的图片
mTrans = 0;
mScale = 0;
}
//Viewhelper为第三方jar报提供的方法,使用这个第三方jar包也可以解决兼容性问题
ViewHelper.setScaleX(right,mScale);
ViewHelper.setScaleX(right,mScale);
ViewHelper.setTranslationX(right, mTrans);
ViewHelper.setAlpha(right,offset);
}
if(left!=null){
left.bringToFront();
ViewHelper.setAlpha(right, offset);
}
}
public MyViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
}
需要注意的是,安卓3.0以上给我们提供了
mViewPager.setPageTransformer(true,new DepthPageTransformer());
方法设置动画,其中第二个参数为定义的动画效果类。
学习Viewpager我么需要注意的是或用第三方类,当然如果你自我要求比较高,可以尝试实现自动义的Viewpager动画。自定义Viewpager动画中,需要参考第三方jar的代码,通过你想要的动画,需要什么属性着手,活用其中的变量
自定义ViewPager的兼容性问题及解决办法的更多相关文章
- Aasible中cryptography兼容性报错解决办法
Aasible中cryptography兼容性报错解决办法 1 Ansible中使用ansible --version查看版本,报错信息如下: ERROR! Unexpected Exception, ...
- IE浏览器和Firefox浏览器兼容性问题及解决办法
IE浏览器和Firefox浏览器兼容性问题及解决办法 为了方便大家阅读代码,以下以 IE 代替 Internet Explorer,以 MF/FF 代替 Mozzila Firefox : 1.//w ...
- win8下安装VC6出现兼容性问题的解决办法
重装系统之后(win8的系统),发现VC6安装出现兼容性问题,花了一些时间解决,有出现的问题都差不多在下面链接的总结中,写的很详细: http://www.docin.com/p-1126120829 ...
- 关于IE和Firefox兼容性问题及解决办法
1.//window.eventIE:有window.event对象FF:没有window.event对象.可以通过给函数的参数传递event对象.如onmousemove=doMouseMove(e ...
- Fiddler扩展——自定义列数据&Tunnel to 443解决办法
在平时日常工作中,使用Fiddler的占比还是蛮大的.使用过程,也会遇到一些小问题,问题虽小,但抓不到包,分析不了问题与数据,那也是件麻烦的事情. 以前也分享过一些小技巧,可以找以前的博文查看,具体地 ...
- ViewPager+Fragment切换卡顿解决办法
1.ViewPager设置预加载 我有4个tag,都不想被销毁,设置预加载个数为3. ViewPager viewPager; viewPager.setOffscreenPageLimit(3); ...
- odoo自定义模块项目结构,odoo自定义模块点安装不成功解决办法
如图所示:在odoo源码的根目录中创建自己的项目文件(project) 在odoo.conf配置文件中的addons_path路径中加入自己项目的文件夹路径,推荐使用绝对路径 addons_path ...
- WebStorm开发Vue自定义标签提示是未知标签解决办法
打开 File -> Settings -> File Types 在右侧的窗口中找到Vue.js Template 并选中,在下面的窗口中添加 *.vue 即可解决问题. 修改后
- android中控件公用产生的冲突的解决办法
1.ViewPager嵌套HorizontalScrollView滑动冲突的解决办法,重写ViewPager public class ZdyViewPage extends ViewPager { ...
随机推荐
- em,rem
em rem 相对单位: 也可用于设置padding line-height等em相对当前容器的默认字体设置比如,所有浏览器默认字体都是16px,body{ font-size:62.5%}以后即1 ...
- 汕头市队赛 SRM14 T2 最长上升子序列
最长上升子序列 (tree.pas/c/cpp) 128MB 1s 有一个长度为n的序列a[i],其中1到n的整数各自在a[i]中出现恰好一次. 现在已知另一个等长的序列f[i],表示a[i]中以第i ...
- 自定义View Draw过程(4)
目录 目录 1. 知识基础 具体请看我写的另外一篇文章:自定义View基础 - 最易懂的自定义View原理系列 2. draw过程作用 绘制View视图 3. draw过程详解 同measure.la ...
- VIM使用系列: 复制并移动文本
1 5. 复制并移动文本 *copy-move* 2 3 *quote* 4 "{a-zA-Z0-9.%#:-"} 指定下次的删除.抽出和放置命令使用的寄存器 5 {a-zA-Z0 ...
- app:compileDebugNdk,NDK
Error:Execution failed for task ':app:compileDebugNdk'. > Error: Your project contains C++ files ...
- python的优化机制与垃圾回收与gc模块
python属于动态语言,我们可以随意的创建和销毁变量,如果频繁的创建和销毁则会浪费cpu,那么python内部是如何优化的呢? python和其他很多高级语言一样,都自带垃圾回收机制,不用我们去维护 ...
- uva11019矩阵匹配器D316
#include<iostream> #include<cstring> #include<cstdio> #include<cmath> #inclu ...
- AC日记——Count on a tree II spoj
Count on a tree II 思路: 树上莫队: 先分块,然后,就好办了: 来,上代码: #include <cmath> #include <cstdio> #inc ...
- (11)C#值类型和引用类型,堆和栈,ref和out,装箱和拆箱
一.值类型和引用类型定义 以内存中的存在方式可以把变量分成两大类型,值类型和引用类型. 值类型:系统只占用一块内存,数据直接存储在内存里. 引用类型:系统占用两块内存,一块存放地址,另一块存放实际数据 ...
- 51nod 1873 初中的算术【Java BigDecimal/高精度小数】
1873 初中的算术 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 Noder现在上初三了,正在开始复习中考.他每天要计算型如 (a× a× a× ...