Update DotsIndicator style

master
Koitharu 2 years ago
parent 7f5ff1ab14
commit 5c8157b81f
Signed by: Koitharu
GPG Key ID: 676DEE768C17A9D7

@ -15,17 +15,23 @@ import org.koitharu.kotatsu.core.util.ext.getThemeColor
import org.koitharu.kotatsu.core.util.ext.measureDimension import org.koitharu.kotatsu.core.util.ext.measureDimension
import org.koitharu.kotatsu.core.util.ext.resolveDp import org.koitharu.kotatsu.core.util.ext.resolveDp
import org.koitharu.kotatsu.parsers.util.toIntUp import org.koitharu.kotatsu.parsers.util.toIntUp
import com.google.android.material.R as materialR
class DotsIndicator @JvmOverloads constructor( class DotsIndicator @JvmOverloads constructor(
context: Context, context: Context,
attrs: AttributeSet? = null, attrs: AttributeSet? = null,
defStyleAttr: Int = 0, defStyleAttr: Int = R.attr.dotIndicatorStyle,
) : View(context, attrs, defStyleAttr) { ) : View(context, attrs, defStyleAttr) {
private val paint = Paint(Paint.ANTI_ALIAS_FLAG) private val paint = Paint(Paint.ANTI_ALIAS_FLAG)
private var indicatorSize = context.resources.resolveDp(12f) private var indicatorSize = context.resources.resolveDp(12f)
private var dotSpacing = 0f private var dotSpacing = 0f
private var smallDotScale = 0.33f
private var smallDotAlpha = 0.6f
private var positionOffset: Float = 0f private var positionOffset: Float = 0f
private var position: Int = 0
private val inset = context.resources.resolveDp(1f)
var max: Int = 6 var max: Int = 6
set(value) { set(value) {
if (field != value) { if (field != value) {
@ -34,23 +40,28 @@ class DotsIndicator @JvmOverloads constructor(
invalidate() invalidate()
} }
} }
var position: Int = 2 var progress: Int
get() = position
set(value) { set(value) {
if (field != value) { if (position != value) {
field = value position = value
invalidate() invalidate()
} }
} }
init { init {
paint.strokeWidth = context.resources.resolveDp(1.5f) paint.style = Paint.Style.FILL
context.withStyledAttributes(attrs, R.styleable.DotsIndicator, defStyleAttr) { context.withStyledAttributes(attrs, R.styleable.DotsIndicator, defStyleAttr) {
paint.color = getColor( paint.color = getColor(
R.styleable.DotsIndicator_dotColor, R.styleable.DotsIndicator_dotColor,
context.getThemeColor(com.google.android.material.R.attr.colorPrimary, Color.DKGRAY), context.getThemeColor(materialR.attr.colorOnBackground, Color.DKGRAY),
) )
indicatorSize = getDimension(R.styleable.DotsIndicator_dotSize, indicatorSize) indicatorSize = getDimension(R.styleable.DotsIndicator_dotSize, indicatorSize)
dotSpacing = getDimension(R.styleable.DotsIndicator_dotSpacing, dotSpacing) dotSpacing = getDimension(R.styleable.DotsIndicator_dotSpacing, dotSpacing)
smallDotScale = getFloat(R.styleable.DotsIndicator_dotScale, smallDotScale).coerceIn(0f, 1f)
smallDotAlpha = getFloat(R.styleable.DotsIndicator_dotAlpha, smallDotAlpha).coerceIn(0f, 1f)
max = getInt(R.styleable.DotsIndicator_android_max, max)
position = getInt(R.styleable.DotsIndicator_android_progress, position)
} }
} }
@ -59,26 +70,21 @@ class DotsIndicator @JvmOverloads constructor(
val dotSize = getDotSize() val dotSize = getDotSize()
val y = paddingTop + (height - paddingTop - paddingBottom) / 2f val y = paddingTop + (height - paddingTop - paddingBottom) / 2f
var x = paddingLeft + dotSize / 2f var x = paddingLeft + dotSize / 2f
val radius = dotSize / 2f - paint.strokeWidth val radius = dotSize / 2f - inset
val spacing = (width - paddingLeft - paddingRight) / max.toFloat() - dotSize val spacing = (width - paddingLeft - paddingRight) / max.toFloat() - dotSize
x += spacing / 2f x += spacing / 2f
paint.style = Paint.Style.STROKE
for (i in 0 until max) { for (i in 0 until max) {
canvas.drawCircle(x, y, radius, paint) val scale = when (i) {
if (i == position) { position -> (1f - smallDotScale) * (1f - positionOffset) + smallDotScale
paint.style = Paint.Style.FILL position + 1 -> (1f - smallDotScale) * positionOffset + smallDotScale
paint.alpha = (255 * (1f - positionOffset)).toInt() else -> smallDotScale
canvas.drawCircle(x, y, radius, paint)
paint.alpha = 255
paint.style = Paint.Style.STROKE
}
if (i == position + 1 && positionOffset > 0f) {
paint.style = Paint.Style.FILL
paint.alpha = (255 * positionOffset).toInt()
canvas.drawCircle(x, y, radius, paint)
paint.alpha = 255
paint.style = Paint.Style.STROKE
} }
paint.alpha = (255 * when (i) {
position -> (1f - smallDotAlpha) * (1f - positionOffset) + smallDotAlpha
position + 1 -> (1f - smallDotAlpha) * positionOffset + smallDotAlpha
else -> smallDotAlpha
}).toInt()
canvas.drawCircle(x, y, radius * scale, paint)
x += spacing + dotSize x += spacing + dotSize
} }
} }
@ -114,11 +120,6 @@ class DotsIndicator @JvmOverloads constructor(
this@DotsIndicator.positionOffset = positionOffset this@DotsIndicator.positionOffset = positionOffset
invalidate() invalidate()
} }
override fun onPageSelected(position: Int) {
super.onPageSelected(position)
this@DotsIndicator.position = position
}
} }
private inner class AdapterObserver( private inner class AdapterObserver(

@ -2,6 +2,7 @@
<LinearLayout <LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical"> android:orientation="vertical">
@ -17,8 +18,11 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_horizontal" android:layout_gravity="center_horizontal"
android:layout_marginVertical="@dimen/margin_small" android:layout_marginVertical="@dimen/margin_small"
app:dotAlpha="0.6"
app:dotSize="8dp" app:dotSize="8dp"
app:dotSpacing="6dp" /> app:dotSpacing="4dp"
tools:max="6"
tools:progress="2" />
</LinearLayout> </LinearLayout>

@ -9,6 +9,7 @@
<attr name="fastScrollerStyle" /> <attr name="fastScrollerStyle" />
<attr name="tipViewStyle" /> <attr name="tipViewStyle" />
<attr name="progressButtonStyle" /> <attr name="progressButtonStyle" />
<attr name="dotIndicatorStyle" />
<!--CoverImageView attrs--> <!--CoverImageView attrs-->
<declare-styleable name="CoverImageView"> <declare-styleable name="CoverImageView">
@ -163,8 +164,12 @@
<attr name="dotSize" format="dimension"> <attr name="dotSize" format="dimension">
<enum name="fit" value="-1" /> <enum name="fit" value="-1" />
</attr> </attr>
<attr name="dotScale" format="float" />
<attr name="dotAlpha" format="float" />
<attr name="dotColor" format="color" /> <attr name="dotColor" format="color" />
<attr name="dotSpacing" format="dimension" /> <attr name="dotSpacing" format="dimension" />
<attr name="android:max" />
<attr name="android:progress" />
</declare-styleable> </declare-styleable>
</resources> </resources>

@ -169,6 +169,10 @@
<item name="scrollerOffset">@dimen/grid_spacing_outer</item> <item name="scrollerOffset">@dimen/grid_spacing_outer</item>
</style> </style>
<style name="Widget.Kotatsu.DotIndicator" parent="">
</style>
<style name="Widget.Kotatsu.ListItemTextView" parent=""> <style name="Widget.Kotatsu.ListItemTextView" parent="">
<item name="android:textColor">@color/list_item_text_color</item> <item name="android:textColor">@color/list_item_text_color</item>
<item name="backgroundFillColor">@color/list_item_background_color</item> <item name="backgroundFillColor">@color/list_item_background_color</item>

@ -71,24 +71,20 @@
<item name="textInputStyle">@style/Widget.Material3.TextInputLayout.OutlinedBox</item> <item name="textInputStyle">@style/Widget.Material3.TextInputLayout.OutlinedBox</item>
<item name="toolbarStyle">@style/Widget.Material3.Toolbar</item> <item name="toolbarStyle">@style/Widget.Material3.Toolbar</item>
<item name="appBarLayoutStyle">@style/Widget.Kotatsu.AppBarLayout</item> <item name="appBarLayoutStyle">@style/Widget.Kotatsu.AppBarLayout</item>
<item name="bottomNavigationStyle"> <item name="bottomNavigationStyle">@style/Widget.Kotatsu.BottomNavigationView.ColoredIndicators</item>
@style/Widget.Kotatsu.BottomNavigationView.ColoredIndicators
</item>
<item name="tabStyle">@style/Widget.Kotatsu.Tabs</item> <item name="tabStyle">@style/Widget.Kotatsu.Tabs</item>
<item name="materialCardViewStyle">@style/Widget.Kotatsu.CardView.Filled</item> <item name="materialCardViewStyle">@style/Widget.Kotatsu.CardView.Filled</item>
<item name="recyclerViewStyle">@style/Widget.Kotatsu.RecyclerView</item> <item name="recyclerViewStyle">@style/Widget.Kotatsu.RecyclerView</item>
<item name="fastScrollerStyle">@style/Widget.Kotatsu.FastScroller</item> <item name="fastScrollerStyle">@style/Widget.Kotatsu.FastScroller</item>
<item name="listItemTextViewStyle">@style/Widget.Kotatsu.ListItemTextView</item> <item name="listItemTextViewStyle">@style/Widget.Kotatsu.ListItemTextView</item>
<item name="materialSwitchStyle">@style/Widget.Material3.CompoundButton.MaterialSwitch <item name="materialSwitchStyle">@style/Widget.Material3.CompoundButton.MaterialSwitch</item>
</item>
<item name="switchPreferenceCompatStyle">@style/Preference.SwitchPreferenceCompat.M3</item> <item name="switchPreferenceCompatStyle">@style/Preference.SwitchPreferenceCompat.M3</item>
<item name="collapsingToolbarLayoutStyle">@style/Widget.Kotatsu.CollapsingToolbar</item> <item name="collapsingToolbarLayoutStyle">@style/Widget.Kotatsu.CollapsingToolbar</item>
<item name="circularProgressIndicatorStyle"> <item name="circularProgressIndicatorStyle">@style/Widget.Kotatsu.CircularProgressIndicator</item>
@style/Widget.Kotatsu.CircularProgressIndicator
</item>
<item name="linearProgressIndicatorStyle">@style/Widget.Kotatsu.LinearProgressIndicator</item> <item name="linearProgressIndicatorStyle">@style/Widget.Kotatsu.LinearProgressIndicator</item>
<item name="bottomSheetDragHandleStyle">@style/Widget.Kotatsu.BottomSheet.DragHandle</item> <item name="bottomSheetDragHandleStyle">@style/Widget.Kotatsu.BottomSheet.DragHandle</item>
<item name="android:dropDownSpinnerStyle">@style/Widget.Kotatsu.Spinner.DropDown</item> <item name="android:dropDownSpinnerStyle">@style/Widget.Kotatsu.Spinner.DropDown</item>
<item name="dotIndicatorStyle">@style/Widget.Kotatsu.DotIndicator</item>
<!-- Text appearance --> <!-- Text appearance -->
<item name="actionMenuTextAppearance">@style/TextAppearance.Kotatsu.Menu</item> <item name="actionMenuTextAppearance">@style/TextAppearance.Kotatsu.Menu</item>

Loading…
Cancel
Save