clearAnimation()解决setVisibility()无效问题

在Android开发中遇到一个view在动画后无法正确隐藏的问题,通过调用clearAnimation()解决了setVisibility(INVISIBLE)无效的情况。文章探讨了动画结束时setFillAfter(true)导致的问题,并解释了clearAnimation()的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

跟甜同学一起搞一个退场动画,第一次播放没问题,第二次播放就发现有个view会先闪出来一下,然后再执行从0到1的alpha动画。但是代码里明明已经用setVisibility(INVISIBLE)隐藏这个view了,为什么没有生效呢?Google了一下,有人说要调一下clearAnimation(),试了一下果然好了。。。

那么为什么加上这句就好了呢?得去看看framework的代码了,首先看一下View的clearAnimation():

    public void clearAnimation() {
        if (mCurrentAnimation != null) {
            mCurrentAnimation.detach();
        }
        mCurrentAnimation = null;
        invalidateParentIfNeeded();
    }
主要就是把mCurrentAnimation这个变量置空。这个变量是protected类型的,外面使用的话要通过getAnimation()这个接口:

    public Animation getAnimation() {
        return mCurrentAnimation;
    }
搜了一下发现ViewGroup的dispatchDraw()里用到了这个方法来判断是否要drawChild(),如果getAnimation()不为空,即使mViewFlags不是VISIBLE也要画:

    protected void dispatchDraw(Canvas canvas) {
        ... ...
        if ((flags & FLAG_USE_CHILD_DRAWING_ORDER) == 0) {
      
完整的preference /* * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the specific language governing * permissions and limitations under the License. */ package com.android.settings.datausage; import android.content.Context; import android.util.AttributeSet; import androidx.preference.Preference; import com.android.settings.R; public class DataSaverPreference extends Preference implements DataSaverBackend.Listener { private final DataSaverBackend mDataSaverBackend; public DataSaverPreference(Context context, AttributeSet attrs) { super(context, attrs); mDataSaverBackend = new DataSaverBackend(context); } @Override public void onAttached() { super.onAttached(); mDataSaverBackend.addListener(this); } @Override public void onDetached() { super.onDetached(); mDataSaverBackend.remListener(this); } @Override public void onDataSaverChanged(boolean isDataSaving) { setSummary(isDataSaving ? R.string.data_saver_on : R.string.data_saver_off); } @Override public void onWhitelistStatusChanged(int uid, boolean isWhitelisted) { } @Override public void onBlacklistStatusChanged(int uid, boolean isBlacklisted) { } } 如何setVisible(false)
最新发布
08-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值