Commit 580ce148 authored by Mygod's avatar Mygod

Refine animations

parent d4213e8e
...@@ -9,7 +9,6 @@ import android.support.annotation.AttrRes ...@@ -9,7 +9,6 @@ import android.support.annotation.AttrRes
import android.support.v4.app.Fragment import android.support.v4.app.Fragment
import android.support.v4.app.FragmentManager import android.support.v4.app.FragmentManager
import android.support.v7.util.SortedList import android.support.v7.util.SortedList
import android.view.accessibility.AccessibilityManager
import android.util.TypedValue import android.util.TypedValue
import com.github.shadowsocks.App.Companion.app import com.github.shadowsocks.App.Companion.app
import com.github.shadowsocks.JniHelper import com.github.shadowsocks.JniHelper
...@@ -22,11 +21,6 @@ private val fieldChildFragmentManager by lazy { ...@@ -22,11 +21,6 @@ private val fieldChildFragmentManager by lazy {
field field
} }
fun isAccessibilityEnabled(context: Context): Boolean {
val am = context.getSystemService(Context.ACCESSIBILITY_SERVICE) as AccessibilityManager
return am.isEnabled()
}
fun String.isNumericAddress() = JniHelper.parseNumericAddress(this) != null fun String.isNumericAddress() = JniHelper.parseNumericAddress(this) != null
fun String.parseNumericAddress(): InetAddress? { fun String.parseNumericAddress(): InetAddress? {
val addr = JniHelper.parseNumericAddress(this) val addr = JniHelper.parseNumericAddress(this)
......
/*******************************************************************************
* *
* Copyright (C) 2017 by Max Lv <max.c.lv@gmail.com> *
* Copyright (C) 2017 by Mygod Studio <contact-shadowsocks-android@mygod.be> *
* *
* This program is free software: you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation, either version 3 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
* *
*******************************************************************************/
package com.github.shadowsocks.widget
import android.content.Context
import android.support.design.widget.CoordinatorLayout
import android.util.AttributeSet
import android.view.View
import com.github.shadowsocks.R
class BottomMarginBehavior : CoordinatorLayout.Behavior<View> {
constructor() : super()
constructor(context: Context, attrs: AttributeSet) : super(context, attrs)
override fun layoutDependsOn(parent: CoordinatorLayout, child: View, dependency: View): Boolean =
dependency.id == R.id.stat // sorry I'm too lazy to write an attribute
override fun onDependentViewChanged(parent: CoordinatorLayout, child: View, dependency: View): Boolean {
(child.layoutParams as CoordinatorLayout.LayoutParams).bottomMargin = (parent.height - dependency.y).toInt()
return true
}
}
...@@ -20,34 +20,27 @@ ...@@ -20,34 +20,27 @@
package com.github.shadowsocks.widget package com.github.shadowsocks.widget
import android.animation.Animator
import android.animation.AnimatorListenerAdapter
import android.animation.ValueAnimator import android.animation.ValueAnimator
import android.content.Context import android.content.Context
import android.os.Build
import android.support.design.widget.CoordinatorLayout import android.support.design.widget.CoordinatorLayout
import android.support.design.widget.SnackbarAnimation
import android.support.design.widget.Snackbar import android.support.design.widget.Snackbar
import android.support.v4.view.ViewCompat import android.support.design.widget.SnackbarAnimation
import android.util.AttributeSet import android.util.AttributeSet
import android.view.View import android.view.View
import android.view.accessibility.AccessibilityManager
import com.github.shadowsocks.utils.isAccessibilityEnabled
/** /**
* Full credits go to: https://stackoverflow.com/a/35904421/2245107 * Full credits go to: https://stackoverflow.com/a/35904421/2245107
*/ */
class MoveUpwardBehavior : CoordinatorLayout.Behavior<View> { class ShrinkUpwardBehavior(context: Context, attrs: AttributeSet) : CoordinatorLayout.Behavior<View>(context, attrs) {
constructor() : super() private val accessibility = context.getSystemService(Context.ACCESSIBILITY_SERVICE) as AccessibilityManager
constructor(context: Context, attrs: AttributeSet) : super(context, attrs)
override fun layoutDependsOn(parent: CoordinatorLayout, child: View, dependency: View): Boolean = override fun layoutDependsOn(parent: CoordinatorLayout, child: View, dependency: View): Boolean =
dependency is Snackbar.SnackbarLayout dependency is Snackbar.SnackbarLayout
override fun onDependentViewChanged(parent: CoordinatorLayout, child: View, dependency: View): Boolean { override fun onDependentViewChanged(parent: CoordinatorLayout, child: View, dependency: View): Boolean {
val params = child.layoutParams child.layoutParams.height = dependency.y.toInt()
params.height = parent.height - dependency.height child.requestLayout()
child.layoutParams = params
return true return true
} }
...@@ -55,25 +48,18 @@ class MoveUpwardBehavior : CoordinatorLayout.Behavior<View> { ...@@ -55,25 +48,18 @@ class MoveUpwardBehavior : CoordinatorLayout.Behavior<View> {
* Based on BaseTransientBottomBar.animateViewOut (support lib 27.0.2). * Based on BaseTransientBottomBar.animateViewOut (support lib 27.0.2).
*/ */
override fun onDependentViewRemoved(parent: CoordinatorLayout, child: View, dependency: View) { override fun onDependentViewRemoved(parent: CoordinatorLayout, child: View, dependency: View) {
if (!isAccessibilityEnabled(parent.getContext())) { if (accessibility.isEnabled) child.layoutParams.height = parent.height else {
val animator = ValueAnimator() val animator = ValueAnimator()
val start = child.height val start = child.height
animator.setIntValues(start, parent.height) animator.setIntValues(start, parent.height)
animator.interpolator = SnackbarAnimation.FAST_OUT_SLOW_IN_INTERPOLATOR animator.interpolator = SnackbarAnimation.FAST_OUT_SLOW_IN_INTERPOLATOR
animator.duration = SnackbarAnimation.ANIMATION_DURATION animator.duration = SnackbarAnimation.ANIMATION_DURATION
animator.addUpdateListener(object : ValueAnimator.AnimatorUpdateListener { @Suppress("NAME_SHADOWING")
override fun onAnimationUpdate(animator: ValueAnimator) { animator.addUpdateListener { animator ->
val currentValue = animator.animatedValue as Int child.layoutParams.height = animator.animatedValue as Int
val params = child.layoutParams child.requestLayout()
params.height = currentValue
child.layoutParams = params
} }
})
animator.start() animator.start()
} else {
val params = child.layoutParams
params.height = parent.height
child.layoutParams = params
} }
} }
} }
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
<RelativeLayout <RelativeLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
app:layout_behavior="com.github.shadowsocks.widget.MoveUpwardBehavior"> app:layout_behavior="com.github.shadowsocks.widget.ShrinkUpwardBehavior">
<FrameLayout <FrameLayout
android:id="@+id/fragment_holder" android:id="@+id/fragment_holder"
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment