diff options
6 files changed, 37 insertions, 12 deletions
diff --git a/.idea/misc.xml b/.idea/misc.xml index 7319f02..085136f 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -53,7 +53,7 @@ <ConfirmationsSetting value="0" id="Add" /> <ConfirmationsSetting value="0" id="Remove" /> </component> - <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK"> + <component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK"> <output url="file://$PROJECT_DIR$/build/classes" /> </component> <component name="ProjectType"> diff --git a/library/src/main/kotlin/ca/allanwang/kau/kpref/KPrefActivity.kt b/library/src/main/kotlin/ca/allanwang/kau/kpref/KPrefActivity.kt index 13407db..36c0feb 100644 --- a/library/src/main/kotlin/ca/allanwang/kau/kpref/KPrefActivity.kt +++ b/library/src/main/kotlin/ca/allanwang/kau/kpref/KPrefActivity.kt @@ -34,14 +34,14 @@ abstract class KPrefActivity : AppCompatActivity() { fun reload(vararg index: Int) { if (index.isEmpty()) adapter.notifyAdapterDataSetChanged() - else index.forEach { adapter.notifyItemChanged(it, null) } + else index.forEach { adapter.notifyItemChanged(it) } } fun reloadByTitle(@StringRes vararg title: Int) { if (title.isEmpty()) return adapter.adapterItems.forEachIndexed { index, item -> if (title.any { item.title == it }) - adapter.notifyItemChanged(index, null) + adapter.notifyItemChanged(index) } } diff --git a/library/src/main/kotlin/ca/allanwang/kau/kpref/items/KPrefItemBase.kt b/library/src/main/kotlin/ca/allanwang/kau/kpref/items/KPrefItemBase.kt index cae2979..a15dcc3 100644 --- a/library/src/main/kotlin/ca/allanwang/kau/kpref/items/KPrefItemBase.kt +++ b/library/src/main/kotlin/ca/allanwang/kau/kpref/items/KPrefItemBase.kt @@ -30,7 +30,7 @@ abstract class KPrefItemBase<T>(builder: KPrefAdapterBuilder, override fun onPostBindView(viewHolder: ViewHolder, textColor: Int?, accentColor: Int?) { val enabled = enabler.invoke() with(viewHolder) { - container?.isEnabled = enabled + itemView.isEnabled = enabled container?.alpha = if (enabled) 1.0f else 0.3f } } @@ -38,7 +38,7 @@ abstract class KPrefItemBase<T>(builder: KPrefAdapterBuilder, override fun unbindView(holder: ViewHolder) { super.unbindView(holder) with(holder) { - container?.isEnabled = true + itemView.isEnabled = true container?.alpha = 1.0f } } diff --git a/library/src/main/kotlin/ca/allanwang/kau/views/RippleCanvas.kt b/library/src/main/kotlin/ca/allanwang/kau/views/RippleCanvas.kt index eaa9121..805fb21 100644 --- a/library/src/main/kotlin/ca/allanwang/kau/views/RippleCanvas.kt +++ b/library/src/main/kotlin/ca/allanwang/kau/views/RippleCanvas.kt @@ -1,5 +1,6 @@ package ca.allanwang.kau.views +import android.animation.ArgbEvaluator import android.animation.ValueAnimator import android.content.Context import android.graphics.Canvas @@ -71,16 +72,21 @@ class RippleCanvas @JvmOverloads constructor( return color.adjustAlpha(factor) } - fun ripple(color: Int, startX: Float = 0f, startY: Float = 0f, duration: Int = 1000, fade: Boolean = Color.alpha(color) != 255) { + /** + * Creates a ripple effect from the given starting values + * [fade] will gradually transition previous ripples to a transparent color so the resulting background is what we want + * this is typically only necessary if the ripple color has transparency + */ + fun ripple(color: Int, startX: Float = 0f, startY: Float = 0f, duration: Long = 600L, fade: Boolean = Color.alpha(color) != 255) { val w = width.toFloat() val h = height.toFloat() val x = when (startX) { - MIDDLE -> w/2 + MIDDLE -> w / 2 END -> w else -> startX } val y = when (startY) { - MIDDLE -> h/2 + MIDDLE -> h / 2 END -> h else -> startY } @@ -88,7 +94,7 @@ class RippleCanvas @JvmOverloads constructor( val ripple = Ripple(color, x, y, 0f, maxRadius, fade) ripples.add(ripple) val animator = ValueAnimator.ofFloat(0f, maxRadius) - animator.duration = duration.toLong() + animator.duration = duration animator.addUpdateListener { animation -> ripple.radius = animation.animatedValue as Float invalidate() @@ -96,12 +102,29 @@ class RippleCanvas @JvmOverloads constructor( animator.start() } + /** + * Sets a color directly; clears ripple queue if it exists + */ fun set(color: Int) { baseColor = color ripples.clear() invalidate() } + /** + * Sets a color directly but with a transition + */ + fun fade(color: Int, duration: Long = 300L) { + ripples.clear() + val animator = ValueAnimator.ofObject(ArgbEvaluator(), baseColor, color) + animator.duration = duration + animator.addUpdateListener { animation -> + baseColor = animation.animatedValue as Int + invalidate() + } + animator.start() + } + internal class Ripple(val color: Int, val x: Float, val y: Float, diff --git a/library/src/main/res/layout/kau_preference.xml b/library/src/main/res/layout/kau_preference.xml index 5123b27..4401145 100644 --- a/library/src/main/res/layout/kau_preference.xml +++ b/library/src/main/res/layout/kau_preference.xml @@ -1,4 +1,7 @@ <?xml version="1.0" encoding="utf-8"?> + +<!--due to animations, we need a wrapper viewgroup so our changes will stick--> + <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" @@ -71,7 +74,6 @@ android:maxLines="10" android:textAppearance="?android:attr/textAppearanceListItemSecondary" android:textColor="?android:attr/textColorSecondary" - android:visibility="gone" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@id/kau_pref_inner_frame" app:layout_constraintHorizontal_bias="0" diff --git a/sample/src/main/kotlin/ca/allanwang/kau/sample/MainActivity.kt b/sample/src/main/kotlin/ca/allanwang/kau/sample/MainActivity.kt index cb1cd77..98285d8 100644 --- a/sample/src/main/kotlin/ca/allanwang/kau/sample/MainActivity.kt +++ b/sample/src/main/kotlin/ca/allanwang/kau/sample/MainActivity.kt @@ -34,13 +34,13 @@ class MainActivity : KPrefActivity() { reload() val darkerColor = it.darken() this@MainActivity.navigationBarColor = darkerColor - toolbarCanvas.ripple(darkerColor, RippleCanvas.MIDDLE, RippleCanvas.END, duration = 500) + toolbarCanvas.ripple(darkerColor, RippleCanvas.MIDDLE, RippleCanvas.END, duration = 500L) }, configs = { allowCustom = false }) colorPicker(title = R.string.background_color, description = R.string.color_custom_alpha, - getter = { KPrefSample.bgColor }, setter = { KPrefSample.bgColor = it; bgCanvas.ripple(it, duration = 500) }, + getter = { KPrefSample.bgColor }, setter = { KPrefSample.bgColor = it; bgCanvas.ripple(it, duration = 500L) }, configs = { allowCustomAlpha = true allowCustom = true |