自定义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 { ...
随机推荐
- php的post
代码的顺序不能乱,否则会提交错误 $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HE ...
- UVaLive5059 Playing With Stones
数学问题 博弈 SG函数 我总觉得这题做过的……然而并没有记录 看上去是一个nim游戏的模型. 手推/打表找一下前几项的规律,发现x是偶数时,sg[x]=x/2,x是奇数时,sg[x]=sg[x di ...
- npoi导出excel 导出List<T>
using System.Collections.Generic; using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using NPOI.XSS ...
- win8启用.net framework3.5方法
管理员命令下执行dism.exe /online /enable-feature /featurename:NetFX3 /Source:L:\sources\sxs
- IOS VLC编译步骤(包含移植和截图功能)
http://blog.csdn.net/Kan_Crystal/article/details/40424673 一.下载源码 先到VLC官网将源码下载到本机,以下链接为官网编译操作地址:https ...
- UVA 10910 Marks Distribution
题意 把数字T分成N个数的和,保证这N个数中最小的数大于P.求方案数目 另f[i][j]表示把i分成j个数的和的方案数 f[i][j]=f[i][j-1]+f[i-1][j-1]+f[i-2][j-1 ...
- 用户空间缺页异常pte_handle_fault()分析--(上)【转】
转自:http://blog.csdn.net/vanbreaker/article/details/7881206 版权声明:本文为博主原创文章,未经博主允许不得转载. 前面简单的分析了内核处理用户 ...
- [BZOJ1070][SCOI2007]修车 费用流
1070: [SCOI2007]修车 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 6209 Solved: 2641[Submit][Status] ...
- 【微信】根据appid, secret, code获取用户基本信息
function getUserInfo(){ $appid = "yourappid"; $secret = "yoursecret"; $code = $_ ...
- Python的扩展接口[2] -> 动态链接库DLL[1] -> 组件对象模型 COM 的 Python 调用
组件对象模型 COM 的 Python 调用 关于COM的基本概念,可参考组件对象模型 COM的内容,下面主要介绍两种使用 Python 调用 COM 组件的方法. 1 使用 win32com 1.1 ...