美文网首页
Android广告适用的ViewPager(自定义控件)

Android广告适用的ViewPager(自定义控件)

作者: XINHAO_HAN | 来源:发表于2018-01-16 10:35 被阅读0次

    上次看见饿了么里边的广告ViewPager感觉这个玩意还挺高大上的,所以就动手写了一个

    不加Dialog的效果图:

    1516065305391mzViewPAger.gif

    是不是感觉,好像没啥啊?跟ViewPager有啥区别

    Warning: 这个回调我没写,有项目需求的哥们,你可以自己写写

    放到Dialog里边的效果图

    1516069287171mzxh.gif

    现在完全展示出快这个View的漂亮了吧~~~~

    本次我全部用了Kotlin语言,不得不说这个语言到现在还是不稳定,可能还是和Android Studio之间的兼容性问题

    代码就不贴了,一会直接给Demo

    本次代码最绕的就是这了

     override fun onTouchEvent(event: MotionEvent?): Boolean {
    
    
            when (event?.action) {
            //移动
                MotionEvent.ACTION_MOVE -> {
    
                    //-----------------------------------操作正常滑动 ↓
                    var endX: Int = event.x.toInt()
    
                    val mid = endX - startX
    
    
                    var imageX = getChildAt(viewCount).x
    
                    // Log.e("抬起", "" + getChildAt(viewCount).x)
                    try {
                        if (getChildAt(viewCount).x > 0) {
                            /**
                             * 如果小于大于0就代表往右滑了,调出隐藏在左边的View
                             */
    
                            getChildAt(viewCount + 1).x = getChildAt(viewCount + 1).x + mid
    
                            getChildAt(viewCount).alpha = -(getChildAt(viewCount + 1).x) / viewR
    
    
    
                            isJJ = true
                        } else {
    
                            /**
                             * 否则就是往左滑,隐藏当前View到右边
                             */
                            if (viewCount == childCount - 1) {
                                getChildAt(viewCount).x = imageX + mid
                            } else {
    
                                if (getChildAt(viewCount).x + mid > 0) {
                                    /**
                                     * View坐标的调度
                                     *  写1是为了让上边的大于0产生执行,不然上边就JJ了
                                     */
                                    getChildAt(viewCount).x = 1f
                                } else {
                                    getChildAt(viewCount).x = imageX + mid
                                }
                            }
    
    
    
                            getChildAt(viewCount - 1).alpha = -(getChildAt(viewCount).x) / viewR
                            //       Log.e("透明度", "" + (-(getChildAt(viewCount).x) / viewR))
                            isJJ = false
                        }
                    } catch (e: Exception) {
    
                    }
    
    
                    startX = endX
                    //-----------------------------------操作正常滑动 ↑
    
    
                }
            //抬起
                MotionEvent.ACTION_UP -> {
    
                    try {
                        if (isJJ) {
    
                            /**
                             * 这块用了一个ISJJ  这个变量代表着View是决定隐藏(往左滑)还是显示(往右滑)
                             *
                             *
                             * 这个区域是为了显示隐藏在右边View 简称:显示View
                             */
                            //判断是否大于左边还是小于左边
                            if (getChildAt(viewCount + 1).x > -(viewR + 20)) {
                                //大于中间滚动到第下一个
    
    
                                moveView(getChildAt(viewCount + 1).x.toInt(), 0)
                                temp = viewCount + 1
                                viewCount++
    
                            }
    
                            if (getChildAt(viewCount + 1).x < -(viewR + 20)) {
                                //小于中间滚动到上一个
                                moveView(getChildAt(viewCount + 1).x.toInt(), -viewR)
    
                                temp = viewCount + 1
                                if (viewCount == childCount - 1) {
                                    moveView(getChildAt(viewCount).x.toInt(), 0)
                                } else {
                                    viewCount++
                                }
    
    
                            }
                        } else {
                            /**
                             * 然而这个区域是为了隐藏View
                             */
                            //判断是否大于左边还是小于左边
                            if (getChildAt(viewCount).x > 0) {
                                //大于中间滚动到第下一个
    
    
                                moveView(getChildAt(viewCount).x.toInt(), 0)
                                temp = viewCount
                                viewCount++
    
                            }
    
                            if (getChildAt(viewCount).x < 0) {
                                //小于中间滚动到上一个
                                moveView(getChildAt(viewCount).x.toInt(), -viewR)
    
    
                                temp = viewCount
                                if (viewCount == 0) {
                                    moveView(getChildAt(viewCount).x.toInt(), 0)
                                } else {
                                    viewCount--
                                }
    
    
                            }
                        }
                    } catch (e: Exception) {
    
                        /**
                         * 方便与程序不报错误 起见最好tryCatch一下
                         *
                         * 如果超出View有效值的范围,就初始取哪个View
                         */
                        if (viewCount >= childCount) {
                            moveView(getChildAt(childCount - 1).x.toInt(), 0)
                            viewCount = childCount - 1
                        }
    
                        if (viewCount <= 0) {
                            viewCount = 0
                            moveView(getChildAt(0).x.toInt(), 0)
    
                        }
    
                    }
    
    
                    /**
                     * 调度区域,不然每个View滑时间长了都往右走了,左边会留下一点空白,还会越留越大
                     */
                    getChildAt(viewCount).x = 0f
    
    
                }
            //按下
                MotionEvent.ACTION_DOWN -> {
    
                    /**
                     * 这个玩意是记录坐标点的
                     */
                    startX = event.x.toInt()
                    // Log.e("坐标记录", "startX:" + startX)
    
                }
    
    
            }
    
    
            return true
        }
    

    我想着是用一个布尔值来判断,没想到还真的管用...

    Demo(Github):https://github.com/hanxinhao000/XHViewPager2

    相关文章

      网友评论

          本文标题:Android广告适用的ViewPager(自定义控件)

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