在RelativeLayout底部的Android Shadow之外的界限

时间:2013-10-04 20:24:45

标签: android android-layout android-imageview android-image

我有一个阴影的9补丁图片,我想添加到RelativeLayout的底部。布局填满屏幕,但向上滑动然后用户点击一个按钮。因此,我希望阴影图像位于RelativeLayout下方(向下拉下一个负底边距),这样当布局朝上时,阴影位于布局的底部边缘,使其分层效果。

<ImageView
            android:id="@+id/shadow"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom"
            android:layout_marginBottom="-10dp"
            android:src="@drawable/shadow" />

我使用以下方式向上滑动框架

ObjectAnimator mover = ObjectAnimator.ofFloat(mainView, "translationY", !historyShown ? -ph : 0);
 mover.setDuration(300);
 mover.start();

奇怪的是,当我将图像添加到布局中并给它一个负边距时,它就不会显示出来,就像切断布局边界之外的任何东西一样。

有解决方法吗?

1 个答案:

答案 0 :(得分:0)

我可以想到一种方法,但我确信必须有一种更清洁的方式。

使mainView所在的布局成为FrameLayout(或RelativeLayout),并在其中包含ImageView,使其成为mainView的兄弟,但在mainView之前列出它。使用layout_gravity="bottom"将其设置在底部(如果使用RelativeLayout,则设置为layout_alignParentBottom="true"。)

现在将ObjectAnimator中的目标更改为mainView上方的内容(因此要么是容器View或Activity / Fragment),并将属性更改为类似“scrollUp”的内容,然后创建名为setScrollUp(float)的方法目标。在此方法中,使用setTranslationY()设置mainView和阴影的转换。以阴影高度偏移阴影。

在这里使用纯色的简单应用程序为我工作:

XML:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:background="#f00">

    <View
        android:id="@+id/shadow"
        android:layout_width="match_parent"
        android:layout_height="20px"
        android:layout_gravity="bottom"
        android:background="#00f"/>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#0f0"
        android:id="@+id/container"/>

</FrameLayout>

活动代码:

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    container = findViewById(R.id.container);
    shadow = findViewById(R.id.shadow);

    container.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(final View v)
        {
            final float translationTo = (open) ? 0 : -300;
            final float translationFrom = (open) ? -300 : 0;

            open = !open;

            ObjectAnimator anim = ObjectAnimator.ofFloat(MyActivity.this, "scrollUp", translationFrom, translationTo);
            anim.setDuration(500);
            anim.start();
        }
    });
}

public void setScrollUp(final float position)
{
    container.setTranslationY(position);
    shadow.setTranslationY(position + shadow.getHeight());
}