在父母之外去的时候Android视图消失了

时间:2013-08-05 00:19:13

标签: java android animation android-animation

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

ImageView有一个翻译效果。

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

动画正在工作,但当ImageView超出LinearLayout时,它正在消失。

您可以在此处查看问题:http://screenr.com/zoAH

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

6 个答案:

答案 0 :(得分:78)

找到ImageView所属的ViewGroup并应用ViewGroup.setClipChildren(false)。 默认情况下,子项的绘制仅限于父ViewGroup的边界。

答案 1 :(得分:74)

存在两个可能导致此情况发生的属性:clipChildren和clipToPadding。对于每个父ViewGroup,您需要将clipChildren设置为false,该ViewGroup将对象进行动画处理。你还需要将clipToPadding设置为直接父级(也许更多,但我还没有看到它的情况)。

您可以在XML

中设置这两个属性
android:clipChildren="false"
android:clipToPadding="false"

或代码

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

答案 2 :(得分:15)

我的实施。它可能对某人有所帮助:

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.setClipChildren(enabled);
        parent.setClipToPadding(enabled);
        parent = parent.parent
    }
}

致电:yourView.setAllParentsClip(false)

答案 3 :(得分:1)

在我的情况下,clipChildren除了clipToPadding="false"解决了问题之外什么也没做。去图。

答案 4 :(得分: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);
}

答案 5 :(得分: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();