web-dev-qa-db-fra.com

clipChildren ne fonctionne pas

Dans mon application, j'essaie de déplacer des images à l'aide de l'animation . Lorsque j'essaie d'animer l'image (imageView2 ou imageView4) en imageView1, l'image est en train d'être coupée lorsqu'elle se déplace hors de la mise en page . Ici l'image source est imageView2 ou imageView4 et l'image de destination est imageView1

Ci-dessous mon 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>

Et le code d'animation est ci-dessous:

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);
                }
            });
20
Vamshi

L'un des parents de votre RelativeLayout peut être un enfant découpé (des bibliothèques de compatibilité ajoutent parfois un ViewGroup mystère tel que NoSaveStateFrameLayout par exemple). J'ai utilisé quelque chose comme cela dans le passé avec succès pour désactiver le clip sur tous les parents d'une vue:

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());
    }
}
31
roflharrison

La dernière raison est "RelativeLayout" . Donc, pour le résoudre, n'utilisez pas RelativeLayout en tant que parent de votre contrôle plus grand que parent. FrameLayout à la place, comme:

<!-- 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>
9
Xavier.S

je sais qu'il est tard, mais c'est la réponse complète la plus simple:

il suffit de mettre sur chaque mise en page:

    Android:clipChildren="false"
    Android:clipToPadding="false"
3
mhdjazmati

Bonjour ~ Si votre mise en page comporte des balises "paddingXXX", vous pouvez les supprimer et essayer à nouveau. c'est un travail pour moi ~

<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">

le code ci-dessus va découper childView et pas encore:

<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">
1
Yun.Lu

L'idée de @roflharrison est assez bonne, cependant, les codes ont un problème: Ici, nous désactivons clipChildren de manière récursive, mais lorsque nous avons atteint la vue racine, sa fonction v.getParents() est nulle, la méthode retourne immédiatement et son attribut ClipChildren est ne pas être désactivé.

De plus, pour la ligne suivante: 

if (v.getParent() instanceof View)

?? Le parent de la vue ne doit-il pas être un ViewGroup? Et ne devrions-nous pas désactiver les attributs de clip de ViewGroup, pas ceux de View? J'ai donc modifié le code comme suit, et cela a très bien fonctionné:

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