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

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

相关推荐
黄雪超4 分钟前
JVM——JVM中的字节码:解码Java跨平台的核心引擎
java·开发语言·jvm
hiii4 分钟前
【ART 内存管理】堆内存分布与分配
android
wangfenglei1234568 分钟前
idea不识别lombok---实体类报没有getter方法
java·ide·intellij-idea
张风捷特烈10 分钟前
每日一题 Flutter#3 | 说说 Widget 的派生体系
android·flutter·面试
烬奇小云11 分钟前
怎么通过 jvmti 去 hook java 层函数
java·开发语言
m0_7482453415 分钟前
SpringAI集成DeepSeek实战
java
程序员岳焱34 分钟前
15.Java 泛型编程:类型安全与代码复用
java·后端·编程语言
天天摸鱼的java工程师40 分钟前
摸鱼学 Spring:Bean 的生命周期,面试官为啥总揪着问?
java·后端·面试
比特森林探险记40 分钟前
MySQL 时间类型与 Java 日期时间类对应关系详解
java·后端
冰糖葫芦三剑客42 分钟前
Android Studio 打包时遇到了签名报错问题:Invalid keystore format
android·ide·android studio