机缘
因公司需要开发密集架相关项目,涉及相关项目需求设计,市场上并未有相关动画效果流出,基于设计开发相关需求
多列密集架情况:
- 密集架固定列在最左侧
- 密集架固定列在最右侧
- 密集架固定列在最中间
收获
最终完成初步效果
实例展示:
android密集架移动效果
部分核心代码
- 基于需求的复杂性 内部设计是否开启柜体动画,若不开启则直接与硬件通信
- 密集架向左移动核心代码:
fun moveToLeft(clickedIndex: Int){if (isAnimation){if (isAir){Log.e("TAG","正在通风不可移动")Toast.makeText(this,"正在通风不可移动",Toast.LENGTH_SHORT).show()return}if (clickedIndex==fixRow){Log.e("TAG","固定列不可移动")Toast.makeText(this,"固定列不可移动",Toast.LENGTH_SHORT).show()return}isStop = falsemBinding.stopTv.text = "停止"val childCount = mBinding.llOut?.childCount ?: 0if (fixRow==0) { // 固定列在最左侧var beginIndex = -1for (i in 1 until childCount){var rowBean = allBeans[i]if (rowBean.currentX==rowBean.destX||rowBean.currentX==rowBean.middleX||rowBean.currentX!=rowBean.rawX){ //说明已经移动到位beginIndex = ibreak}}if (beginIndex==-1){Log.e("TAG","没有向右移动过不可向左移动")return}var delay: Long = 0 // 初始延迟时间cancleAllAnimation()for (i in beginIndex..clickedIndex){var view = mBinding.llOut?.getChildAt(i)var rowBean = allBeans[i]var viewx = view!!.xif (viewx==rowBean.rawX){ //说明已经移回原位continue}allAnimation[i] = ValueAnimator.ofInt(rowBean.currentX.toInt(), rowBean.rawX.toInt())allAnimation[i]?.startDelay = delayallAnimation[i]?.duration = moveTimeallAnimation[i]?.addUpdateListener { animation ->val currentValue = animation.animatedValue as Int// 更新视图的左边距,实现平移动画view?.layout(currentValue.toInt(), view.top, (currentValue + view.width).toInt(), view.bottom)// 更新当前 x 坐标rowBean.currentX = view.left.toFloat()Log.e("TAG", "固定列在最左侧 向左移动 实时更新获取当前 view 对象 x 坐标:${rowBean.currentX} view 左边距 ${view.left}")}allAnimation[i]?.start()delay+=delayAddTime}}else if (fixRow==childCount-1){ // 固定列在最右侧var delay: Long = 0 // 初始延迟时间cancleAllAnimation()