ui: minor tweaks
More miscellanious tweaks I can't categorize since I have no time. It's mostly attempts at improving animation visuals an failing. Really want to switch to material animations once I can finally get the things working.
This commit is contained in:
parent
f5ec295b2c
commit
cf64536118
13 changed files with 54 additions and 31 deletions
|
@ -46,7 +46,7 @@ import org.oxycblt.auxio.util.systemBarInsetsCompat
|
||||||
*
|
*
|
||||||
* TODO: Use proper material attributes (Not the weird dimen attributes I currently have)
|
* TODO: Use proper material attributes (Not the weird dimen attributes I currently have)
|
||||||
*
|
*
|
||||||
* TODO: Test out material animation system
|
* TODO: Migrate to material animation system
|
||||||
*
|
*
|
||||||
* @author OxygenCobalt
|
* @author OxygenCobalt
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -28,7 +28,9 @@ import androidx.appcompat.widget.Toolbar
|
||||||
import androidx.coordinatorlayout.widget.CoordinatorLayout
|
import androidx.coordinatorlayout.widget.CoordinatorLayout
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
|
import androidx.transition.TransitionManager
|
||||||
import com.google.android.material.appbar.AppBarLayout
|
import com.google.android.material.appbar.AppBarLayout
|
||||||
|
import com.google.android.material.transition.MaterialFade
|
||||||
import java.lang.reflect.Field
|
import java.lang.reflect.Field
|
||||||
import org.oxycblt.auxio.R
|
import org.oxycblt.auxio.R
|
||||||
import org.oxycblt.auxio.ui.AuxioAppBarLayout
|
import org.oxycblt.auxio.ui.AuxioAppBarLayout
|
||||||
|
@ -111,7 +113,11 @@ constructor(context: Context, attrs: AttributeSet? = null, @AttrRes defStyleAttr
|
||||||
this.titleAnimator =
|
this.titleAnimator =
|
||||||
ValueAnimator.ofFloat(from, to).apply {
|
ValueAnimator.ofFloat(from, to).apply {
|
||||||
addUpdateListener { titleView.alpha = it.animatedValue as Float }
|
addUpdateListener { titleView.alpha = it.animatedValue as Float }
|
||||||
duration = TOOLBAR_FADE_DURATION
|
duration = if (titleShown == true) {
|
||||||
|
context.resources.getInteger(R.integer.anim_fade_enter_duration).toLong()
|
||||||
|
} else {
|
||||||
|
context.resources.getInteger(R.integer.anim_fade_exit_duration).toLong()
|
||||||
|
}
|
||||||
start()
|
start()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -142,8 +148,6 @@ constructor(context: Context, attrs: AttributeSet? = null, @AttrRes defStyleAttr
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
private const val TOOLBAR_FADE_DURATION = 150L
|
|
||||||
|
|
||||||
private val TOOLBAR_TITLE_TEXT_FIELD: Field by
|
private val TOOLBAR_TITLE_TEXT_FIELD: Field by
|
||||||
lazyReflectedField(Toolbar::class, "mTitleTextView")
|
lazyReflectedField(Toolbar::class, "mTitleTextView")
|
||||||
}
|
}
|
||||||
|
|
|
@ -161,10 +161,10 @@ constructor(context: Context, attrs: AttributeSet? = null, @AttrRes defStyleAttr
|
||||||
|
|
||||||
if (isActivated) {
|
if (isActivated) {
|
||||||
targetVis = VISIBLE
|
targetVis = VISIBLE
|
||||||
targetDuration = 150L
|
targetDuration = context.resources.getInteger(R.integer.anim_fade_enter_duration).toLong()
|
||||||
} else {
|
} else {
|
||||||
targetVis = INVISIBLE
|
targetVis = INVISIBLE
|
||||||
targetDuration = 84L
|
targetDuration = context.resources.getInteger(R.integer.anim_fade_exit_duration).toLong()
|
||||||
}
|
}
|
||||||
|
|
||||||
if (selectionIndicator.visibility == targetVis) {
|
if (selectionIndicator.visibility == targetVis) {
|
||||||
|
|
|
@ -21,6 +21,7 @@ import android.animation.ValueAnimator
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.util.AttributeSet
|
import android.util.AttributeSet
|
||||||
import com.google.android.material.button.MaterialButton
|
import com.google.android.material.button.MaterialButton
|
||||||
|
import org.oxycblt.auxio.R
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A [MaterialButton] that automatically morphs from a circle to a squircle shape appearance when it
|
* A [MaterialButton] that automatically morphs from a circle to a squircle shape appearance when it
|
||||||
|
@ -46,7 +47,7 @@ constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
|
||||||
animator?.cancel()
|
animator?.cancel()
|
||||||
animator =
|
animator =
|
||||||
ValueAnimator.ofFloat(currentCornerRadiusRatio, target).apply {
|
ValueAnimator.ofFloat(currentCornerRadiusRatio, target).apply {
|
||||||
duration = ACTIVATION_DURATION
|
duration = context.resources.getInteger(R.integer.anim_fade_enter_duration).toLong()
|
||||||
addUpdateListener { updateCornerRadiusRatio(animatedValue as Float) }
|
addUpdateListener { updateCornerRadiusRatio(animatedValue as Float) }
|
||||||
start()
|
start()
|
||||||
}
|
}
|
||||||
|
@ -56,8 +57,4 @@ constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
|
||||||
currentCornerRadiusRatio = ratio
|
currentCornerRadiusRatio = ratio
|
||||||
shapeAppearanceModel = shapeAppearanceModel.withCornerSize { it.width() * ratio }
|
shapeAppearanceModel = shapeAppearanceModel.withCornerSize { it.width() * ratio }
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
|
||||||
const val ACTIVATION_DURATION = 150L
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -70,7 +70,7 @@ constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
|
||||||
// Sanity check 2: Ensure that this value is within the duration and will not crash
|
// Sanity check 2: Ensure that this value is within the duration and will not crash
|
||||||
// the app, and that the user is not currently seeking (which would cause the SeekBar
|
// the app, and that the user is not currently seeking (which would cause the SeekBar
|
||||||
// to jump around).
|
// to jump around).
|
||||||
if (from <= durationDs && !isSelected) {
|
if (from <= durationDs && !isActivated) {
|
||||||
binding.seekBarSlider.value = from.toFloat()
|
binding.seekBarSlider.value = from.toFloat()
|
||||||
|
|
||||||
// We would want to keep this in the callback, but the callback only fires when
|
// We would want to keep this in the callback, but the callback only fires when
|
||||||
|
@ -106,13 +106,13 @@ constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
|
||||||
logD("Starting seek mode")
|
logD("Starting seek mode")
|
||||||
// User has begun seeking, place the SeekBar into a "Suspended" mode in which no
|
// User has begun seeking, place the SeekBar into a "Suspended" mode in which no
|
||||||
// position updates are sent and is indicated by the position value turning accented.
|
// position updates are sent and is indicated by the position value turning accented.
|
||||||
isSelected = true
|
isActivated = true
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onStopTrackingTouch(slider: Slider) {
|
override fun onStopTrackingTouch(slider: Slider) {
|
||||||
logD("Confirming seek")
|
logD("Confirming seek")
|
||||||
// End of seek event, send off new value to callback.
|
// End of seek event, send off new value to callback.
|
||||||
isSelected = false
|
isActivated = false
|
||||||
callback?.seekTo(slider.value.toLong())
|
callback?.seekTo(slider.value.toLong())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -33,13 +33,17 @@ import androidx.core.view.isInvisible
|
||||||
import androidx.recyclerview.widget.GridLayoutManager
|
import androidx.recyclerview.widget.GridLayoutManager
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
|
import androidx.transition.TransitionManager
|
||||||
|
import com.google.android.material.transition.MaterialFade
|
||||||
import kotlin.math.abs
|
import kotlin.math.abs
|
||||||
import org.oxycblt.auxio.R
|
import org.oxycblt.auxio.R
|
||||||
import org.oxycblt.auxio.ui.recycler.AuxioRecyclerView
|
import org.oxycblt.auxio.ui.recycler.AuxioRecyclerView
|
||||||
|
import org.oxycblt.auxio.util.getDimen
|
||||||
import org.oxycblt.auxio.util.getDimenSize
|
import org.oxycblt.auxio.util.getDimenSize
|
||||||
import org.oxycblt.auxio.util.getDrawableCompat
|
import org.oxycblt.auxio.util.getDrawableCompat
|
||||||
import org.oxycblt.auxio.util.isRtl
|
import org.oxycblt.auxio.util.isRtl
|
||||||
import org.oxycblt.auxio.util.isUnder
|
import org.oxycblt.auxio.util.isUnder
|
||||||
|
import org.oxycblt.auxio.util.logD
|
||||||
import org.oxycblt.auxio.util.systemBarInsetsCompat
|
import org.oxycblt.auxio.util.systemBarInsetsCompat
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -431,7 +435,7 @@ constructor(context: Context, attrs: AttributeSet? = null, @AttrRes defStyleAttr
|
||||||
}
|
}
|
||||||
|
|
||||||
showingThumb = true
|
showingThumb = true
|
||||||
animateView(thumbView, 1f)
|
animateViewIn(thumbView)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun hideScrollbar() {
|
private fun hideScrollbar() {
|
||||||
|
@ -440,7 +444,7 @@ constructor(context: Context, attrs: AttributeSet? = null, @AttrRes defStyleAttr
|
||||||
}
|
}
|
||||||
|
|
||||||
showingThumb = false
|
showingThumb = false
|
||||||
animateView(thumbView, 0f)
|
animateViewOut(thumbView)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun showPopup() {
|
private fun showPopup() {
|
||||||
|
@ -449,7 +453,7 @@ constructor(context: Context, attrs: AttributeSet? = null, @AttrRes defStyleAttr
|
||||||
}
|
}
|
||||||
|
|
||||||
showingPopup = true
|
showingPopup = true
|
||||||
animateView(popupView, 1f)
|
animateViewIn(popupView)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun hidePopup() {
|
private fun hidePopup() {
|
||||||
|
@ -458,11 +462,22 @@ constructor(context: Context, attrs: AttributeSet? = null, @AttrRes defStyleAttr
|
||||||
}
|
}
|
||||||
|
|
||||||
showingPopup = false
|
showingPopup = false
|
||||||
animateView(popupView, 0f)
|
animateViewOut(popupView)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun animateView(view: View, alpha: Float) {
|
private fun animateViewIn(view: View) {
|
||||||
view.animate().alpha(alpha).setDuration(ANIM_MILLIS).start()
|
logD(view.translationX)
|
||||||
|
view.animate()
|
||||||
|
.alpha(1f)
|
||||||
|
.setDuration(context.resources.getInteger(R.integer.anim_fade_enter_duration).toLong())
|
||||||
|
.start()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun animateViewOut(view: View) {
|
||||||
|
view.animate()
|
||||||
|
.alpha(0f)
|
||||||
|
.setDuration(context.resources.getInteger(R.integer.anim_fade_exit_duration).toLong())
|
||||||
|
.start()
|
||||||
}
|
}
|
||||||
|
|
||||||
// --- LAYOUT STATE ---
|
// --- LAYOUT STATE ---
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<item android:color="?attr/colorPrimary" android:state_activated="true" />
|
||||||
|
<item android:color="?android:attr/textColorSecondary" />
|
||||||
|
</selector>
|
|
@ -1,6 +1,5 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<item android:color="?android:attr/textColorSecondary" android:state_selected="true" />
|
|
||||||
<item android:alpha="0.5" android:color="?android:attr/textColorSecondary" android:state_enabled="false" />
|
<item android:alpha="0.5" android:color="?android:attr/textColorSecondary" android:state_enabled="false" />
|
||||||
<item android:color="?android:attr/textColorSecondary" />
|
<item android:color="?android:attr/textColorSecondary" />
|
||||||
</selector>
|
</selector>
|
|
@ -1,7 +1,7 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<animated-selector xmlns:android="http://schemas.android.com/apk/res/android"
|
<animated-selector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:enterFadeDuration="150"
|
android:enterFadeDuration="@integer/anim_fade_enter_duration"
|
||||||
android:exitFadeDuration="150">
|
android:exitFadeDuration="@integer/anim_fade_exit_duration">
|
||||||
|
|
||||||
<item
|
<item
|
||||||
android:id="@+id/pressed"
|
android:id="@+id/pressed"
|
||||||
|
|
|
@ -51,7 +51,7 @@
|
||||||
<com.google.android.material.textfield.TextInputLayout
|
<com.google.android.material.textfield.TextInputLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginTop="@dimen/spacing_mid_medium"
|
android:layout_marginTop="@dimen/spacing_medium"
|
||||||
android:hint="@string/lbl_relative_path"
|
android:hint="@string/lbl_relative_path"
|
||||||
app:expandedHintEnabled="false">
|
app:expandedHintEnabled="false">
|
||||||
|
|
||||||
|
@ -67,7 +67,7 @@
|
||||||
<com.google.android.material.textfield.TextInputLayout
|
<com.google.android.material.textfield.TextInputLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginTop="@dimen/spacing_mid_medium"
|
android:layout_marginTop="@dimen/spacing_medium"
|
||||||
android:hint="@string/lbl_format"
|
android:hint="@string/lbl_format"
|
||||||
app:expandedHintEnabled="false">
|
app:expandedHintEnabled="false">
|
||||||
|
|
||||||
|
@ -83,7 +83,7 @@
|
||||||
<com.google.android.material.textfield.TextInputLayout
|
<com.google.android.material.textfield.TextInputLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginTop="@dimen/spacing_mid_medium"
|
android:layout_marginTop="@dimen/spacing_medium"
|
||||||
android:hint="@string/lbl_size"
|
android:hint="@string/lbl_size"
|
||||||
app:expandedHintEnabled="false">
|
app:expandedHintEnabled="false">
|
||||||
|
|
||||||
|
@ -99,7 +99,7 @@
|
||||||
<com.google.android.material.textfield.TextInputLayout
|
<com.google.android.material.textfield.TextInputLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginTop="@dimen/spacing_mid_medium"
|
android:layout_marginTop="@dimen/spacing_medium"
|
||||||
android:hint="@string/lbl_sort_duration"
|
android:hint="@string/lbl_sort_duration"
|
||||||
app:expandedHintEnabled="false">
|
app:expandedHintEnabled="false">
|
||||||
|
|
||||||
|
@ -115,7 +115,7 @@
|
||||||
<com.google.android.material.textfield.TextInputLayout
|
<com.google.android.material.textfield.TextInputLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginTop="@dimen/spacing_mid_medium"
|
android:layout_marginTop="@dimen/spacing_medium"
|
||||||
android:hint="@string/lbl_bitrate"
|
android:hint="@string/lbl_bitrate"
|
||||||
app:expandedHintEnabled="false">
|
app:expandedHintEnabled="false">
|
||||||
|
|
||||||
|
@ -131,7 +131,7 @@
|
||||||
<com.google.android.material.textfield.TextInputLayout
|
<com.google.android.material.textfield.TextInputLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginTop="@dimen/spacing_mid_medium"
|
android:layout_marginTop="@dimen/spacing_medium"
|
||||||
android:hint="@string/lbl_sample_rate"
|
android:hint="@string/lbl_sample_rate"
|
||||||
app:expandedHintEnabled="false">
|
app:expandedHintEnabled="false">
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
android:layout_marginStart="@dimen/spacing_medium"
|
android:layout_marginStart="@dimen/spacing_medium"
|
||||||
android:layout_marginBottom="@dimen/spacing_tiny"
|
android:layout_marginBottom="@dimen/spacing_tiny"
|
||||||
android:textAppearance="@style/TextAppearance.Auxio.BodySmall"
|
android:textAppearance="@style/TextAppearance.Auxio.BodySmall"
|
||||||
android:textColor="@color/sel_selectable_text_secondary"
|
android:textColor="@color/sel_activatable_text_secondary"
|
||||||
tools:text="11:38" />
|
tools:text="11:38" />
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
|
|
|
@ -6,6 +6,9 @@
|
||||||
<item name="home_artist_list" type="id" />
|
<item name="home_artist_list" type="id" />
|
||||||
<item name="home_genre_list" type="id" />
|
<item name="home_genre_list" type="id" />
|
||||||
|
|
||||||
|
<integer name="anim_fade_enter_duration">150</integer>
|
||||||
|
<integer name="anim_fade_exit_duration">84</integer>
|
||||||
|
|
||||||
<declare-styleable name="StyledImageView">
|
<declare-styleable name="StyledImageView">
|
||||||
<attr name="cornerRadius" format="dimension" />
|
<attr name="cornerRadius" format="dimension" />
|
||||||
<attr name="staticIcon" format="reference" />
|
<attr name="staticIcon" format="reference" />
|
||||||
|
|
|
@ -149,7 +149,7 @@
|
||||||
<string name="lng_indexing">Loading your music library…</string>
|
<string name="lng_indexing">Loading your music library…</string>
|
||||||
<string name="lng_observing">Monitoring your music library for changes…</string>
|
<string name="lng_observing">Monitoring your music library for changes…</string>
|
||||||
<string name="lng_queue_added">Added to queue</string>
|
<string name="lng_queue_added">Added to queue</string>
|
||||||
<string name="lng_author">Developed by OxygenCobalt</string>
|
<string name="lng_author">Developed by Alexander Capehart</string>
|
||||||
<!-- As in music library -->
|
<!-- As in music library -->
|
||||||
<string name="lng_search_library">Search your library…</string>
|
<string name="lng_search_library">Search your library…</string>
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue