我遇到过类似的情况,但我将其从 recylerview 更改为 ViewPager 进行了修复,它更流畅,性能更好
首先,您将使用边距和填充的 xml 布局,它由 4 个类组成,其中包括用于所需动画的阴影变换、用于寻呼机适配器的 cardFragmentPagerAdapter、用于卡片高度的接口 cardAdapter 和用于布局外观的 cardFragment
<android.support.v4.view.ViewPager
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="130dp"
android:layout_alignParentBottom="true"
android:clipToPadding="false"
android:overScrollMode="never"
android:paddingEnd="80dp"
android:paddingLeft="80dp"
android:paddingRight="80dp"
android:paddingStart="80dp" />
然后你将设置viewpager的边距
int margin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10 * 2,
getResources().getDisplayMetrics());
viewPager.setPageMargin(-margin);
viewPager.setClipChildren(false);
然后您将适配器设置为 viewpager 及其负责动画的阴影变换
pagerAdapter = new CardFragmentPagerAdapter(getSupportFragmentManager(),
dpToPixels(2, JobMapActivity.this),
titlesCard, catIconCard, catNameCard, startDateCard, startTimeCard);
viewPager.setAdapter(pagerAdapter);
viewPager.setOffscreenPageLimit(3);
ShadowTransformer fragmentCardShadowTransformer = new ShadowTransformer(viewPager, pagerAdapter);
fragmentCardShadowTransformer.enableScaling(true);
viewPager.setPageTransformer(false, fragmentCardShadowTransformer);
您的 CardFragmentPagerAdapter 代码是
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v7.widget.CardView;
import android.util.SparseArray;
import android.view.ViewGroup;
import java.util.ArrayList;
import java.util.List;
public class CardFragmentPagerAdapter extends FragmentStatePagerAdapter implements CardAdapter {
private List<CardFragment> fragments;
SparseArray<Fragment> registeredFragments = new SparseArray<>();
private float baseElevation;
ArrayList<String> titles, icons, names, dates, times;
public CardFragmentPagerAdapter(FragmentManager fm, float baseElevation,
ArrayList<String> title, ArrayList<String> icon,
ArrayList<String> name, ArrayList<String> startDate,
ArrayList<String> startTime) {
super(fm);
fragments = new ArrayList<>();
this.baseElevation = baseElevation;
titles = title;
icons = icon;
names = name;
dates = startDate;
times = startTime;
for (int i = 0; i < titles.size(); i++) {
addCardFragment(new CardFragment());
}
}
@Override
public float getBaseElevation() {
return baseElevation;
}
@Override
public CardView getCardViewAt(int position) {
return fragments.get(position).getCardView();
}
@Override
public int getCount() {
return fragments.size();
}
@Override
public Fragment getItem(int position) {
return CardFragment.getInstance(position, titles.get(position),
icons.get(position), names.get(position), dates.get(position), times.get(position));
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
super.destroyItem(container, position, object);
registeredFragments.remove(position);
}
public void addCardFragment(CardFragment fragment) {
fragments.add(fragment);
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
Object fragment = super.instantiateItem(container, position);
Fragment fragment2 = (Fragment) super.instantiateItem(container, position);
fragments.set(position, (CardFragment) fragment);
registeredFragments.put(position, fragment2);
return fragment;
}
public String getRegisteredFragment(int position) {
return fragments.get(position).getTitle();
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
}
cardAdapter 是海拔的接口
import android.support.v7.widget.CardView;
public interface CardAdapter {
int MAX_ELEVATION_FACTOR = 8;
float getBaseElevation();
CardView getCardViewAt(int position);
int getCount();
}
你的阴影变换类是
import android.support.v4.view.ViewPager;
import android.support.v7.widget.CardView;
import android.view.View;
import com.foksart.greatskillsfixers.adapters.CardAdapter;
public class ShadowTransformer implements ViewPager.OnPageChangeListener, ViewPager.PageTransformer {
private ViewPager viewPager;
private CardAdapter cardAdapter;
private float lastOffset;
private boolean scalingEnabled;
public ShadowTransformer(ViewPager viewPager, CardAdapter adapter) {
this.viewPager = viewPager;
viewPager.addOnPageChangeListener(this);
cardAdapter = adapter;
}
public void enableScaling(boolean enable) {
if (scalingEnabled && !enable) {
// shrink main card
CardView currentCard = cardAdapter.getCardViewAt(viewPager.getCurrentItem());
if (currentCard != null) {
currentCard.animate().scaleY(.9f);
// currentCard.animate().scaleX(.9f);
}
}else if(!scalingEnabled && enable){
// grow main card
CardView currentCard = cardAdapter.getCardViewAt(viewPager.getCurrentItem());
if (currentCard != null) {
//enlarge the current item
currentCard.animate().scaleY(1.3f);
// currentCard.animate().scaleX(1.3f);
}
}
scalingEnabled = enable;
}
@Override
public void transformPage(View page, float position) {
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
int realCurrentPosition;
int nextPosition;
float baseElevation = cardAdapter.getBaseElevation();
float realOffset;
boolean goingLeft = lastOffset > positionOffset;
// If we're going backwards, onPageScrolled receives the last position
// instead of the current one
if (goingLeft) {
realCurrentPosition = position + 1;
nextPosition = position;
realOffset = 1 - positionOffset;
} else {
nextPosition = position + 1;
realCurrentPosition = position;
realOffset = positionOffset;
}
// Avoid crash on overscroll
if (nextPosition > cardAdapter.getCount() - 1
|| realCurrentPosition > cardAdapter.getCount() - 1) {
return;
}
CardView currentCard = cardAdapter.getCardViewAt(realCurrentPosition);
// This might be null if a fragment is being used
// and the views weren't created yet
if (currentCard != null) {
if (scalingEnabled) {
currentCard.setScaleX((float) (1 + 0.1 * (1 - realOffset)));
currentCard.setScaleY((float) (1 + 0.1 * (1 - realOffset)));
}
currentCard.setCardElevation((baseElevation + baseElevation
* (CardAdapter.MAX_ELEVATION_FACTOR - 1) * (1 - realOffset)));
}
CardView nextCard = cardAdapter.getCardViewAt(nextPosition);
// We might be scrolling fast enough so that the next (or previous) card
// was already destroyed or a fragment might not have been created yet
if (nextCard != null) {
if (scalingEnabled) {
nextCard.setScaleX((float) (1 + 0.1 * (realOffset)));
nextCard.setScaleY((float) (1 + 0.1 * (realOffset)));
}
nextCard.setCardElevation((baseElevation + baseElevation
* (CardAdapter.MAX_ELEVATION_FACTOR - 1) * (realOffset)));
}
lastOffset = positionOffset;
}
@Override
public void onPageSelected(int position) {
}
@Override
public void onPageScrollStateChanged(int state) {
}
}
用于布局的 cardFragment
import android.graphics.Color;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.widget.CardView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import com.foksart.greatskillsfixers.ActivityClasses.JobMapActivity;
import com.foksart.greatskillsfixers.R;
public class CardFragment extends Fragment {
private CardView cardView;
int position;
String title, icon, name, date, time;
public static Fragment getInstance(int position, String title,
String icon, String name,
String date, String time) {
CardFragment f = new CardFragment();
Bundle args = new Bundle();
args.putInt("position", position);
args.putString("title", title);
args.putString("icon", icon);
args.putString("name", name);
args.putString("date", date);
args.putString("time", time);
f.setArguments(args);
return f;
}
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.card_map_item, container, false);
cardView = view.findViewById(R.id.cardView);
cardView.setMaxCardElevation(cardView.getCardElevation() * CardAdapter.MAX_ELEVATION_FACTOR);
TextView jobTitle = view.findViewById(R.id.jobTitle);
jobTitle.setText(title);
ImageView catIcon = view.findViewById(R.id.catIcon);
Glide.with(getActivity()).load(icon).into(catIcon);
catIcon.setColorFilter(Color.parseColor("#969798"));
TextView catName = view.findViewById(R.id.catName);
catName.setText(name);
TextView Date = view.findViewById(R.id.Date);
Date.setText(date);
TextView Time = view.findViewById(R.id.Time);
Time.setText(time);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
((JobMapActivity)getActivity()).viewPagerClick(position);
}
});
return view;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
position = getArguments().getInt("position");
title = getArguments().getString("title");
icon = getArguments().getString("icon");
name = getArguments().getString("name");
date = getArguments().getString("date");
time = getArguments().getString("time");
}
public CardView getCardView() {
return cardView;
}
public String getTitle(){return title;}