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
相关产品推荐
相关产品推荐

