在我的应用程序中,我试图使用动画移动图像。
当我尝试将图像(imageView2
或imageView4
)设置为imageView1
时,图像在移出布局时会切割。
源图像为imageView2
或imageView4
,目标图片为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);
}
});
答案 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
。