RecyclerView实现瀑布流,快速滑动,侧滑删除,点击图片放大等效果

本文介绍了如何使用RecyclerView实现瀑布流布局,包括设置网格显示为2行,绘制水平和竖直分割线,实现侧滑删除功能,点击图片查看大图的对话框展示,以及动画效果的添加。提供了一个Demo下载链接供读者实践。
摘要由CSDN通过智能技术生成

先说一下几个要点:

1,首先在Activity中确定展示方式为网格布局,行数设置为2

package com.example.administrator.beautifulgirls;

import android.animation.ObjectAnimator;
import android.app.Activity;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.support.v7.widget.DividerItemDecoration;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.helper.ItemTouchHelper;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.DecelerateInterpolator;
import android.view.animation.ScaleAnimation;
import android.widget.ImageView;

import com.squareup.picasso.Picasso;

import java.util.Collections;
import java.util.List;

/**
 * Created by Liu on 2016/12/2.
 */
public class HomeActivity extends Activity
{

    private RecyclerView mRecyclerView;
    private List<String> mDatas;
    private HomeAdapter mAdapter;
    private int height =0;
    private AnimationSet mAnimationSet;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initData();
        //设置随机高度
        height = (int) (Math.random() * 100);
        mRecyclerView = (RecyclerView) findViewById(R.id.id_recyclerview);
        mRecyclerView.setLayoutManager(new GridLayoutManager(this,2));
        mRecyclerView.addItemDecoration(new DividerItemDecoration(
                this, DividerItemDecoration.HORIZONTAL));

        mRecyclerView.addItemDecoration(new SpaceGridItemDecoration(this,5));
        mRecyclerView.addItemDecoration(new SpaceListItemDecoration(
                this,5,true,
                getResources().getColor(R.color.color_fb5428),false,true,false));


        mAdapter= new HomeAdapter();
        mRecyclerView.setAdapter(mAdapter);

        //实现拖拽和删除
        setDragAndDelete();

        mRecyclerView.addOnItemTouchListener(new RecyclerItemClickListener(this, mRecyclerView, new RecyclerItemClickListener.OnItemClickListener() {
            @Override
            public void onItemClick(View view, int position) {
                // ...

                //Toast.makeText(HomeActivity.this, "条目点击:" + position, Toast.LENGTH_SHORT).show();

                // 点击放大

                LayoutInflater inflater = LayoutInflater.from(HomeActivity.this);
                View imgEntryView = inflater.inflate(R.layout.dialog_photo_entry, null); // 加载自定义的布局文件
                final AlertDialog dialog = new AlertDialog.Builder(HomeActivity.this
                        ).create();
                ImageView img = (ImageView) imgEntryView.findViewById(R.id.large_image);
                Picasso.with(HomeActivity.this).
                        load(mDatas.get(position)).fit()
                        .error(R.mipmap.ic_launcher).into(img); // 这个是加载网络图片的,可以是自己的图片设置方法
                dialog.setView(imgEntryView); // 自定义dialog
                dialog.show();
                //增加点击放大效果
                AnimationSet animationSet = new AnimationSet(true);
                if(mAnimationSet!=null && mAnimationSet != animationSet){
                    ScaleAnimation scaleAnimation = new ScaleAnimation(2,0.5f,2,0.5f,
                            Animation.RELATIVE_TO_PARENT,0.5f,//使用动画播放图片
                            Animation.RELATIVE_TO_PARENT,0.5f);
                    scaleAnimation.setDuration(500);
                    mAnimationSet.addAnimation(scaleAnimation);
                    mAnimationSet.setFillAfter(false); //让其保持动画结束时的状态。
                    img.startAnimation(mAnimationSet);
                }
                ScaleAnimation scaleAnimation = new ScaleAnimation((float) 0,1f, (float) 0,1f,
                        Animation.RELATIVE_TO_SELF,0.5f,
                        Animation.RELATIVE_TO_SELF,0.5f);
                scaleAnimation.setDuration(3000);
                animationSet.addAnimation(scaleAnimation);
                animationSet.setFillAfter(true);
                img.startAnimation(animationSet);
                mAnimationSet = animationSet;
                // 点击布局文件(也可以理解为点击大图)后关闭dialog,这里的dialog不需要按钮
                imgEntryView.setOnClickListener(new View.OnClickListener() {
                    public void onClick(View paramView) {
                        dialog.cancel();
                    }
                });
            }

            @Override
            public void onItemLongClick(View view, int position) {
                // ...
                //Toast.makeText(HomeActivity.this,"条目长按:"+position,Toast.LENGTH_SHORT).show();
            }
        }));

    }



    protected void initData()
    {
        mDatas= PicResource.getPic();
    }

    class HomeAdapter extends RecyclerView.Adapter<HomeAdapter.MyViewHolder>
    {

        @Override
        public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
        {
            MyViewHolder holder = new MyViewHolder(LayoutInflater.from(
                    HomeActivity.this).inflate(R.layout.item_home, parent,
                    false));
            return holder;
        }

        @Override
        public void onBindViewHolder(MyViewHolder holder, int position)
        {
            //holder.iv_pic.setText(mDatas.get(position));
            //默认显示placeholder,加载错误显示ic_launcher,指定placeholder大小显示
            Picasso.with(HomeActivity.this).
                    load(mDatas.get(position)).placeholder(R.mipmap.abc).resize(500+height,500+height)
                    .error(R.mipmap.ic_launcher).into(holder.iv_pic);
        }

        @Override
        public int getItemCount()
        {
            return mDatas.size();
        }

        class MyViewHolder extends RecyclerView.ViewHolder
        {

            ImageView iv_pic;

            public MyViewHolder(View view)
            {
                super(view);
                iv_pic = (ImageView) view.findViewById(R.id.iv_pic);
            }
        }
    }

    private void setDragAndDelete() {
        new ItemTouchHelper(new ItemTouchHelper.Callback() {
            private RecyclerView.ViewHolder vh;

            @Override
            public boolean isItemViewSwipeEnabled() {
                return true;
            }

            @Override
            public boolean isLongPressDragEnabled() {
                return true;
            }

            @Override
            public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder
                    viewHolder) {
                // 拖拽的标记,这里允许上下左右四个方向
                int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT |
                        ItemTouchHelper.RIGHT;
                // 滑动的标记,这里允许左右滑动
                int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;
                return makeMovementFlags(dragFlags, swipeFlags);
            }

            /*
              这个方法会在某个Item被拖动和移动的时候回调,这里我们用来播放动画,当viewHolder不为空时为选中状态
              否则为释放状态
             */
            @Override
            public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
                super.onSelectedChanged(viewHolder, actionState);
                if (viewHolder != null) {
                    vh = viewHolder;
                    pickUpAnimation(viewHolder.itemView);
                } else {
                    if (vh != null) {
                        putDownAnimation(vh.itemView);
                    }
                }
            }




            
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值