所以,我有一个包含 aButton
和ImageView
. 当您按下按钮时,ImageView 应该从按钮中滑出,就像我刚刚拉下卷帘一样(将其下方的其他视图向下滑动)。基本上如下图所示。当您再次按下按钮时,ImageView 应该与 gif 不同,再次平滑动画。
.
使用这个 SO question,我设法将高度从 0 设置为全尺寸,但方向错误。我将 scaleType 设置为“Matrix”,设置高度时的默认行为是从上到下显示部分到 [height]。
对于动画,我需要相反的。因此,如果我将高度设置为 50dp,它将显示底部 50dp。然后我可以在 ImageView 显示的同时向下移动它,从而产生卷帘效果。
我查看了所有不同的布局和视图选项,但没有发现似乎可以做到这一点。所以我猜我需要指定转换矩阵。我查看了 android.graphics.Matrix 类,但它对我来说有点但太复杂了。我根本不知道如何使用它。
如果有另一种更简单的方法来做到这一点,那就太棒了,但如果没有,那么我真的需要矩阵方面的帮助。
我还包括这里的代码:
滚动视图 XML
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/sliding_accordion"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:src="@drawable/acc_image"
android:contentDescription="@string/accord"
android:scaleType="matrix"
android:layout_below="@+id/acc_button"
android:layout_marginTop="-10dp"
android:layout_centerHorizontal="true"/>
<Button
android:id="@+id/acc_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
代码中的实现。
(注意,MyCustomAnimation 类是此处找到的类的复制粘贴版本)
//Called from all constructors
private void create()
{
final Context context = getContext();
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
RelativeLayout layout = (RelativeLayout) inflater.inflate(R.layout.widget_accordion, this, false);
final Button theButton = (Button) layout.findViewById(R.id.topic_button);
final ImageView accordionView = (ImageView) layout.findViewById(R.id.sliding_accordion);
accordionView.setVisibility(INVISIBLE);
theButton.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
if (accordionView.getVisibility() == View.VISIBLE)
{
MyCustomAnimation a = new MyCustomAnimation(accordionView, 1000, MyCustomAnimation.COLLAPSE);
height = a.getHeight();
accordionView.startAnimation(a);
}
else
{
MyCustomAnimation a = new MyCustomAnimation(accordionView, 1000, MyCustomAnimation.EXPAND);
a.setHeight(height);
accordionView.startAnimation(a);
}
}
});
this.addView(layout);
}