欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 新车 > kotlin音乐app之自定义点击缩放组件Shrink Layout

kotlin音乐app之自定义点击缩放组件Shrink Layout

2025/4/19 16:21:52 来源:https://blog.csdn.net/i_xiang_la_shi/article/details/147130950  浏览:    关键词:kotlin音乐app之自定义点击缩放组件Shrink Layout

上链接🫦

为了丰富用户的体验感,再点击一个item的时候都喜欢能够得到一些反馈,这样,为了能够得到反馈,我写了个缩放布局,让一整个被此布局包裹的组件感觉都被缩小了👆(怎么找不到那个小人了/👨‍🎤)

感觉这个设计就很天才了,这样我每个组件都实现这个容器,岂不是每一个item都能缩小了👄(爽飞了!)

上图,视频最后app崩溃是因为我用了redis并且把redi后端中转api部署到了我的myredisapi.com,但是我的代码没放在云上面,或者docker里就崩了。

 上代码!

import android.content.Context
import android.util.AttributeSet
import android.view.MotionEvent
import android.view.View
import android.view.ViewConfiguration
import android.widget.FrameLayout
import androidx.constraintlayout.widget.ConstraintLayout
import kotlin.math.abs

class ShrinkLayout @JvmOverloads constructor(context: Context,
    attributeSet: AttributeSet? = null,
    defStyle:Int = 0
    ) : ConstraintLayout(context,attributeSet,defStyle) {

        private val scaleFactor = 0.95f
        private val duration = 150L
        private var onTouchListener:ShrinkLayout.OnTouchListener? = null

        private var initialX = 0f // 初始触摸点 X
        private var initialY = 0f // 初始触摸点 Y
        init {
            isClickable = true
//            setOnTouchListener(AngleTouchListener(this))
            //触摸监听
            setOnTouchListener { v, event ->
                when(event.action){
                    MotionEvent.ACTION_DOWN ->{
                        initialX = event.x
                        initialY = event.y
                        performClick()
                        animate().scaleX(scaleFactor).scaleY(scaleFactor).setDuration(duration).start()
                    }
//                    MotionEvent.ACTION_MOVE->{
//                        val dx = abs(event.x - initialX)
//                        val dy = abs(event.y - initialY)
//                        if (dx > touchSlop || dy > touchSlop){
                           parent.requestDisallowInterceptTouchEvent(true)//禁止父容器拦截事件
//                            animate().cancel()//正在滑动取消动画效果
//                            scaleX = 1f
//                            scaleY = 1f
//                        }
//                    }
                    MotionEvent.ACTION_UP->{
                        animate().scaleX(1f).scaleY(1f).setDuration(duration).start()
                        performClick()
                        onTouchListener?.onShrinkTouch()

                    }
                    MotionEvent.ACTION_CANCEL ->{
                        animate().scaleX(1f).scaleY(1f).setDuration(duration).start()
                        performClick()
                    }


                }
                false //传递给子容器
            }
        }

    override fun performClick(): Boolean {
        return super.performClick()
    }

    fun setOnTouchListener(onTouchListener: OnTouchListener){
        this.onTouchListener = onTouchListener
    }
    interface OnTouchListener{
        fun onShrinkTouch()

    }
}

好了,那很长了🤮。

我们来一个个分析,这个我自己写了一个点击事件监听接口放在了这里面,在playmusicfragment中实现了此接口。这些还都不重要,接着看😇

我继承了约束布局,因为我喜欢用这个,性能比较好,不会有太多嵌套😋。

然后,缩放动画,老演员了,scale X,Y表示宽和高各自缩小到原来的多少。

最重要的来了,触摸事件,当然,我写得并不好并且借助了ai,这没什么可耻的毕竟是学习项目嘛,而且ai辅助开发也算是趋势了🥹。

这initxy啥的我都注释了,ai生成的没啥用感觉。在摁下去的时候,也就是dawn,只有一个缩小的动画,其实这里没改写好,perform Click这里可能因为有这个我滑动的时候才会一直触发点_吧(这里省略一字),还请大佬指点啦。

其实这几个action主要是对缩放进行了处理,然后事件分发到子view让他们也知道该缩小还是放大,你复制到IDE就知道怎么个事了,当时ai写的啥也不是,不如自己写🥲

好啦,如果觉得主包写的还不错可以给个关注嘞😋。

 

 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词