当移出父视图时,Android视图消失

68

我有一个LinearLayout,在这个LinearLayout中有一个ImageView。

ImageView有一个翻译效果。

// v = ImageView    
ObjectAnimator animation2 = ObjectAnimator.ofFloat(v, "translationY", 200);
                        animation2.setDuration(3000);
                        animation2.setTarget(v);
                        animation2.start();

动画正常,但是ImageView超出了LinearLayout的范围后它就消失了。

我如何在不修改LinearLayout高度的情况下修复它。

6个回答

89

找到 ImageView 所在的 ViewGroup,并应用 ViewGroup.setClipChildren(false)。默认情况下,子元素的绘制被限制在父 ViewGroup 的边界内。


5
тюеXMLСИГУ«Йуй«LinearLayoutуџёandroid:clipChildren="false"№╝їСйєТ▓АТюЅС╗╗СйЋтЈўтїќ№╝Ъ - Eray
60
我已将clipChildren="false"应用到所有ImageView的父级(即LinearLayout的父级)中,并且它已经生效了。谢谢。 - Eray
6
如果你还没有向下滚动,可以看一下下面Maxwell的回答。同时也要将 android:clipToPadding="false"设置为真。 - Darpan
@Eray:我们能处理那个ImageView上的点击吗? - Mehul Joisar
1
你可能需要为不仅是直接父ViewGroup,而且是层次结构中的其他ViewGroups设置剪辑子元素。 - RajV
显示剩余4条评论

80

有两个属性可能会导致此情况发生:clipChildren和clipToPadding。需要为每个父ViewGroup将clipChildren设置为false,因为该对象将从其边界动画退出。您还需要将clipToPadding设置为直接父级(也许更多,但我还没有看到这种情况)。

您可以在XML中设置这两个属性。

android:clipChildren="false"
android:clipToPadding="false"

或者在代码中

viewGroup.setClipChildren(false);
viewGroup.setClipToPadding(false);

3
我个人不得不在每个父级上将 clipToPadding 设置为 false。很奇怪。 - Renaud Cerrato
9
每个父级ViewGroup都非常重要!感谢这个答案。 - Justin Pollard
这非常有帮助。谢谢伙计! - Wahib Ul Haq
没错!1)对于每个父视图,将**clipChildren设置为false,其边界包含该视图。2)对于直接父视图,将clipToPadding**设置为false。但是对于RelativeLayout仍然不起作用,我已经尝试过了。请参见此处 - Mir-Ismaili

16

我的实现。它可能会帮助到某些人:

Java版本:

public static void setAllParentsClip(View v, boolean enabled) {
    while (v.getParent() != null && v.getParent() instanceof ViewGroup) {
        ViewGroup viewGroup = (ViewGroup) v.getParent();
        viewGroup.setClipChildren(enabled);
        viewGroup.setClipToPadding(enabled);
        v = viewGroup;
    }
}

调用setAllParentsClip(yourView, false);可以禁用所有父级中的裁剪。

编辑:

Kotlin版本的扩展函数:

fun View.setAllParentsClip(enabled: Boolean) {
    var parent = parent
    while (parent is ViewGroup) {
        parent.clipChildren = enabled
        parent.clipToPadding = enabled
        parent = parent.parent
    }
}

调用:yourView.setAllParentsClip(false)


你确定你将setAllParentsClip(yourView, false);应用于正确的视图吗?你确定你面临的问题与所问的问题相同吗?很抱歉,但我真的不知道为什么它对你不起作用? - ahmed_khan_89

1
获取视图高度,然后添加一个百分比的高度到它滑动到的位置
public void SlideUp(View view){
     float height = view.getHeight();

     TranslateAnimation animate = new TranslateAnimation(0,0,0,0);   

     animate.setDuration(500);
     animate.setFillAfter(true);

     view.animate().translationY((float)(0-0.62*height)).start(); 
     view.startAnimation(animate);
}

1
在我的情况下,clipChildren 没有起作用,但是 clipToPadding="false" 解决了问题。你猜怎么着。

0
try to update camera position as in my case below:
 ValueAnimator lockAnimator = ValueAnimator.ofFloat(1, 0);     // value from 0 to 1
                lockAnimator.setDuration(500);
                lockAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                    @Override
                    public void onAnimationUpdate(ValueAnimator pAnimation) {
                        float value = (Float) (pAnimation.getAnimatedValue());
                        if (value < .6 && flipped) {
                            if (preview != null)
                                mCanvasImage.setImageBitmap(preview);
                            else
                                mCanvasImage.setImageBitmap(imageBitmap);
                            flipped = false;
                        }
                        if (value > .3 && value < .7) {
                            lyt_rlt_container.setCameraDistance(lyt_rlt_container.getCameraDistance() - 100);
                        } else {
                            lyt_rlt_container.setCameraDistance(lyt_rlt_container.getCameraDistance() + 100);
                        }
                        lyt_rlt_container.setRotationY(180 * value);

                    }
                });
                lockAnimator.start();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接