我有一个带有以下视图的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.