Java 如何像在通知中一样在RecyclerView中展开和折叠项目
我想在RecyclerView中实现扩展和折叠,如gif中所述。通过录音和上下滑动。 我在下面试过, 那很好,但不是我所期望的。 我已使用RecyclerView列出应用程序中的所有通知。如果有人有任何想法或经验,请与我分享。任何帮助都将不胜感激。提前谢谢 在大多数网站中,都能找到左右滑动的方法,但不能上下滑动。我想实现上下滑动,就像向左滑动和向右滑动一样。Java 如何像在通知中一样在RecyclerView中展开和折叠项目,java,android,android-recyclerview,Java,Android,Android Recyclerview,我想在RecyclerView中实现扩展和折叠,如gif中所述。通过录音和上下滑动。 我在下面试过, 那很好,但不是我所期望的。 我已使用RecyclerView列出应用程序中的所有通知。如果有人有任何想法或经验,请与我分享。任何帮助都将不胜感激。提前谢谢 在大多数网站中,都能找到左右滑动的方法,但不能上下滑动。我想实现上下滑动,就像向左滑动和向右滑动一样。 在gif中,我没有使用箭头来展开和折叠,我只是上下滑动。我想在应用程序内部的recyclerview中实现同样的效果。您可以使用Trans
在gif中,我没有使用箭头来展开和折叠,我只是上下滑动。我想在应用程序内部的recyclerview中实现同样的效果。您可以使用
Transition
或Animator
更改要展开/折叠的部分的可见性,或使用不同布局的ConstraintSet
最简单的方法是使用motionLayout和不同的to布局和约束集,以便在单击按钮时从一个布局更改为另一个布局。可以使用在布局之间进行更改
val constraintSet = ConstraintSet()
constraintSet.clone(this, R.layout.layout_collapsed)
val transition = ChangeBounds()
transition.interpolator = AccelerateInterpolator(1.0f)
transition.setDuration(300)
TransitionManager.beginDelayedTransition(YOUR_VIEW, transition)
constraintSet.applyTo(YOUR_VIEW)
gif中的展开/折叠动画,使用旋转x改变按钮方向的过渡,展开/折叠设置项目可见性并启动TransitionManager.beginDelayed
transition
RotateX.kt
class RotateX : Transition {
@Keep
constructor() : super()
@Keep
constructor(context: Context, attrs: AttributeSet) : super(context, attrs)
override fun getTransitionProperties(): Array<String> {
return TRANSITION_PROPERTIES
}
override fun captureStartValues(transitionValues: TransitionValues) {
captureValues(transitionValues)
}
override fun captureEndValues(transitionValues: TransitionValues) {
captureValues(transitionValues)
}
override fun createAnimator(
sceneRoot: ViewGroup,
startValues: TransitionValues?,
endValues: TransitionValues?
): Animator? {
if (startValues == null || endValues == null) return null
val startRotation = startValues.values[PROP_ROTATION] as Float
val endRotation = endValues.values[PROP_ROTATION] as Float
if (startRotation == endRotation) return null
val view = endValues.view
// ensure the pivot is set
view.pivotX = view.width / 2f
view.pivotY = view.height / 2f
return ObjectAnimator.ofFloat(view, View.ROTATION_X, startRotation, endRotation)
}
private fun captureValues(transitionValues: TransitionValues) {
val view = transitionValues.view
if (view == null || view.width <= 0 || view.height <= 0) return
transitionValues.values[PROP_ROTATION] = view.rotationX
}
companion object {
private const val PROP_ROTATION = "iosched:rotate:rotation"
private val TRANSITION_PROPERTIES = arrayOf(PROP_ROTATION)
}
}
启动动画
val parent = (itemView.parent as? ViewGroup)
val transition = TransitionInflater.from(itemView.context)
.inflateTransition(R.transition.icon_expand_toggle)
TransitionManager.beginDelayedTransition(parent, transition)
isExpanded = !isExpanded
setUpExpandedStatus()
我创建了动画和过渡示例,包括gif上的示例,您可以查看它们。您可以使用
Transition
或Animator
更改要展开/折叠的部分的可见性,或使用不同布局的ConstraintSet
最简单的方法是使用motionLayout和不同的to布局和约束集,以便在单击按钮时从一个布局更改为另一个布局。可以使用在布局之间进行更改
val constraintSet = ConstraintSet()
constraintSet.clone(this, R.layout.layout_collapsed)
val transition = ChangeBounds()
transition.interpolator = AccelerateInterpolator(1.0f)
transition.setDuration(300)
TransitionManager.beginDelayedTransition(YOUR_VIEW, transition)
constraintSet.applyTo(YOUR_VIEW)
gif中的展开/折叠动画,使用旋转x改变按钮方向的过渡,展开/折叠设置项目可见性并启动TransitionManager.beginDelayed
transition
RotateX.kt
class RotateX : Transition {
@Keep
constructor() : super()
@Keep
constructor(context: Context, attrs: AttributeSet) : super(context, attrs)
override fun getTransitionProperties(): Array<String> {
return TRANSITION_PROPERTIES
}
override fun captureStartValues(transitionValues: TransitionValues) {
captureValues(transitionValues)
}
override fun captureEndValues(transitionValues: TransitionValues) {
captureValues(transitionValues)
}
override fun createAnimator(
sceneRoot: ViewGroup,
startValues: TransitionValues?,
endValues: TransitionValues?
): Animator? {
if (startValues == null || endValues == null) return null
val startRotation = startValues.values[PROP_ROTATION] as Float
val endRotation = endValues.values[PROP_ROTATION] as Float
if (startRotation == endRotation) return null
val view = endValues.view
// ensure the pivot is set
view.pivotX = view.width / 2f
view.pivotY = view.height / 2f
return ObjectAnimator.ofFloat(view, View.ROTATION_X, startRotation, endRotation)
}
private fun captureValues(transitionValues: TransitionValues) {
val view = transitionValues.view
if (view == null || view.width <= 0 || view.height <= 0) return
transitionValues.values[PROP_ROTATION] = view.rotationX
}
companion object {
private const val PROP_ROTATION = "iosched:rotate:rotation"
private val TRANSITION_PROPERTIES = arrayOf(PROP_ROTATION)
}
}
启动动画
val parent = (itemView.parent as? ViewGroup)
val transition = TransitionInflater.from(itemView.context)
.inflateTransition(R.transition.icon_expand_toggle)
TransitionManager.beginDelayedTransition(parent, transition)
isExpanded = !isExpanded
setUpExpandedStatus()
我创建了动画和过渡示例,包括gif上的示例,您可以查看它们。谢谢您的回答。我需要上下移动手指,而不是使用箭头上下滑动。这是可能的。在您发布的图像中,触摸后会出现缩放动画(弹性运动),然后展开动画。如果您希望通过在视图上下移动手指来更改视图的高度,则应签出ItemTouchHelper,并基于上一个位置增加或减少高度。这需要一些计算谢谢你的回答。我需要上下移动手指,而不是使用箭头上下滑动。这是可能的。在您发布的图像中,触摸后会出现缩放动画(弹性运动),然后展开动画。如果您希望通过在视图上下移动手指来更改视图的高度,则应签出ItemTouchHelper,并基于上一个位置增加或减少高度。这涉及到一些计算