使用RecyclerView实现画廊效果,中间放大,并且压住两边
具体github:https://github.com/Azoft/CarouselLayoutManager
使用方法
1.添加依赖
2.添加布局,使用系统的recyclerview就好(记得导入recyclerview的包)
Item
3.自定义adapter,一般要用到item点击事件,所以自己提前写
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private List<Integer> mFruitList;
private OnItemClickListener mOnItemClickListener;
public interface OnItemClickListener{
void onClick( int position);
void onLongClick( int position);
}
public void setOnItemClickListener(OnItemClickListener onItemClickListener ){
this. mOnItemClickListener=onItemClickListener;
}
public MyAdapter(List<Integer> mFruitList) {
this.mFruitList = mFruitList;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view=LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_img,parent,false);
ViewHolder holder=new ViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {
final int index=position;
int fruit=mFruitList.get(index);
holder.imageView.setImageResource(fruit);
if( mOnItemClickListener!= null){
holder.itemView.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View v) {
mOnItemClickListener.onClick(index);
}
});
holder. itemView.setOnLongClickListener( new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
mOnItemClickListener.onLongClick(index);
return false;
}
});
}
}
@Override
public int getItemCount() {
return mFruitList.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
ImageView imageView;
public ViewHolder(View itemView) {
super(itemView);
imageView=itemView.findViewById(R.id.img_item_img);
}
}
}
4.Activity中使用
public class CarouselRecyclerView extends AppCompatActivity {
private List<Integer> mDatas;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_carousel_recycler_view);
mDatas=new ArrayList<>();
mDatas.add(R.drawable.fruit1);
mDatas.add(R.drawable.fruit2);
mDatas.add(R.drawable.fruit3);
mDatas.add(R.drawable.fruit4);
mDatas.add(R.drawable.fruit5);
final CarouselLayoutManager layoutManager = new CarouselLayoutManager(CarouselLayoutManager.VERTICAL, true);
layoutManager.setPostLayoutListener(new CarouselZoomPostLayoutListener());//实现zoom效果
final RecyclerView recyclerView =findViewById(R.id.carousel_recyclerview);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setHasFixedSize(true);//固定item大小
final MyAdapter myAdapter=new MyAdapter(mDatas);
recyclerView.setAdapter(myAdapter);
recyclerView.addOnScrollListener(new CenterScrollListener());
myAdapter.setOnItemClickListener(new MyAdapter.OnItemClickListener() {
@Override
public void onClick(int position) {
Toast.makeText(CarouselRecyclerView.this,"you click "+position+" position"
,Toast.LENGTH_SHORT).show();
}
@Override
public void onLongClick(int position) {
}
});
layoutManager.addOnItemSelectionListener(new CarouselLayoutManager.OnCenterItemSelectionListener() {
/*
经过使用后发现这个方法为item改变的监听,如从pos=1的滚动到pos=2完成后,会调用
*/
@Override
public void onCenterItemChanged(int adapterPosition) {
int index=adapterPosition;
//没搞清楚这个判断是干啥的,判断是够滚动了
if(CarouselLayoutManager.INVALID_POSITION!= adapterPosition) {
Toast.makeText(CarouselRecyclerView.this,"you scroll to "+index+" position"
,Toast.LENGTH_SHORT).show();
}
Toast.makeText(CarouselRecyclerView.this,"you scroll to "+index+" position"
,Toast.LENGTH_SHORT).show();
}
});
}
}
以上就是全部代码,复制粘贴导包即可使用
总结:
自己写不出来,所以只能找
这种效果找了很久,才找到的
两个item的间距,好像不能直接设置,自己改item的xml来满足效果吧
这个项目如果把item中的ImageView改为VideoView,上下滚动还是会出现遮盖效果,但我很满足了
其他的详细介绍见这个项目的github地址哈哈哈