android 当用户触摸recyclerview项目时缩放动画

kse8i1jr  于 2023-03-21  发布在  Android
关注(0)|答案(3)|浏览(308)

我正在开发一个应用程序,其中有一个回收视图与一些卡,并希望创建一个放大效果时,用户触摸卡和缩小时,释放触摸。前一张和下一张卡应尊重的大小,因为它扩大,而不是后面或前面
我想创建一些类似于this layout manager的东西,但通过触摸屏幕而不是滚动。

//RecyclerView
    recyclerView = view.findViewById(R.id.recyclerView)

    recyclerView.setHasFixedSize(false)

    recyclerView.layoutManager = CenterZoomLayoutManager(activity, LinearLayoutManager.VERTICAL, false)

如何创造这种效果呢?先谢了。

dzjeubhm

dzjeubhm1#

使用stateListAnimator可以实现类似的效果。在本例中,我将stateListAnimator附加到recyclerView项目。按下项目时,比例为1,未按下时,比例为0.8

recyclerview_item.xml

<?xml version="1.0" encoding="utf-8"?>
<View xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="@dimen/item_animal_height"
    android:background="#f00"
    android:stateListAnimator="@animator/list_animator"/>

res/animator/list_animator.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true">
        <set>
            <objectAnimator android:propertyName="scaleX"
                android:valueTo="1"/>

            <objectAnimator android:propertyName="scaleY"
                android:valueTo="1"/>
        </set>
    </item>
    <item
        android:state_pressed="false">
        <set>
            <objectAnimator android:propertyName="scaleX"
                android:valueTo="0.8"/>

            <objectAnimator android:propertyName="scaleY"
                android:valueTo="0.8"/>
        </set>
    </item>
</selector>
jslywgbw

jslywgbw2#

请在onBindViewHolder中使用以下代码实现项目缩放

itemView.setOnTouchListener { view, motionEvent ->
    when (motionEvent.action) {
         MotionEvent.ACTION_DOWN -> {                  
           view.animate().scaleX(1.10f).scaleY(1.10f).setDuration(100).start()
           (itemView.parent as RecyclerView).addOnItemTouchListener(object : 
           RecyclerView.OnItemTouchListener {
             override fun onInterceptTouchEvent(rv: RecyclerView, 
             e: MotionEvent): Boolean {
                   if (rv.scrollState == RecyclerView.SCROLL_STATE_DRAGGING) {
             view.animate().scaleX(1.0f).scaleY(1.0f).setDuration(100).start() 
             }
             return false               }
             override fun onTouchEvent(rv: RecyclerView, e: MotionEvent) {}
             override fun 
             onRequestDisallowInterceptTouchEvent(disallowIntercept: 
                          Boolean) { }})
             }
         MotionEvent.ACTION_UP -> {                     
               view.animate().scaleX(1.0f).scaleY(1.0f).setDuration(100).start()
             }
         }
         true
      }
vyswwuz2

vyswwuz23#

如果你想在按住recylerview项的同时放大和缩小,上面@ashakirov的答案可以很好地工作,对于那些希望点击一个项时有这个缩放动画的人来说,可以做这些修改来实现这一点。
recyclerview_item.xml

<?xml version="1.0" encoding="utf-8"?>
<View xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="@dimen/item_animal_height"
    android:background="#f00"
    android:stateListAnimator="@animator/list_animator"/>

res/animator/list_animator.xml**(已将安卓系统:按下状态更改为安卓系统:选定状态)**

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_selected="true">
        <set>
            <objectAnimator android:propertyName="scaleX"
                android:valueTo="1"/>

            <objectAnimator android:propertyName="scaleY"
                android:valueTo="1"/>
        </set>
    </item>
    <item
        android:state_selected="false">
        <set>
            <objectAnimator android:propertyName="scaleX"
                android:valueTo="0.8"/>

            <objectAnimator android:propertyName="scaleY"
                android:valueTo="0.8"/>
        </set>
    </item>
</selector>

现在为选定位置维护一个变量,将其更新为单击项视图的位置并调用notifyDataSetChanged(),因为它将触发OnBindViewHolder,我们将在其中更改项视图的选定状态。

//add this
        holder.itemView.isSelected = position == selectedPosition
        holder.itemView.setOnClickListener {
            selectedPosition = position
            notifyDataSetChanged()
        }

相关问题