Android RecyclerView过渡动画故障

时间:2020-06-18 15:45:42

标签: android android-recyclerview android-transitions

我的布局包含一个水平的回收站视图和一个来自右侧的幻灯片菜单。 要求是在菜单滑入时调整回收器视图的大小-当菜单在回收器视图中滑动时应缩小,而在滑出视图时则应扩大。

我使用过渡效果实现了幻灯片动画。 我现在面临的问题是,每当回收者视图缩小时,如果最后一个项目被切掉,则当要删除的动画开始播放时,它会从其父视图的边界弹出一秒钟,然后淡出。这看起来很糟糕,我正在寻找一种解决方法。

我准备了一个演示此问题的项目。

Here is out it looks like

下面是示例代码。

希望对这个问题有任何见解。

谢谢!

片段和适配器:

class FirstFragment : Fragment() {

    private var startSet = ConstraintSet()
    private var endSet = ConstraintSet()
    private var isOnEndSet = false

    override fun onCreateView(
            inflater: LayoutInflater, container: ViewGroup?,
            savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_first, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        val a = Adapter()
        recycler.apply {
            layoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)
            (itemAnimator as? SimpleItemAnimator)?.supportsChangeAnimations = false
            adapter = a
        }
        a.submitList(listOf("aaaaaa", "bbbbbbbbbbbbbbbbbb", "ccccccccccccccc", "dddddddddddd", "eeeeeeeeeeeeeee"))

        startSet.clone(root.context, R.layout.fragment_first)
        endSet.clone(root.context, R.layout.fragment_first_anim)

        animator.setOnClickListener {
            val transition: Transition = AutoTransition()
            transition.duration = 300
            transition.interpolator = DecelerateInterpolator()
            TransitionManager.beginDelayedTransition(root, transition)

            if (isOnEndSet) {
                startSet.applyTo(root)
            } else {
                endSet.applyTo(root)
            }

            isOnEndSet = !isOnEndSet
        }
    }
}

class Adapter: ListAdapter<String, ViewHolder>(DiffCallback()) {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        return ViewHolder.from(parent)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val tool = getItem(position)
        holder.bind(tool)
    }
}

class ViewHolder(viewItem: View): RecyclerView.ViewHolder(viewItem) {

    private val listItem = itemView.listItem

    companion object {
        fun from(parent: ViewGroup): ViewHolder {
            val view = LayoutInflater.from(parent.context)
                .inflate(R.layout.list_item, parent, false)
            return ViewHolder(view)
        }
    }

    fun bind(item: String) {
        listItem.text = item

        val color = (Math.random() * 16777215).toInt() or (0xFF shl 24)
        listItem.setBackgroundColor(color)
    }
}

class DiffCallback: DiffUtil.ItemCallback<String>() {
    override fun areItemsTheSame(oldItem: String, newItem: String): Boolean {
        return oldItem == newItem
    }

    override fun areContentsTheSame(oldItem: String, newItem: String): Boolean {
        return oldItem == newItem
    }
} 

布局-fragment_first.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/root"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".FirstFragment">

    <Button
        android:layout_width="100dp"
        android:layout_height="100dp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:text="ANIMATE"
        android:id="@+id/animator" />

    <TextView
        android:id="@+id/textview_first"
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:text="I'M A MENU"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/container"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:layout_margin="10dp"
        android:background="@drawable/recycler_border"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/textview_first"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recycler"
            android:layout_width="match_parent"
            android:layout_height="100dp"
            android:orientation="horizontal"
            tools:listitem="@layout/list_item"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />
    </androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

布局-fragment_first_anim.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".FirstFragment">

    <TextView
        android:id="@+id/textview_first"
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:text="I'M A MENU"
        android:background="@color/colorPrimaryDark"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <LinearLayout
        android:id="@+id/container"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:layout_margin="10dp"
        android:background="@drawable/recycler_border"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/textview_first"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recycler"
            android:layout_width="match_parent"
            android:layout_height="100dp"
            android:orientation="horizontal"
            tools:listitem="@layout/list_item"
            app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />
    </LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView android:id="@+id/listItem"
    android:layout_height="100dp"
    android:layout_width="wrap_content"
    android:text="ITEM"
    android:background="@color/design_default_color_error"
    android:gravity="center"
    android:padding="10dp"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto" />

0 个答案:

没有答案