给你:
有几个重要的注意事项:
-
因为我们在scrollview中定义了回收器,所以它不会回收视图!!!!因此,尽量不要在列表中放置太多图形对象
-
视图高度和宽度应在创建整个视图后计算。否则你会得到零。这就是我使用
globalLayoutListener
我声明我的活动如下:
public class CustomCardAnimationActivity extends AppCompatActivity {
NestedScrollView scrollView;
RecyclerView recyclerView;
CardView cardView;
TextView tvToday;
TextView tvTodayPrice;
TextView tvTodayDelivery;
TextView tvWeek;
TextView tvWeekPrice;
TextView tvWeekDelivery;
int cardHeight;
int textViewHeight;
float tvTitleTodayX;
float tvPriceTodayX;
float tvTitleWeekX;
float tvPriceWeekX;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_custom_card_animation);
recyclerView= (RecyclerView) findViewById(R.id.recyclerView);
scrollView= (NestedScrollView) findViewById(R.id.nested_scrollView);
cardView= (CardView) findViewById(R.id.cardView);
tvToday=(TextView) findViewById(R.id.textView_today);
tvTodayPrice=(TextView) findViewById(R.id.textView_today_price);
tvTodayDelivery=(TextView) findViewById(R.id.textView_today_delivery);
tvWeek=(TextView) findViewById(R.id.textView_week);
tvWeekPrice=(TextView) findViewById(R.id.textView_week_price);
tvWeekDelivery=(TextView) findViewById(R.id.textView_week_delivery);
scrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
@Override
public void onScrollChanged() {
int scrollY = scrollView.getScrollY();
FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) cardView.getLayoutParams();
int height = Math.max(textViewHeight,cardHeight-scrollY);
lp.height = height;
cardView.setLayoutParams(lp);
// alpha delivery textViews
tvTodayDelivery.setAlpha(Math.max(0f,(float) ((cardHeight/2)-scrollY)/(cardHeight/2)));
tvWeekDelivery.setAlpha(Math.max(0f,(float) ((cardHeight/2)-scrollY)/(cardHeight/2)));
// move titles to left
float titleMovementChange = Math.max(-scrollY , -textViewHeight);
tvToday.setX(tvTitleTodayX + titleMovementChange);
tvWeek.setX(tvTitleWeekX + titleMovementChange*1.2f);
// move prices to right
float priceMovementChange = Math.max(-scrollY , -textViewHeight/2);
tvTodayPrice.setX(tvPriceTodayX - priceMovementChange);
tvWeekPrice.setX(tvPriceWeekX - priceMovementChange * 1.2f);
}
});
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(new TestListAdapter());
recyclerView.setNestedScrollingEnabled(false);
//if you remove this part, the card would be shown in its minimum state at start
recyclerView.post(new Runnable() {
@Override
public void run() {
scrollView.scrollTo(0,0);
}
});
// The calculation for heights of views should be done after the view created
View rootView = findViewById(R.id.root_view);
rootView.getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener() {
public void onGlobalLayout() {
//Remove the listener before proceeding
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
rootView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
} else {
rootView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
// measure your views here
cardHeight = cardView.getHeight();
textViewHeight= tvToday.getHeight();
tvTitleTodayX = tvToday.getX();
tvPriceTodayX = tvTodayPrice.getX();
tvTitleWeekX = tvWeek.getX();
tvPriceWeekX = tvWeekPrice.getX();
scrollView.scrollTo(0,0);
}
});
}
}
此外,我的xml如下所示:
<FrameLayout
android:id="@+id/root_view"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="#0099cc"
tools:context="com.bisphone.interviewtest.test.CustomCardAnimationActivity">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp">
<android.support.v7.widget.CardView
android:id="@+id/cardView"
android:layout_width="match_parent"
android:layout_height="100dp"
android:layout_margin="16dp"
app:cardElevation="4dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<FrameLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center">
<TextView
android:id="@+id/textView_today"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:layout_gravity="top|center"
android:padding="8dp"
android:textSize="12sp"
android:text="TODAY"/>
<TextView
android:id="@+id/textView_today_price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="800 $"
android:gravity="center"
android:padding="8dp"
android:textSize="14sp"
android:textStyle="bold"
android:textAlignment="center"
android:layout_gravity="center"
android:textColor="#4caf50"/>
<TextView
android:id="@+id/textView_today_delivery"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="18 Deliveries"
android:padding="8dp"
android:textSize="12sp"
android:layout_gravity="bottom|center"
android:gravity="center"/>
</FrameLayout>
<FrameLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center">
<TextView
android:id="@+id/textView_week"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:layout_gravity="top|center"
android:textSize="12sp"
android:padding="8dp"
android:text="THIS WEEK"/>
<TextView
android:id="@+id/textView_week_price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="5200 $"
android:textSize="14sp"
android:gravity="center"
android:layout_gravity="center"
android:textStyle="bold"
android:textAlignment="center"
android:textColor="#009688"/>
<TextView
android:id="@+id/textView_week_delivery"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="87 Deliveries"
android:layout_gravity="bottom|center"
android:textSize="12sp"
android:gravity="center"
android:padding="8dp"/>
</FrameLayout>
</LinearLayout>
</android.support.v7.widget.CardView>
<android.support.v7.widget.CardView
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v4.widget.NestedScrollView
android:id="@+id/nested_scrollView"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="100dp"
android:layout_margin="16dp"/>
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:nestedScrollingEnabled="false"/>
</LinearLayout>
</android.support.v4.widget.NestedScrollView>
</android.support.v7.widget.CardView>
</FrameLayout>