Android廣告適用的ViewPager(自定義控件)

上次看見餓了么里邊的廣告ViewPager感覺這個玩意還挺高大上的,所以就動手寫了一個

不加Dialog的效果圖:

1516065305391mzViewPAger.gif

是不是感覺,好像沒啥啊?跟ViewPager有啥區(qū)別

Warning: 這個回調(diào)我沒寫,有項目需求的哥們,你可以自己寫寫

放到Dialog里邊的效果圖

1516069287171mzxh.gif

現(xiàn)在完全展示出快這個View的漂亮了吧~~~~

本次我全部用了Kotlin語言,不得不說這個語言到現(xiàn)在還是不穩(wěn)定,可能還是和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就代表往右滑了,調(diào)出隱藏在左邊的View
                         */

                        getChildAt(viewCount + 1).x = getChildAt(viewCount + 1).x + mid

                        getChildAt(viewCount).alpha = -(getChildAt(viewCount + 1).x) / viewR



                        isJJ = true
                    } else {

                        /**
                         * 否則就是往左滑,隱藏當(dāng)前View到右邊
                         */
                        if (viewCount == childCount - 1) {
                            getChildAt(viewCount).x = imageX + mid
                        } else {

                            if (getChildAt(viewCount).x + mid > 0) {
                                /**
                                 * View坐標(biāo)的調(diào)度
                                 *  寫1是為了讓上邊的大于0產(chǎn)生執(zhí)行,不然上邊就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是決定隱藏(往左滑)還是顯示(往右滑)
                         *
                         *
                         * 這個區(qū)域是為了顯示隱藏在右邊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 {
                        /**
                         * 然而這個區(qū)域是為了隱藏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)

                    }

                }


                /**
                 * 調(diào)度區(qū)域,不然每個View滑時間長了都往右走了,左邊會留下一點空白,還會越留越大
                 */
                getChildAt(viewCount).x = 0f


            }
        //按下
            MotionEvent.ACTION_DOWN -> {

                /**
                 * 這個玩意是記錄坐標(biāo)點的
                 */
                startX = event.x.toInt()
                // Log.e("坐標(biāo)記錄", "startX:" + startX)

            }


        }


        return true
    }

我想著是用一個布爾值來判斷,沒想到還真的管用...

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容