我有一个阴影的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();
奇怪的是,当我将图像添加到布局中并给它一个负边距时,它就不会显示出来,就像切断布局边界之外的任何东西一样。
有解决方法吗?
答案 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());
}