clipChildren无法正常工作

时间:2014-04-08 07:41:35

标签: android animation

在我的应用程序中,我试图使用动画移动图像。 当我尝试将图像(imageView2imageView4)设置为imageView1时,图像在移出布局时会切割。 源图像为imageView2imageView4,目标图片为imageView1

以下是我的XML:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/animRL"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:clipChildren="false"
    android:clipToPadding="false"
    android:orientation="vertical" >

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="40dp"
        android:layout_height="60dp"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:src="@drawable/deskcard" />

    <RelativeLayout
        android:id="@+id/baselayout"
        android:layout_width="match_parent"
        android:layout_height="120dp"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/imageView1"
        android:clipChildren="false"
        android:clipToPadding="false" >

        <RelativeLayout
            android:id="@+id/layout"
            android:layout_width="match_parent"
            android:layout_height="100dp"
            android:layout_alignParentBottom="true"
            android:layout_centerHorizontal="true"
            android:layout_marginBottom="5dp"
            android:clipChildren="false"
            android:clipToPadding="false"
            android:gravity="bottom|center" >

            <ImageView
                android:id="@+id/imageView2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentLeft="true"
                android:layout_alignTop="@+id/imageView4"
                android:layout_marginLeft="118dp"
                android:clipChildren="false"
                android:clipToPadding="false"
                android:src="@drawable/test" />

            <ImageView
                android:id="@+id/imageView4"
                android:layout_width="40dp"
                android:layout_height="60dp"
                android:layout_alignParentBottom="true"
                android:layout_alignParentRight="true"
                android:layout_marginBottom="16dp"
                android:layout_marginRight="104dp"
                android:clipChildren="false"
                android:clipToPadding="false"
                android:src="@drawable/test1" />
        </RelativeLayout>
    </RelativeLayout>


</RelativeLayout>

动画代码如下:

imageView4.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                     int sourceCoords[] = new int[2];
                        int targetCoords[] = new int[2];
                        int xDelta;
                        int yDelta;
                        imageView4.getLocationOnScreen(sourceCoords);
                        image.getLocationOnScreen(targetCoords);
                        xDelta = targetCoords[0] - sourceCoords[0];
                        yDelta = targetCoords[1] - sourceCoords[1];

                    TranslateAnimation animation = new TranslateAnimation(0, xDelta, 0, yDelta);
                    animation.setDuration(400);
                    animation.setFillAfter(false);
                    animation.setAnimationListener(new MyAnimationListener());

                    imageView4.startAnimation(animation);
                }
            });

6 个答案:

答案 0 :(得分:31)

您的RelativeLayout的父母之一可能是剪辑儿童(有时兼容性库会添加一个神秘的ViewGroup,例如NoSaveStateFrameLayout)。我过去曾经使用过这样的东西,成功禁用视图的所有父母的剪辑:

public void disableClipOnParents(View v) {
    if (v.getParent() == null) {
        return;
    }

    if (v instanceof ViewGroup) {
        ((ViewGroup) v).setClipChildren(false);
    }

    if (v.getParent() instanceof View) {
        disableClipOnParents((View) v.getParent());
    }
}

答案 1 :(得分:9)

最后一个原因是“RelativeLayout”。 因此,要解决此问题,请不要将RelativeLayout用作比父控件更大的父控件。相反,FrameLayout,如:

<!-- it's ok as grand parent -->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:clipChildren="false">

    <!-- parent must not be a RelativeLayout -->
    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="38dp"
        android:layout_alignParentBottom="true"
        android:layout_marginBottom="9dp">

        <!-- Your Larger-than-parent View -->
        <View
            android:layout_width="56dp"
            android:layout_height="138dp"
            android:layout_gravity="center"
            android:background="@android:color/black" />

    </FrameLayout>

</RelativeLayout>

答案 2 :(得分:7)

我知道它已经很晚了,但这是最简单的完整答案:

只是放在每个布局上:

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

答案 3 :(得分:1)

嗨〜如果您的布局包含&#34; paddingXXX&#34;标签,您可以删除它们并重试。它为我工作〜

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clipChildren="false"
    android:gravity="center_vertical"
    android:padding="8dp"
    android:orientation="horizontal">

上面的代码将剪辑childView,接下来不会:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clipChildren="false"
    android:gravity="center_vertical"
    android:orientation="horizontal">

答案 4 :(得分:0)

@roflharrison的想法很好,但是,代码有一些问题: 这里我们递归地禁用clipChildren,但是当我们到达根视图时,它的v.getParents()为空,该方法立即返回,并且不会禁用其ClipChildren属性。

此外,针对以下行:

if (v.getParent() instanceof View)

??视图的父级不应该是ViewGroup吗?我们不应该禁用ViewGroup的clip属性,而不是View的属性吗?因此,我将代码更改为以下代码,并且效果很好:

public void disableClipOnParents(View v) {
    if (v == null) {
        return;
    }
    if (v instanceof ViewGroup) {
        ((ViewGroup) v).setClipChildren(false);
    }
    disableClipOnParents((View) v.getParent());
}

答案 5 :(得分:0)

就我而言,clipChildren=false 不起作用,因为我还在我的代码中在父项上设置了 clipToOutline = true。这个属性导致孩子被剪裁在父母的轮廓中,在我的例子中是父母背景的轮廓。似乎 clipToOutline 的优先级高于 clipChildren=false

如果 clipChildren=false 对您不起作用,请确保您没有在代码中设置 clipToOutline=true