You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ConstraintLayout中用链实现单个View动画并设置current参数

如何实现图标列表的滑动触摸动画并设置current参数?

我想要实现图标列表滑动时,当前触摸到的图标高度变为400的View动画,该如何操作?我已有如下代码,但不知如何设置参数current?

动画逻辑说明

当用户手指在图标列表上滑动时,将当前触摸到的图标高度设置为400。

TransitionManager.beginDelayedTransition(layout); 
View child = layout.getChildAt(current); 
child.setMinimumHeight(400); 

其中current为int类型。


嘿,别担心,我来帮你搞定current参数的设置问题!核心思路是通过触摸事件监听,根据触摸坐标计算出当前触摸到的子View索引,具体操作步骤和代码如下:

步骤1:给图标列表添加触摸监听

你需要给承载图标的layout(也就是你的ViewGroup容器)设置OnTouchListener,在触摸事件里判断当前触摸点落在哪个子View上。

步骤2:实现触摸逻辑计算current

这里假设你的图标列表是垂直排列的,如果是水平排列,只需要把Y坐标换成X坐标,判断条件换成左右边界即可:

// 假设layout是你的图标列表容器(比如LinearLayout)
layout.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        // 处理按下和滑动事件
        if (event.getAction() == MotionEvent.ACTION_DOWN || event.getAction() == MotionEvent.ACTION_MOVE) {
            float touchY = event.getY();
            int childCount = layout.getChildCount();
            int current = -1;

            // 遍历所有子View,找到触摸点所在的那个
            for (int i = 0; i < childCount; i++) {
                View child = layout.getChildAt(i);
                int[] childLocation = new int[2];
                child.getLocationOnScreen(childLocation);
                int childTop = childLocation[1];
                int childBottom = childTop + child.getHeight();

                // 判断触摸点是否在当前子View的范围内
                if (touchY >= childTop && touchY <= childBottom) {
                    current = i;
                    break;
                }
            }

            // 如果找到有效的current,执行动画
            if (current != -1) {
                TransitionManager.beginDelayedTransition(layout);
                
                // 先把其他子View恢复默认高度(记得替换成你的默认值,比如100)
                for (int i = 0; i < childCount; i++) {
                    View child = layout.getChildAt(i);
                    if (i != current) {
                        child.setMinimumHeight(100);
                    }
                }
                
                // 设置当前触摸的子View高度为400
                View targetChild = layout.getChildAt(current);
                targetChild.setMinimumHeight(400);
            }
            return true;
        }
        // 可选:处理抬手事件,比如保持选中状态或恢复所有图标
        else if (event.getAction() == MotionEvent.ACTION_UP) {
            // 这里可以添加你需要的逻辑,比如保持当前选中的图标高度
            return true;
        }
        return false;
    }
});

补充说明

  • 如果是水平列表:将event.getY()改为event.getX(),判断条件换成子View的childLeft和childRight(通过child.getLeft()和child.getRight()获取)
  • 别忘了给子View设置默认的minimumHeight,这样切换触摸目标时,之前的图标才能恢复原状
  • 如果用的是RecyclerView,逻辑类似,但可以结合RecyclerView.OnItemTouchListener来更精准地处理触摸事件

内容的提问来源于stack exchange,提问作者Kavin Raju S

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:38:44