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 高度的情况下修复它。

4

6 回答 6

89

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

于 2013-08-05T01:15:19.230 回答
80

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

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

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

或在代码中

viewGroup.setClipChildren(false);
viewGroup.setClipToPadding(false);
于 2013-09-13T15:58:38.053 回答
16

我的实现。它可能可以帮助某人:

爪哇版:

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)

于 2016-03-24T16:29:59.060 回答
1

就我而言,clipChildren 什么也没做,只是clipToPadding="false"解决了问题。去搞清楚。

于 2015-06-11T16:21:28.480 回答
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);
}
于 2018-01-26T10:53:34.900 回答
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();
于 2017-01-03T10:50:41.867 回答