Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/199.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何像在通知中一样在RecyclerView中展开和折叠项目_Java_Android_Android Recyclerview - Fatal编程技术网

Java 如何像在通知中一样在RecyclerView中展开和折叠项目

Java 如何像在通知中一样在RecyclerView中展开和折叠项目,java,android,android-recyclerview,Java,Android,Android Recyclerview,我想在RecyclerView中实现扩展和折叠,如gif中所述。通过录音和上下滑动。 我在下面试过, 那很好,但不是我所期望的。 我已使用RecyclerView列出应用程序中的所有通知。如果有人有任何想法或经验,请与我分享。任何帮助都将不胜感激。提前谢谢 在大多数网站中,都能找到左右滑动的方法,但不能上下滑动。我想实现上下滑动,就像向左滑动和向右滑动一样。 在gif中,我没有使用箭头来展开和折叠,我只是上下滑动。我想在应用程序内部的recyclerview中实现同样的效果。您可以使用Trans

我想在RecyclerView中实现扩展和折叠,如gif中所述。通过录音和上下滑动。 我在下面试过, 那很好,但不是我所期望的。 我已使用RecyclerView列出应用程序中的所有通知。如果有人有任何想法或经验,请与我分享。任何帮助都将不胜感激。提前谢谢

在大多数网站中,都能找到左右滑动的方法,但不能上下滑动。我想实现上下滑动,就像向左滑动和向右滑动一样。
在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,并基于上一个位置增加或减少高度。这涉及到一些计算