我有一个带有以下视图的CardView:
- RelativeLayout (view_1)
- TextView
- TextView
- RelativeLayout (view_2)
- ImageView
- ImageView
当我打开我的ListView view_2设置为Visible.GONE所以你无法看到它.
现在我使用了this blog的ExpandAnimation.这里有代码:
/**
*
*/
public class ExpandAnimation extends Animation {
/**
*
*/
private AnimationCallback callback = null;
/**
*
*/
private View viewToAnimate = null;
/**
*
*/
private RelativeLayout.LayoutParams viewToAnimateLayoutParams = null;
/**
*
*/
private int marginStart = 0;
/**
*
*/
private int marginEnd = 0;
/**
*
*/
private boolean isVisibleAfter = false;
/**
*
*/
private boolean isEndedAlready = false;
/**
*
* @param callback
* @param view
* @param duration
*/
public ExpandAnimation(AnimationCallback callback,View view,int duration) {
this.setDuration(duration);
this.callback = callback;
this.viewToAnimate = view;
this.viewToAnimateLayoutParams = (RelativeLayout.LayoutParams) view.getLayoutParams();
this.isVisibleAfter = (view.getVisibility() == View.VISIBLE);
this.marginStart = this.viewToAnimateLayoutParams.bottomMargin;
this.marginEnd = (this.marginStart == 0 ? (0 - view.getHeight()) : 0);
view.setVisibility(View.VISIBLE);
}
/**
*
* @param interpolatedTime
* @param transformation
*/
@Override
protected void applyTransformation(float interpolatedTime,Transformation transformation) {
super.applyTransformation(interpolatedTime,transformation);
if (interpolatedTime < 1.0f) {
this.viewToAnimateLayoutParams.bottomMargin = this.marginStart + (int) ((this.marginEnd - this.marginStart) * interpolatedTime);
this.viewToAnimate.requestLayout();
} else if (!this.isEndedAlready) {
this.viewToAnimateLayoutParams.bottomMargin = this.marginEnd;
this.viewToAnimate.requestLayout();
if (this.isVisibleAfter) {
this.viewToAnimate.setVisibility(View.GONE);
}
this.isEndedAlready = true;
this.callback.onAnimationCompleted(-1);
}
}
}
我在AdapterView中使用它:
public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener,AnimationCallback {
private TextView textViewValue = null;
private TextView textViewTime = null;
private RelativeLayout relativeLayoutExpand = null;
private ImageView imageViewMood = null;
private ImageView imageViewMeal = null;
public ViewHolder(View itemView) {
super(itemView);
this.textViewValue = (TextView) itemView.findViewById(R.id.textview_value);
this.textViewTime = (TextView) itemView.findViewById(R.id.textview_time);
this.relativeLayoutExpand = (RelativeLayout) itemView.findViewById(R.id.list_row_expand);
this.imageViewMood = (ImageView) itemView.findViewById(R.id.imageview_mood);
this.imageViewMeal = (ImageView) itemView.findViewById(R.id.imageview_meal);
itemView.setonClickListener(this);
}
@Override
public void onClick(View view) {
this.animate(this.relativeLayoutExpand);
}
public void animate(final View view) {
ExpandAnimation expand = new ExpandAnimation(this,view,500);
view.startAnimation(expand);
}
public void onAnimationCompleted(int position) {
}
}
我现在只有一个问题:当我在列表中展开一个项目时,它第一次立即出现而没有动画,之后关闭和打开动画顺利进行.
有人知道为什么第一次打开没有动画但是之后的每次点击都会触发正确的动画吗?
第一次点击我也需要动画.
编辑
是因为最初我的观点可见度是GONE,因此高度未知?如果是:我怎么能解决这个问题?
编辑2
不,我的XML布局文件没有将视图设置为GONE:
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginBottom="10dp">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<RelativeLayout
android:id="@+id/datatransfer_measure_list_row_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingEnd="10dp"
android:paddingStart="10dp"
android:paddingTop="10dp">
<TextView
android:id="@+id/datatransfer_measure_list_row_textview_value"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:lines="1"
android:maxLines="1"
android:singleLine="true"
android:text="@string/text_value"
android:textColor="@color/textcolorprimary"
android:textSize="30sp" />
<TextView
android:id="@+id/datatransfer_measure_list_row_textview_time"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/datatransfer_measure_list_row_textview_value"
android:layout_gravity="center"
android:layout_marginBottom="10dp"
android:gravity="start"
android:lines="1"
android:maxLines="1"
android:singleLine="true"
android:textColor="@color/textcolorprimary"
android:textSize="14sp" />
<ImageView
android:id="@+id/datatransfer_measure_list_row_imageview_expand"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentTop="true"
android:contentDescription="@string/text_description"
android:scaleType="fitCenter"
android:src="@drawable/ic_expand_more_black_24dp" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/datatransfer_measure_list_row_expand"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/datatransfer_measure_list_row_data"
android:background="@color/primaryColor"
android:paddingBottom="10dp"
android:paddingEnd="10dp"
android:paddingStart="10dp"
android:paddingTop="10dp">
<RelativeLayout
android:id="@+id/datatransfer_measure_list_row_mood"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_centerVertical="true"
android:lines="1"
android:maxLines="1"
android:singleLine="true"
android:text="@string/text_mood"
android:textColor="@color/textcolorsecundary"
android:textSize="30sp" />
<ImageView
android:id="@+id/datatransfer_measure_list_row_imageview_mood"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:contentDescription="@string/text_description"
android:scaleType="fitCenter" />
</RelativeLayout>
<ImageView
android:id="@+id/datatransfer_measure_list_row_imageview_meal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/datatransfer_measure_list_row_mood"
android:layout_centerInParent="true"
android:contentDescription="@string/text_description" />
</RelativeLayout>
</RelativeLayout>
</android.support.v7.widget.CardView>
我在listadapter中设置了View.GONE:
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder,int position) {
...
viewHolder.textViewTime.setText(time);
viewHolder.textViewValue.setText(value + " " + unitValue);
viewHolder.relativeLayoutExpand.setVisibility(View.GONE); // <-- HERE
...
}
编辑3
也许重要的是要知道我的cardviews的容器是Recyclerview:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/datatransfer_measure_list_textview_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:background="@color/primaryColorDark"
android:gravity="center"
android:padding="10dp"
android:textColor="@color/white"
android:textSize="18dp" />
<android.support.design.widget.CoordinatorLayout
android:id="@+id/datatransfer_measure_list_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/datatransfer_measure_list_textview_name">
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/datatransfer_measure_list_swipe_refresh_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/datatransfer_measure_list_row_parent"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:padding="10dp"
android:textColor="@color/textcolorprimary" />
</android.support.v4.widget.SwipeRefreshLayout>
<android.support.design.widget.FloatingActionButton
android:id="@+id/datatransfer_measure_list_floating_action_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="20dp"
android:layout_marginEnd="16dp"
android:clickable="true"
android:src="@drawable/ic_search_white_24dp"
app:backgroundTint="@color/primaryColorDark"
app:borderWidth="0dp"
app:elevation="6dp"
app:layout_anchor="@id/datatransfer_measure_list_row_parent"
app:layout_anchorGravity="bottom|right|end"
app:layout_behavior="de.hof.ime_dc.idia_move.views.buttons.ScrollFABBehavIoUr"
app:rippleColor="@color/accentColor" />
</android.support.design.widget.CoordinatorLayout>
</RelativeLayout>
我真的需要一个解决方案.它扰乱了许多所需的功能.
编辑4
我添加了一些日志输出:
=============================== EXPAND ========================================= 08-02 12:27:22.471 V/ExpandAnimation﹕ View is visible: 8 (GONE) 08-02 12:27:22.471 V/ExpandAnimation﹕ marginStart: 0 08-02 12:27:22.471 V/ExpandAnimation﹕ marginEnd: 0 08-02 12:27:22.472 V/ExpandAnimation﹕ View is visible: 0 (VISIBLE) ============================== COLLAPSE ======================================== 08-02 12:27:51.015 V/ExpandAnimation﹕ View is visible: 0 (VISIBLE) 08-02 12:27:51.015 V/ExpandAnimation﹕ marginStart: 0 08-02 12:27:51.015 V/ExpandAnimation﹕ marginEnd: -156 08-02 12:27:51.015 V/ExpandAnimation﹕ View is visible: 8 (GONE) =============================== EXPAND ========================================= 08-02 12:27:56.007 V/ExpandAnimation﹕ View is visible: 8 (GONE) 08-02 12:27:56.007 V/ExpandAnimation﹕ marginStart: -156 08-02 12:27:56.007 V/ExpandAnimation﹕ marginEnd: 0 08-02 12:27:56.008 V/ExpandAnimation﹕ View is visible: 0 (VISIBLE) ============================== COLLAPSE ======================================== 08-02 12:27:51.015 V/ExpandAnimation﹕ View is visible: 0 (VISIBLE) 08-02 12:27:51.015 V/ExpandAnimation﹕ marginStart: 0 08-02 12:27:51.015 V/ExpandAnimation﹕ marginEnd: -156 08-02 12:27:51.015 V/ExpandAnimation﹕ View is visible: 8 (GONE) =============================== EXPAND ========================================= 08-02 12:27:56.007 V/ExpandAnimation﹕ View is visible: 8 (GONE) 08-02 12:27:56.007 V/ExpandAnimation﹕ marginStart: -156 08-02 12:27:56.007 V/ExpandAnimation﹕ marginEnd: 0 08-02 12:27:56.008 V/ExpandAnimation﹕ View is visible: 0 (VISIBLE)
如您所见,展开的第一个marginStart为0,但必须为-156.
解决方法
你没有显示你的XML,但我认为你有android:visibility =“消失了”.如果是这样,您应该将其从布局文件中删除(因此默认情况下它是可见的).如果它应该消失,在通胀后调用setVisibility(View.GONE).这样你将获得相同的结果,但视图也可以获得其尺寸.