Android设置View.INVISIBLE后LinearLayout动画失效问题求助
解决LinearLayout设为INVISIBLE后动画无法重新播放的问题
我完全懂你遇到的糟心事——把LinearLayout设为INVISIBLE后,再次点击按钮显示它时,动画直接“罢工”,哪怕调用了clearAnimation()也不管用。咱们来拆解代码里的问题,一步步搞定它。
先揪出代码里的几个关键问题
- 拼写错误导致方法无效:你写的
l2.clearanimation()是错的,正确的方法名是clearAnimation()(注意A是大写),这个错误直接导致清除动画的逻辑根本没执行。 - 动画设置与启动顺序混乱:你先调用
l2.setAnimation(downtoup),紧接着就清除动画,等于刚给View绑定动画就直接删掉,动画根本没机会运行。而且setAnimation()只是绑定动画,不会主动触发播放,得用startAnimation()才对。 - INVISIBLE状态的动画残留:直接把View设为INVISIBLE时,动画的状态并没有被完全重置,下次显示时旧的动画状态会干扰新动画的启动。
修正后的完整代码示例
// 把动画变量定义在类里,避免每次点击重复加载(优化性能) private Animation downtoup; private LinearLayout l2; private long back_pressed; private static final long TIME_DELAY = 2000; // 自定义返回键延迟时间,按需调整 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.your_layout_id); // 替换成你的布局ID l2 = findViewById(R.id.lnrlgn1); l2.setVisibility(View.INVISIBLE); // 加载动画资源(确保R.anim.downtoup是你实际的动画文件) downtoup = AnimationUtils.loadAnimation(this, R.anim.downtoup); viewcrrd.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 1. 先清除之前残留的动画状态 l2.clearAnimation(); // 2. 先把View设为可见,不可见的View动画不会执行 l2.setVisibility(View.VISIBLE); // 3. 启动动画(用startAnimation替代setAnimation) l2.startAnimation(downtoup); } }); } @Override public void onBackPressed() { if (back_pressed + TIME_DELAY > System.currentTimeMillis()) { Exitdlg alert = new Exitdlg(); alert.showDialog(LoginActivity.this, "Are You Sure "); } else { // 先清除动画,避免状态残留 l2.clearAnimation(); // 如果你想让隐藏也有动画,可以加个监听器,动画结束后再隐藏 downtoup.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) {} @Override public void onAnimationEnd(Animation animation) { l2.setVisibility(View.INVISIBLE); } @Override public void onAnimationRepeat(Animation animation) {} }); // 如果不需要隐藏动画,直接设置INVISIBLE即可: // l2.setVisibility(View.INVISIBLE); } back_pressed = System.currentTimeMillis(); }
额外优化建议
如果还是遇到动画不生效的情况,可以尝试每次点击按钮时重新加载动画实例——因为动画对象是带状态的,播放过一次后可能需要重置:
@Override public void onClick(View v) { l2.clearAnimation(); l2.setVisibility(View.VISIBLE); // 每次点击都加载新的动画实例,确保状态干净 Animation freshAnimation = AnimationUtils.loadAnimation(LoginActivity.this, R.anim.downtoup); l2.startAnimation(freshAnimation); }
内容的提问来源于stack exchange,提问作者user9427911
相关产品推荐
相关产品推荐

