zoukankan      html  css  js  c++  java
  • 自定义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) {
            //获得当前的leftright的图片 position0/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的代码,通过你想要的动画,需要什么属性着手,活用其中的变量


  • 相关阅读:
    .net中使用事务 dodo
    dnn中NULL值的处理 dodo
    通过sql server的作业调度+存储过程来实现系统定时任务的方法 dodo
    使用With...End With dodo
    ASP.NET页面中使用SolpartMenu控件 dodo
    浅解web打印 dodo
    WEB打印大全(转) dodo
    AjaxMethod未定义原因 dodo
    CommandEventArgs.CommandArgument 属性 dodo
    在用VS.NET2003 新建项目时系统提示 autometion服务器无法创建对象 这是什么问题? dodo
  • 原文地址:https://www.cnblogs.com/qwop/p/6637332.html
Copyright © 2011-2022 走看看