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

Android长按RepeatListener按钮时无闪烁切换View背景色方案

解决方案

1. 移除闪烁根源:重复切换背景的逻辑

先排查原有RepeatListener的实现,删掉其中定时循环切换solar_1和solar_2的代码——这正是长按期间闪烁的原因。

2. 重构长按回调逻辑

在长按启动时一次性设置solar_2背景,按钮松开/触摸取消时立刻恢复原背景(solar_1),避免重复切换。

示例代码修改

假设原有代码是这样的:

// 原有导致闪烁的代码
button.setOnTouchListener(new RepeatListener(1000, 500, new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // 循环切换背景,引发闪烁
        if (gameEventRectangle.getBackground().getConstantState().equals(
            getResources().getDrawable(R.drawable.game_event_rectangle_solar_1).getConstantState())) {
            gameEventRectangle.setBackgroundResource(R.drawable.game_event_rectangle_solar_2);
        } else {
            gameEventRectangle.setBackgroundResource(R.drawable.game_event_rectangle_solar_1);
        }
    }
}));

修改为:

// 定义背景常量
private final int ORIGINAL_BG = R.drawable.game_event_rectangle_solar_1;
private final int LONG_PRESS_BG = R.drawable.game_event_rectangle_solar_2;

button.setOnTouchListener(new RepeatListener(1000, 500, new View.OnClickListener() {
    private boolean pressActive = false;

    @Override
    public void onClick(View v) {
        // 仅在长按启动时设置一次背景
        if (!pressActive) {
            gameEventRectangle.setBackgroundResource(LONG_PRESS_BG);
            pressActive = true;
        }
        // 此处保留长按需要执行的其他逻辑(如移动加速等)
    }
}) {
    // 重写触摸事件处理松开/取消动作
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        boolean result = super.onTouch(v, event);
        if (event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL) {
            // 恢复原背景并重置标记
            gameEventRectangle.setBackgroundResource(ORIGINAL_BG);
            this.pressActive = false;
        }
        return result;
    }
});

3. 避免动画与背景切换冲突

如果View_Game_Event_Rectangle存在移动动画,为防止背景切换时出现不必要的重绘闪烁,可在设置背景时添加:

gameEventRectangle.setHasTransientState(true);
gameEventRectangle.setBackgroundResource(targetBgRes);
gameEventRectangle.setHasTransientState(false);

4. 校验RepeatListener的触发逻辑

确保RepeatListener的onRepeat仅在长按启动时触发一次背景设置,后续重复回调只处理游戏逻辑(如移动加速),不再触碰背景切换。


内容的提问来源于stack exchange,提问作者VanessaF

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 19:57:09