千变万化的ViewPager切换动画(一、简单的设置动画)
2016-02-02 15:39
399 查看
视频地址:http://www.imooc.com/learn/226
演示效果:
在开始之前呢,需要说明一下,因为涉及了属性动画,所以正常情况下,只能在Android3.0及以上版本使用,不过,既然说了正常情况,那肯定是有办法兼容到3.0以下(^-*),不过,先一步一步来,下面,来尝试Android3.0及以上的试试:
1.布局文件:
2.MainActivity.java
就是这么简单,不过,由于不同实际的运行过程中,不同的手机其硬件配置会有所不同,可能在运行的时候无法加载图片,出现下图中日志信息:
简单说就是硬件加速的时候,对图片的大小有限制。不同设备可能有不同的最大值。这个问题悲催的地方是,程序貌似没有捕获到这个exception, 结果是程序也不报错,图片也显示不出来。只有看debug log才能发现这个error message.
在这里有两种解决办法:
1.关闭硬件加速:
在AndroidManifest.xml中的application添加如下代码
2.或者将图片放到drawble-ldpi或者更上一级的文件夹下(如果原来放在drawble-hdpi下)
上面说了3.0及以上的使用方法,接下来将来解决兼容3.0以下的问题:
首先,应该要知道为什么3.0以下无法使用,前面说过,涉及了属性动画,那是哪里涉及了属性动画呢?就是刚刚提及的由谷歌官方提供的两个类中使用了属性动画,至于解决方法,也不是很难,可以借助开源项目ninooldandroids来实现(即在libs中添加nineoldandroids.jar包),然后修改DepthPageTransformer或者ZoomOutPageTransformer涉及属性动画的代码,这里以DepthPageTransformer为例:
记得要添加ninooldandroids.jar包,我会在文章末尾放出的,以及相关的源码和素材。
当然,仅仅是这样还是不够的,因为在ViewPager的setPageTransformer方法中,有一个判断SDK版本的if语句
复制ViewPager.java到自己的包下,然后利用IDE给其重命名,我的为MyViewPager
导入相应的包,如果还有报错的,是因为设置的API的最小版本小于14使的其中的成员变量canScrollHorizontally出错,可以选择”Disable Check in This File Only”将其忽略掉
然后将setPageTransformer方法的第二个形参
将布局文件中的
接着,就可以在Android3.0以下运行试试效果了,但是,还是要注意前面所说的硬件加速的问题。
源码、相关素材以及第三方jar :
http://download.csdn.net/download/qq_22804827/9425722
演示效果:
在开始之前呢,需要说明一下,因为涉及了属性动画,所以正常情况下,只能在Android3.0及以上版本使用,不过,既然说了正常情况,那肯定是有办法兼容到3.0以下(^-*),不过,先一步一步来,下面,来尝试Android3.0及以上的试试:
1.布局文件:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <android.support.v4.view.ViewPager android:id="@+id/id_viewpager" android:layout_width="match_parent" android:layout_height="match_parent" > </android.support.v4.view.ViewPager> </RelativeLayout>
2.MainActivity.java
public class MainActivity extends Activity { private ViewPager mViewPager; private int[] mImgIds = new int[] { R.drawable.guide_image1, R.drawable.guide_image2, R.drawable.guide_image3 }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); mViewPager=(MyViewPager) findViewById(R.id.id_viewpager); //为Viewpager添加切换动画效果(仅支持Android3.0以上版本,因为涉及了属性动画,而属性动画是Android3.0开始的) //只需要setPageTransformer方法即可 //第一个参数:true if the supplied PageTransformer requires page views to be drawn from last to first instead of first to last //第二个参数:可以去http://developer.android.com/training/animation/screen-slide.html复制谷歌官方提供的两个类的源码到自己的包中,然后new出实例即可(另外一个为DepthPageTransformer.java) mViewPager.setPageTransformer(true, new ZoomOutPageTransformer()); mViewPager.setAdapter(new PagerAdapter() { /** * Create the page for the given position * * Returns:an Object representing the new page.This does not * need to be a View, but can be some other container of the page. */ @Override public Object instantiateItem(ViewGroup container, int position) { ImageView imageView=new ImageView(MainActivity.this); imageView.setImageResource(mImgIds[position]); imageView.setScaleType(ScaleType.CENTER_CROP);//防止图片变形 container.addView(imageView);//container-容器 return imageView; } /** * Remove a page for the given position */ @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View)object); } /** * Determines whether a page View is associated with a specific key object as returned by * instantiateItem(ViewGroup, int) * * Returns:true if view is associated with the key object object */ @Override public boolean isViewFromObject(View view, Object object) { return view==object; } /** * Return the number of views available */ @Override public int getCount() { return mImgIds.length; } }); } }
就是这么简单,不过,由于不同实际的运行过程中,不同的手机其硬件配置会有所不同,可能在运行的时候无法加载图片,出现下图中日志信息:
简单说就是硬件加速的时候,对图片的大小有限制。不同设备可能有不同的最大值。这个问题悲催的地方是,程序貌似没有捕获到这个exception, 结果是程序也不报错,图片也显示不出来。只有看debug log才能发现这个error message.
在这里有两种解决办法:
1.关闭硬件加速:
在AndroidManifest.xml中的application添加如下代码
<application android:hardwareAccelerated="false" ></application>
2.或者将图片放到drawble-ldpi或者更上一级的文件夹下(如果原来放在drawble-hdpi下)
上面说了3.0及以上的使用方法,接下来将来解决兼容3.0以下的问题:
首先,应该要知道为什么3.0以下无法使用,前面说过,涉及了属性动画,那是哪里涉及了属性动画呢?就是刚刚提及的由谷歌官方提供的两个类中使用了属性动画,至于解决方法,也不是很难,可以借助开源项目ninooldandroids来实现(即在libs中添加nineoldandroids.jar包),然后修改DepthPageTransformer或者ZoomOutPageTransformer涉及属性动画的代码,这里以DepthPageTransformer为例:
//由谷歌官方提供 //从http://developer.android.com/training/animation/screen-slide.html获取 //涉及了属性动画,注意最低的API版本 //但是可以利用ninooldandroids此开源项目来支持3.0以下的属性动画(被注释掉的就是属性动画实现的,而与之替代的就是利用ninooldandroids实现的) 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(); Log.d("测试","view="+view+",position="+position); if (position < -1) { // [-Infinity,-1) // This page is way off-screen to the left. // view.setAlpha(0); ViewHelper.setAlpha(view, 0); } else if (position <= 0) { // [-1,0], A页position:0.0~-1 // Use the default slide transition when moving to the left page // view.setAlpha(1); // view.setTranslationX(0); // view.setScaleX(1); // view.setScaleY(1); ViewHelper.setAlpha(view, 1); ViewHelper.setTranslationX(view, 0); ViewHelper.setScaleX(view, 1); ViewHelper.setScaleY(view, 1); } else if (position <= 1) { // (0,1], B页position: 1~0.0 // Fade the page out. // view.setAlpha(1 - position); ViewHelper.setAlpha(view, 1 - position); // Counteract the default slide transition // view.setTranslationX(pageWidth * -position); ViewHelper.setTranslationX(view, pageWidth * -position); // Scale the page down (between MIN_SCALE and 1) float scaleFactor = MIN_SCALE + (1 - MIN_SCALE) * (1 - Math.abs(position)); //scaleFactor: 0.75~1 // view.setScaleX(scaleFactor); // view.setScaleY(scaleFactor); ViewHelper.setScaleX(view, scaleFactor); ViewHelper.setScaleY(view, scaleFactor); } else { // (1,+Infinity] // This page is way off-screen to the right. // view.setAlpha(0); ViewHelper.setAlpha(view, 0); } } }
记得要添加ninooldandroids.jar包,我会在文章末尾放出的,以及相关的源码和素材。
当然,仅仅是这样还是不够的,因为在ViewPager的setPageTransformer方法中,有一个判断SDK版本的if语句
if (Build.VERSION.SDK_INT >= 11),既然是这样,有的人肯定会灵光一闪,自己也ViewPager弄个差不过的不就行,Bingo~就是这样,下面就将步骤写出来,需要注意一些细节问题:
复制ViewPager.java到自己的包下,然后利用IDE给其重命名,我的为MyViewPager
导入相应的包,如果还有报错的,是因为设置的API的最小版本小于14使的其中的成员变量canScrollHorizontally出错,可以选择”Disable Check in This File Only”将其忽略掉
然后将setPageTransformer方法的第二个形参
PageTransformer transformer改成
ViewPager.PageTransformer transformer,还有成员变量mPageTransformer由
private ViewPager.PageTransformer mPageTransformer;改成
private ViewPager.PageTransformer mPageTransformer;,因为这里的PageTransformer是原始的ViewPager中的一个内部接口
将布局文件中的
<android.support.v4.view.ViewPager></android.support.v4.view.ViewPager>改为
<包名.自定义的文件名></包名.自定义的文件名>然后将MainActivity中的成员变量mViewPager声明为MyViewPager即可
接着,就可以在Android3.0以下运行试试效果了,但是,还是要注意前面所说的硬件加速的问题。
源码、相关素材以及第三方jar :
http://download.csdn.net/download/qq_22804827/9425722
相关文章推荐
- (15)如何使用Cocos2d-x 3.0制作基于tilemap的游戏:第三部分(完)
- LiveScript 流程控制、循环以及列表推导式
- ZOJ 3209 Treasure Map(Dancing Links)
- hdu 2822 Dogs (优先队列 + BFS)
- 透过浏览器看HTTP缓存
- pywebkitgtk的使用示例
- 第八章 拦截器机制——《跟我学Shiro》
- Android Context 上下文 你必须知道的一切
- .net应用程序和TW3的ADS之间通讯
- 改变FileUpload文件上传控件的显示方式,选择文件后自动上传
- 算法题12 数组中所有的逆序对
- 10个开发中常用的PHP代码样例
- SVN--下载、安装VisualSVN server 服务端和 TortoiseSVN客户端
- nhandled exception in thread started by <function wrapper at 0x035BA3F0>
- php通过字符串调用函数示例
- 特殊回文数
- 关于Calendar和java.util.Date.Date()一些笔记(知识不停累积中)。
- apktool(android app逆向)
- 【LCT】BZOJ 3669: [Noi2014]魔法森林
- ImageView.ScaleType详解(多图)