Page indicator now uses an outline instead of overlapping shadows

This commit is contained in:
inorichi 2017-11-20 13:55:50 +01:00
parent c93bf89cbe
commit d4101c7bdf
2 changed files with 41 additions and 8 deletions

View file

@ -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
}!!
} }
} }

View file

@ -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>