自定义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 { ...
随机推荐
- 享元模式(FlyWeight Pattern)及其在java自动拆箱、自动装箱中的运用
本文主要从三个方面着手,第一:简要介绍享元模式.第二:享元模式在基本类型封装类中的运用以Integer为例进行阐述.第三:根据第一.第二的介绍,进而推出java是如何实现自动拆箱与装箱的. 第一:简要 ...
- 汕头市队赛 SRM1X T2 ——扫描线
绵津见-终 SRM 13 背景 “西瓜也是可以种在海上的!”——绵津见 然而种在海上的西瓜最需要防范的,是时不时会涌向瓜田的阵阵海浪. 幸好,身为海神的绵津见可以释放魔法“水平如镜”来阻止海浪拍打西瓜 ...
- 创建型设计模式之单例模式(Singleton)
结构 意图 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 适用性 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时. 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更 ...
- matlab7 + sqlitejdbc-v056.jar出现错误
conn=database('data.db','','','org.sqlite.JDBC','jdbc:sqlite:C:/MATLAB7/work/del_man_voice_from_wave ...
- linux硬盘分区表为gpt
由于mbr最大支持2T不够用,给5T的新硬盘弄成GPT的 yum install -y parted#指定硬盘parted /dev/#p 查看分区#rm 1p 删除指定分区#改成gptmklabel ...
- AC日记——Array Queries codeforces 797e
797E - Array Queries 思路: 分段处理: 当k小于根号n时记忆化搜索: 否则暴力: 来,上代码: #include <cmath> #include <cstdi ...
- 理解Java垃圾回收
stop-the-world 原文链接:http://www.cubrid.org/blog/de... 了解Java的垃圾回收(GC)原理能给我们带来什么好处?对于软件工程师来说,满足技术好奇心可算 ...
- (6)java基础知识-基本数据类型、数据类型转换
一.基本数据类型 基本的数据类型一共有四类八种 1.整型 byte: 1字节 取值范围 -128~127 short: 2字节 取值范围 -32768~32767 int: 4字节 取 ...
- POJ 1862 Stripies【哈夫曼/贪心/优先队列】
Stripies Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 18198 Accepted: 8175 Descrip ...
- ECNU 3462 最小 OR 路径 (贪心 + 并查集)
题目链接 EOJ Monthly 2018.1 Problem F 先假设答案的每一位都是$1$,然后从高位开始,选出那些该位置上为$0$的所有边,并查集判断连通性. 如果$s$和$t$可以连通的话 ...