自定义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 { ...
随机推荐
- vue jsonp解决跨域处理
1.安装vue jsonp npm i -S vue-jsonp 2.在main.js中导入vue-jsonp import VueJsonp from 'vue-jsonp' 通过use方法,挂载到 ...
- 结构型设计模式之适配器模式(Adapter)
结构 意图 将一个类的接口转换成客户希望的另外一个接口.A d a p t e r 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 适用性 你想使用一个已经存在的类,而它的接口不符合你 ...
- 1.Openstack-环境安装
Centos7 OpenStack环境安装 Ifcofnig vim命令 Centos7最小化安装后如没有ifconfig vim命令,执行: 1 yum install -y net-tools v ...
- 读取文本文件时<U+FEFF> 导致的奇怪问题
项目中经常会从一些文本文件中读取数据进行业务处理,最近遇到一个问题,另外一个部门提供一个txt文本给我们进行业务处理,当我们使用字符流读取文本之后,处理时,发现第一行数据无法匹配,其他数据可以正常处理 ...
- C#实时读取数据----局部页面刷新【转】
I)现在刚开始学习C#,对一些基本的控件了解的不够,有个实时监控的系统,需要页面中的数据每5秒钟刷新一次, 要是每5秒钟页面全部的刷新,那页面根本就没法看了,对这个问题在CSDN上也专门开了帖子,问了 ...
- 字符编码笔记:ASCII、Unicode、UTF-8 和 Base64
1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态(-128~127),这被称为一 ...
- css容器
.s1{ background-color:pink; font-weight:bold; font-size=16px; color:black; } #id1{ background-color: ...
- Centos查看文件夹大小
查看当前目录下文件夹大小 du -h --max-depth=1 查看整体情况 df -h
- AC日记——[HAOI2007]覆盖问题 bzoj 1052
1052 思路: 二分答案: 二分可能的长度: 然后递归判断长度是否可行: 先求出刚好覆盖所有点的矩形: 可行的第一个正方形在矩形的一个角上: 枚举四个角上的正方形,然后删去点: 删去一个正方形后,递 ...
- (30)C#Timer类
有三种Timer 1.System.Windows.Forms.Timer 应用于WinForm中,它的主要缺点是计时不精确,而且必须有消息循环,Console Application(控制台应用程 ...