commit
b1d221c117
@ -1,2 +1,28 @@
|
||||
* text=auto
|
||||
* text eol=lf
|
||||
|
||||
# Windows forced line-endings
|
||||
/.idea/* text eol=crlf
|
||||
|
||||
*.png binary
|
||||
*.jpg binary
|
||||
*.jpeg binary
|
||||
*.gif binary
|
||||
*.ico binary
|
||||
*.mov binary
|
||||
*.mp4 binary
|
||||
*.mp3 binary
|
||||
*.flv binary
|
||||
*.fla binary
|
||||
*.swf binary
|
||||
*.gz binary
|
||||
*.zip binary
|
||||
*.7z binary
|
||||
*.ttf binary
|
||||
*.eot binary
|
||||
*.woff binary
|
||||
*.pyc binary
|
||||
*.pdf binary
|
||||
*.ez binary
|
||||
*.bz2 binary
|
||||
*.swp binary
|
||||
|
@ -1,34 +0,0 @@
|
||||
package eu.kanade.tachiyomi.widget
|
||||
|
||||
import androidx.coordinatorlayout.widget.CoordinatorLayout
|
||||
import com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
import androidx.core.view.ViewCompat
|
||||
import android.view.View
|
||||
|
||||
abstract class FABAnimationBase : FloatingActionButton.Behavior() {
|
||||
|
||||
var isAnimatingOut = false
|
||||
|
||||
override fun onStartNestedScroll(coordinatorLayout: CoordinatorLayout, child: FloatingActionButton,
|
||||
directTargetChild: View, target: View, axes: Int, type: Int): Boolean {
|
||||
// Ensure we react to vertical scrolling
|
||||
return axes == ViewCompat.SCROLL_AXIS_VERTICAL ||
|
||||
super.onStartNestedScroll(coordinatorLayout, child, directTargetChild, target, axes, type)
|
||||
}
|
||||
|
||||
override fun onNestedScroll(coordinatorLayout: CoordinatorLayout, child: FloatingActionButton,
|
||||
target: View, dxConsumed: Int, dyConsumed: Int, dxUnconsumed: Int,
|
||||
dyUnconsumed: Int, type: Int) {
|
||||
super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, type)
|
||||
if (dyConsumed > 0 && !isAnimatingOut && child.visibility == View.VISIBLE) {
|
||||
// User scrolled down and the FAB is currently visible -> hide the FAB
|
||||
animateOut(child)
|
||||
} else if (dyConsumed < 0 && child.visibility != View.VISIBLE) {
|
||||
// User scrolled up and the FAB is currently not visible -> show the FAB
|
||||
animateIn(child)
|
||||
}
|
||||
}
|
||||
|
||||
abstract fun animateOut(button: FloatingActionButton)
|
||||
abstract fun animateIn(button: FloatingActionButton)
|
||||
}
|
@ -1,87 +0,0 @@
|
||||
package eu.kanade.tachiyomi.widget
|
||||
|
||||
import android.content.Context
|
||||
import android.content.res.Configuration
|
||||
import android.graphics.Rect
|
||||
import android.util.AttributeSet
|
||||
import android.view.View
|
||||
import android.view.animation.Animation
|
||||
import android.view.animation.AnimationUtils
|
||||
import androidx.coordinatorlayout.widget.CoordinatorLayout
|
||||
import androidx.interpolator.view.animation.FastOutSlowInInterpolator
|
||||
import com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
import com.google.android.material.snackbar.Snackbar
|
||||
import eu.kanade.tachiyomi.R
|
||||
import kotlin.math.min
|
||||
|
||||
@Suppress("unused", "UNUSED_PARAMETER")
|
||||
class FABAnimationUpDown @JvmOverloads constructor(ctx: Context, attrs: AttributeSet? = null) :
|
||||
FABAnimationBase() {
|
||||
|
||||
private val INTERPOLATOR = FastOutSlowInInterpolator()
|
||||
|
||||
private val outAnimation by lazy {
|
||||
AnimationUtils.loadAnimation(ctx, R.anim.fab_hide_to_bottom).apply {
|
||||
duration = 200
|
||||
interpolator = INTERPOLATOR
|
||||
}
|
||||
}
|
||||
private val inAnimation by lazy {
|
||||
AnimationUtils.loadAnimation(ctx, R.anim.fab_show_from_bottom).apply {
|
||||
duration = 200
|
||||
interpolator = INTERPOLATOR
|
||||
}
|
||||
}
|
||||
|
||||
override fun animateOut(button: FloatingActionButton) {
|
||||
outAnimation.setAnimationListener(object : Animation.AnimationListener {
|
||||
override fun onAnimationStart(animation: Animation) {
|
||||
isAnimatingOut = true
|
||||
}
|
||||
|
||||
override fun onAnimationEnd(animation: Animation) {
|
||||
isAnimatingOut = false
|
||||
button.visibility = View.INVISIBLE
|
||||
}
|
||||
|
||||
override fun onAnimationRepeat(animation: Animation) {
|
||||
}
|
||||
})
|
||||
button.startAnimation(outAnimation)
|
||||
}
|
||||
|
||||
override fun animateIn(button: FloatingActionButton) {
|
||||
button.visibility = View.VISIBLE
|
||||
button.startAnimation(inAnimation)
|
||||
}
|
||||
|
||||
override fun onDependentViewChanged(parent: CoordinatorLayout, child: FloatingActionButton, dependency: View): Boolean {
|
||||
if (isTablet(child.context)) return true
|
||||
val translationY = getFabTranslationYForSnackbar(parent, child)
|
||||
child.translationY = translationY
|
||||
return true
|
||||
}
|
||||
|
||||
private fun isTablet(context: Context): Boolean {
|
||||
return (context.resources.configuration.screenLayout and Configuration
|
||||
.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE
|
||||
}
|
||||
|
||||
private fun getFabTranslationYForSnackbar(parent: CoordinatorLayout, fab:
|
||||
FloatingActionButton): Float {
|
||||
var minOffset = 0f
|
||||
val dependencies = parent.getDependencies(fab)
|
||||
for (i in 0 until dependencies.size) {
|
||||
val view = dependencies[i]
|
||||
if (view is Snackbar.SnackbarLayout) {
|
||||
minOffset = min(minOffset, view.translationY - view.height)
|
||||
}
|
||||
}
|
||||
return minOffset
|
||||
}
|
||||
|
||||
override fun getInsetDodgeRect(parent: CoordinatorLayout, child: FloatingActionButton, rect: Rect): Boolean {
|
||||
rect.set(child.left, child.top + 100, child.right, child.bottom - 1000)
|
||||
return true
|
||||
}
|
||||
}
|
@ -1,6 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
<item android:state_enabled="false" android:color="@color/primary_text_disabled_material_dark" />
|
||||
<item android:color="@color/primary_text_default_material_dark" />
|
||||
</selector>
|
After Width: | Height: | Size: 1.3 KiB |
Binary file not shown.
After Width: | Height: | Size: 2.0 KiB |
After Width: | Height: | Size: 902 B |
Binary file not shown.
After Width: | Height: | Size: 1.3 KiB |
@ -1,21 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<ripple
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:color="@color/selectorColorDark"
|
||||
>
|
||||
<item>
|
||||
<selector>
|
||||
<item android:state_selected="true">
|
||||
<color android:color="@color/selectorColorDark"/>
|
||||
</item>
|
||||
|
||||
<item android:state_activated="true">
|
||||
<color android:color="@color/selectorColorDark"/>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<color android:color="@color/md_black_1000"/>
|
||||
</item>
|
||||
</selector>
|
||||
</item>
|
||||
</ripple>
|
@ -1,21 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<ripple
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:color="@color/colorAccentDark"
|
||||
>
|
||||
<item>
|
||||
<selector>
|
||||
<item android:state_selected="true">
|
||||
<color android:color="@color/selectorColorDark"/>
|
||||
</item>
|
||||
|
||||
<item android:state_activated="true">
|
||||
<color android:color="@color/selectorColorDark"/>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<color android:color="@color/backgroundDark"/>
|
||||
</item>
|
||||
</selector>
|
||||
</item>
|
||||
</ripple>
|
@ -1,21 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<ripple
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:color="@color/colorAccentLight"
|
||||
>
|
||||
<item>
|
||||
<selector>
|
||||
<item android:state_selected="true">
|
||||
<color android:color="@color/selectorColorLight"/>
|
||||
</item>
|
||||
|
||||
<item android:state_activated="true">
|
||||
<color android:color="@color/selectorColorLight"/>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<color android:color="@color/backgroundLight"/>
|
||||
</item>
|
||||
</selector>
|
||||
</item>
|
||||
</ripple>
|
@ -1,19 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:color="@color/rippleColorDark">
|
||||
<item>
|
||||
<selector>
|
||||
<item android:state_selected="true">
|
||||
<color android:color="@color/rippleColorDark"/>
|
||||
</item>
|
||||
|
||||
<item android:state_activated="true">
|
||||
<color android:color="@color/rippleColorDark"/>
|
||||
</item>
|
||||
|
||||
<item>
|
||||
<color android:color="@color/md_black_1000"/>
|
||||
</item>
|
||||
</selector>
|
||||
</item>
|
||||
</ripple>
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue