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