美文网首页Android开发精选
(ViewPager画廊效果)仿淘票票影院影片选择

(ViewPager画廊效果)仿淘票票影院影片选择

作者: Zoop | 来源:发表于2017-06-14 16:01 被阅读941次
    • 先上效果图


      效果图

    • demo地址:https://github.com/chenhao520/TaoPiaoPiaoDemo
    • 最近有个需求,在我们平台上写个卖电影票的功能与第三方卖座对接,其中影院进去就会有这样的效果,看一看淘票票效果。


      淘票票效果

    参照淘票票效果,用viewPager实现,不说了上代码。

    viewPager的布局

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="130dp"
        android:clipChildren="false"
        android:gravity="center_horizontal"
        android:layerType="software"
        android:orientation="horizontal">
    
        <com.example.administrator.helloworld.cunpiao.ClipViewPager
            android:id="@+id/viewpager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:clipChildren="false"></com.example.administrator.helloworld.cunpiao.ClipViewPager>
    </LinearLayout>
    

    主要关键点是** Android:clipChildren=”false” **这个属性
    1、配置ViewPager 和其父布局的 android:clipChildren属性为”false”. (android:clipChildren表示是否限制子View在其范围内,默认为true. 代码设置setClipChildren(false)) 因为如果clipChildren属性设置为true,就表明我们要将children给clip掉,就是说对于子元素来说,超出当前view的部分都会被切掉,那我们在这里把它设置成false,就表明超出view的部分,不要切掉,依然显示。

    注意:setClipChildren(false)在3.0以上版本中,开启了硬件加速后将不能正常工作,所以需要将其设置为软件加速。设置软硬件加速使用 setLayerType(View.LAYER_TYPE_SOFTWARE, null); 也可以在布局文件中添加 android:layerType=”software”

    2、设置幕后item的缓存数目。如果一屏展示的pager数目多的话就需要设置此项。

    mViewPager.setOffscreenPageLimit(8);//设置缓存数量
    

    3、设置页与页之间的间距

    mViewPager.setPageMargin(15);//设置间距
    

    4、设置滑动,点击事件
    如果只是简单的实现滑动,可以用设置viewPager父控件的onTouch监听到ViewPager的监听上

    ll.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    return mViewPager.dispatchTouchEvent(event);
                }
            });
    
    以上四个步骤基本完成item 一屏显示的功能,但是放大的功能还需要以下代码才能实现.

    viewPager的一个方法设置滑动效果mViewPager.setPageTransformer(),所有以我们需要定义一个类实现ViewPager.PageTransformer这个接口

    class ZoomOutPageTransformer implements ViewPager.PageTransformer {
            private static final float MIN_SCALE = 0.9f;
            private static final float MIN_ALPHA = 0.5f;
    
            private float defaultScale = 0.9f;
    
            public void transformPage(View view, float position) {
                int pageWidth = view.getWidth();
                int pageHeight = view.getHeight();
    
                if (position < -1) { // [-Infinity,-1)
                    // This page is way off-screen to the left.
    //                view.setAlpha(0);
                    view.setScaleX(defaultScale);
                    view.setScaleY(defaultScale);
                } else if (position <= 1) { // [-1,1]
                    // Modify the default slide transition to shrink the page as well
                    float scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position));
                    float vertMargin = pageHeight * (1 - scaleFactor) / 2;
                    float horzMargin = pageWidth * (1 - scaleFactor) / 2;
                    if (position < 0) {
                        view.setTranslationX(horzMargin - vertMargin / 2);
                    } else {
                        view.setTranslationX(-horzMargin + vertMargin / 2);
                    }
    
                    // Scale the page down (between MIN_SCALE and 1)
                    view.setScaleX(scaleFactor);
                    view.setScaleY(scaleFactor);
    
                    // Fade the page relative to its size.
    //                view.setAlpha(MIN_ALPHA +
    //                        (scaleFactor - MIN_SCALE) /
    //                                (1 - MIN_SCALE) * (1 - MIN_ALPHA));
    
                } else { // (1,+Infinity]
                    // This page is way off-screen to the right.
    //                view.setAlpha(0);
                    view.setScaleX(defaultScale);
                    view.setScaleY(defaultScale);
                }
            }
        }
    

    接下来是点击滑动效果
    这就需要自定义viewPager,所以我们就继承ViewPager

    /**
     * Created by Administrator on 2017/6/14.
     * 点击滑动的viewpager
     */
    
    public class ClipViewPager extends ViewPager {
        public ClipViewPager(Context context) {
            super(context);
        }
    
        public ClipViewPager(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        @Override
        public boolean dispatchTouchEvent(MotionEvent ev) {
            if (ev.getAction() == MotionEvent.ACTION_UP) {
                View view = viewoOfClickOnScreen(ev);
                if (view != null) {
                    int index = indexOfChild(view);
                    if (getCurrentItem() != index) {
                        setCurrentItem(indexOfChild(view));
                    }
                }
            }
            return super.dispatchTouchEvent(ev);
        }
    
        /**
         * @param ev
         * @return
         */
        private View viewoOfClickOnScreen(MotionEvent ev) {
            int childCount = getChildCount();
            int[] location = new int[2];
            for (int i = 0; i < childCount; i++) {
                View v = getChildAt(i);
                v.getLocationOnScreen(location);
    
                int minX = location[0];
                int minY = getTop();
    
                int maxX = location[0] + v.getWidth();
                int maxY = getBottom();
    
                float x = ev.getX();
                float y = ev.getY();
    
                if ((x > minX && x < maxX) && (y > minY && y < maxY)) {
                    return v;
                }
            }
            return null;
        }
    }
    

    Ok,以上代码基本完成效果。。
    第一次写,格式很烂,希望我爬过的坑不让别人爬。。谢谢!!!

    相关文章

      网友评论

      • 杨继伟:老哥 多点两下当前显示的那个item 就会乱跳咋回事:disappointed_relieved:
        Zoop:@杨继伟 我没有出现这种情况
      • APLOMB_:aplombs@qq.com 多谢老哥~
      • Superlying:方便来个源码吗?158184869@qq.com
      • aa308258ec2e:老哥,我也想要一份源码,1140254803@qq.com
      • cd12616b7390:能发我一份源码么,我按照上面弄还是没得到想要的效果wx_bin@sina.com
        Zoop:@安_60df 谢谢,源码稍后发你邮箱
      • Mr不靠谱_ba17:发一份源码呗 多谢18240036702@163.com
        Zoop:@Mr不靠谱_ba17 好的
      • NullPoint_016e:方便来份源码不?email:812132938@qq.com
        Zoop:@Coder_gc 谢谢
        Coder_gc:能给发一份源码不? 万分感谢 2659237626@qq.com
        Zoop:@NullPoint_016e 按我上面的步骤基本能实现,源码稍后发你邮箱

      本文标题:(ViewPager画廊效果)仿淘票票影院影片选择

      本文链接:https://www.haomeiwen.com/subject/evasqxtx.html