上次看見餓了么里邊的廣告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