2014-04-08 18 views
19

W mojej aplikacji próbuję przenosić obrazy za pomocą animacji. Kiedy próbuję animowanie obrazu (imageView2 lub imageView4) do imageView1 obraz kroi, gdy porusza się z układu. Tutaj źródłem obrazu jest imageView2 lub imageView4 i docelowy obraz jest imageView1clipChildren nie działa

Poniżej jest mój 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> 

i kod animacji poniżej:

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

Odpowiedz

28

Jeden z rodziców swojej RelativeLayout może przycinaj dzieci (czasami biblioteki kompatybilności dodają na przykład tajemniczą grupę ViewGroup, taką jak NoSaveStateFrameLayout). Użyłem coś takiego w przeszłości z sukcesem wyłączyć klip na wszystkich rodziców widoku:

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

Próbowałem, ale nie działa ... – Vamshi

+1

To zadziałało dla mnie, dziękuję za odpowiedź! Wygląda na to, że niektóre widoki są dodawane, gdy dołączasz układ i to było przyczyną problemu. – shalafi

+0

pracował dla mnie. smutny musiałem użyć tego :( – Sam

7

Ostatnim powodem jest „RelativeLayout”. Aby go rozwiązać, nie używaj RelativeLayout jako rodzica kontroli Większego niż nadrzędnego. FrameLayout zamiast, jak:

<!-- 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> 
1

Witam ~ jeśli twój układ zawiera tagi "paddingXXX", możesz je usunąć i spróbować ponownie. to jest praca dla mnie ~

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

powyżej będzie clip childView i następny nie będzie:

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

wiem jego późno, ale jest to najprostszy pełna odpowiedź:

wystarczy umieścić na każdym układ:

android:clipChildren="false" 
    android:clipToPadding="false" 
+0

Jak wyjaśniono w mojej odpowiedzi, nie będzie to działać w przypadkach, gdy system operacyjny zawija/wstrzykuje widok w ViewGroup, którego nie ma w twoim układzie. – roflharrison

+0

Tak To prawda – mhdjazmati