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写的啥也不是,不如自己写🥲

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

相关推荐
zh_xuan26 分钟前
Android Looper源码阅读
android
坐吃山猪2 小时前
SpringBoot01-配置文件
java·开发语言
我叫汪枫2 小时前
《Java餐厅的待客之道:BIO, NIO, AIO三种服务模式的进化》
java·开发语言·nio
yaoxtao3 小时前
java.nio.file.InvalidPathException异常
java·linux·ubuntu
Swift社区4 小时前
从 JDK 1.8 切换到 JDK 21 时遇到 NoProviderFoundException 该如何解决?
java·开发语言
DKPT5 小时前
JVM中如何调优新生代和老生代?
java·jvm·笔记·学习·spring
phltxy5 小时前
JVM——Java虚拟机学习
java·jvm·学习
seabirdssss6 小时前
使用Spring Boot DevTools快速重启功能
java·spring boot·后端
喂完待续7 小时前
【序列晋升】29 Spring Cloud Task 微服务架构下的轻量级任务调度框架
java·spring·spring cloud·云原生·架构·big data·序列晋升