Page indicator now uses an outline instead of overlapping shadows
This commit is contained in:
parent
c93bf89cbe
commit
d4101c7bdf
@ -1,17 +1,54 @@
|
|||||||
package eu.kanade.tachiyomi.ui.reader
|
package eu.kanade.tachiyomi.ui.reader
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.graphics.Canvas
|
import android.graphics.Canvas
|
||||||
|
import android.graphics.Color
|
||||||
|
import android.graphics.Paint
|
||||||
import android.support.v7.widget.AppCompatTextView
|
import android.support.v7.widget.AppCompatTextView
|
||||||
|
import android.text.Spannable
|
||||||
|
import android.text.SpannableString
|
||||||
|
import android.text.style.ScaleXSpan
|
||||||
import android.util.AttributeSet
|
import android.util.AttributeSet
|
||||||
|
import android.widget.TextView
|
||||||
|
|
||||||
class PageIndicatorTextView(context: Context, attrs: AttributeSet? = null) :
|
class PageIndicatorTextView(context: Context, attrs: AttributeSet? = null) :
|
||||||
AppCompatTextView(context, attrs) {
|
AppCompatTextView(context, attrs) {
|
||||||
|
|
||||||
override fun onDraw(canvas: Canvas) {
|
override fun onDraw(canvas: Canvas) {
|
||||||
// We want the shadow to look like an outline
|
val textColor = textColors.defaultColor
|
||||||
for (i in 0..5) {
|
textColorField.set(this, Color.BLACK)
|
||||||
super.onDraw(canvas)
|
paint.strokeWidth = 4f
|
||||||
|
paint.style = Paint.Style.STROKE
|
||||||
|
super.onDraw(canvas)
|
||||||
|
|
||||||
|
textColorField.set(this, textColor)
|
||||||
|
paint.strokeWidth = 0f
|
||||||
|
paint.style = Paint.Style.FILL
|
||||||
|
super.onDraw(canvas)
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressLint("SetTextI18n")
|
||||||
|
override fun setText(text: CharSequence?, type: BufferType?) {
|
||||||
|
// Add spaces at the start & end of the text, otherwise the stroke is cut-off because it's
|
||||||
|
// not taken into account when measuring the text (view's padding doesn't help).
|
||||||
|
val currText = " $text "
|
||||||
|
|
||||||
|
// Also add a bit of spacing between each character, as the stroke overlaps them
|
||||||
|
val finalText = SpannableString(currText.asIterable().joinToString("\u00A0"))
|
||||||
|
|
||||||
|
for (i in 1..finalText.lastIndex step 2) {
|
||||||
|
finalText.setSpan(ScaleXSpan(0.1f), i, i + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
super.setText(finalText, TextView.BufferType.SPANNABLE)
|
||||||
|
}
|
||||||
|
|
||||||
|
private companion object {
|
||||||
|
// We need to use reflection to set the text color instead of using [setTextColor],
|
||||||
|
// otherwise the view is invalidated inside [onDraw] and there's an infinite loop
|
||||||
|
val textColorField = TextView::class.java.getDeclaredField("mCurTextColor").apply {
|
||||||
|
isAccessible = true
|
||||||
|
}!!
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -31,11 +31,7 @@
|
|||||||
android:layout_gravity="bottom|center_horizontal"
|
android:layout_gravity="bottom|center_horizontal"
|
||||||
android:padding="4dp"
|
android:padding="4dp"
|
||||||
android:textColor="@color/md_white_1000"
|
android:textColor="@color/md_white_1000"
|
||||||
android:textStyle="bold"
|
android:textStyle="bold" />
|
||||||
android:shadowRadius="3"
|
|
||||||
android:shadowDy="0"
|
|
||||||
android:shadowDx="0"
|
|
||||||
android:shadowColor="@color/md_black_1000"/>
|
|
||||||
|
|
||||||
</FrameLayout>
|
</FrameLayout>
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user