diff --git a/app/src/main/kotlin/com/simplemobiletools/launcher/views/HomeScreenGrid.kt b/app/src/main/kotlin/com/simplemobiletools/launcher/views/HomeScreenGrid.kt index 9b0da12..e5f431f 100644 --- a/app/src/main/kotlin/com/simplemobiletools/launcher/views/HomeScreenGrid.kt +++ b/app/src/main/kotlin/com/simplemobiletools/launcher/views/HomeScreenGrid.kt @@ -74,6 +74,7 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel private var pageChangeLastAreaEntryTime = 0L private var pageChangeAnimLeftPercentage = 0f private var pageChangeEnabled = true + private var pageChangeIndicatorsAlpha = 0f // apply fake margins at the home screen. Real ones would cause the icons be cut at dragging at screen sides var sideMargins = Rect() @@ -99,6 +100,17 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel } } + private val startFadingIndicators: Runnable = Runnable { + ValueAnimator.ofFloat(1f, 0f) + .apply { + addUpdateListener { + pageChangeIndicatorsAlpha = it.animatedValue as Float + redrawGrid() + } + start() + } + } + init { ViewCompat.setAccessibilityDelegate(this, HomeScreenGridTouchHelper(this)) @@ -109,7 +121,7 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel } dragShadowCirclePaint = Paint(Paint.ANTI_ALIAS_FLAG).apply { - color = context.resources.getColor(R.color.light_grey_stroke) + color = context.resources.getColor(R.color.hint_white) strokeWidth = context.resources.getDimension(R.dimen.small_margin) style = Paint.Style.STROKE } @@ -118,7 +130,7 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel strokeWidth = context.resources.getDimension(R.dimen.page_indicator_stroke_width) } currentPageIndicatorPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply { - color = context.resources.getColor(R.color.hint_white) + color = context.resources.getColor(R.color.white) style = Paint.Style.FILL } @@ -250,6 +262,11 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel postDelayed(checkAndExecuteDelayedPageChange, PAGE_CHANGE_HOLD_THRESHOLD) } + private fun scheduleIndicatorsFade() { + pageChangeIndicatorsAlpha = 1f + postDelayed(startFadingIndicators, PAGE_INDICATORS_FADE_DELAY) + } + private fun doWithPageChangeDelay(needed: PageChangeArea, pageChangeFunction: () -> Boolean) { if (pageChangeLastArea != needed) { pageChangeLastArea = needed @@ -746,7 +763,7 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel } // Only draw page indicators when there is a need for it - if (getMaxPage() > 0 || currentPage > 0) { + if (pageChangeAnimLeftPercentage > 0f || pageChangeIndicatorsAlpha != 0f) { val pageCount = max(getMaxPage(), currentPage) + 1 val pageIndicatorsRequiredWidth = pageCount * pageIndicatorRadius * 2 + pageCount * (pageIndicatorMargin - 1) val usableWidth = getFakeWidth() @@ -754,6 +771,11 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel var currentPageIndicatorLeft = pageIndicatorsStart val pageIndicatorY = cellYCoords[rowCount - 1].toFloat() + sideMargins.top + extraYMargin + iconMargin val pageIndicatorStep = pageIndicatorRadius * 2 + pageIndicatorMargin + if (pageChangeIndicatorsAlpha != 0f) { + emptyPageIndicatorPaint.alpha = (pageChangeIndicatorsAlpha * 255.0f).toInt() + } else { + emptyPageIndicatorPaint.alpha = 255 + } // Draw empty page indicators for (page in 0 until pageCount) { canvas.drawCircle(currentPageIndicatorLeft + pageIndicatorRadius, pageIndicatorY, pageIndicatorRadius, emptyPageIndicatorPaint) @@ -764,6 +786,11 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel val currentIndicatorRangeStart = pageIndicatorsStart + lastPage * pageIndicatorStep val currentIndicatorRangeEnd = pageIndicatorsStart + currentPage * pageIndicatorStep val currentIndicatorPosition = MathUtils.lerp(currentIndicatorRangeStart, currentIndicatorRangeEnd, 1 - pageChangeAnimLeftPercentage) + if (pageChangeIndicatorsAlpha != 0f) { + currentPageIndicatorPaint.alpha = (pageChangeIndicatorsAlpha * 255.0f).toInt() + } else { + currentPageIndicatorPaint.alpha = 255 + } canvas.drawCircle(currentIndicatorPosition + pageIndicatorRadius, pageIndicatorY, pageIndicatorRadius, currentPageIndicatorPaint) } @@ -1052,6 +1079,8 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel private fun handlePageChange(redraw: Boolean = false) { pageChangeEnabled = false + pageChangeIndicatorsAlpha = 0f + removeCallbacks(startFadingIndicators) if (redraw) { redrawGrid() } @@ -1068,6 +1097,7 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel pageChangeEnabled = true lastPage = currentPage schedulePageChange() + scheduleIndicatorsFade() redrawGrid() } }) @@ -1077,6 +1107,7 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel companion object { private const val PAGE_CHANGE_HOLD_THRESHOLD = 500L + private const val PAGE_INDICATORS_FADE_DELAY = PAGE_CHANGE_HOLD_THRESHOLD + 300L private enum class PageChangeArea { LEFT, diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 233b20b..18d61a4 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -6,7 +6,7 @@ 10dp 8dp 20dp - 4dp + 6dp 1dp - 4dp + 6dp