Android开发多张图片预览效果

181 阅读1分钟
Android开发多张图片预览效果

往往九格宫图片,点击其中一张,可以预览到它,以及其他图片,还要具备双指放大,缩小功能

一、思路:

自定义ZoomView加载图片,用于双指放大,缩小。用RecyclerView加载左右切换功能

二、效果图:

在这里插入图片描述图片可能不是很直观,可以看视频效果:

[video(video-KFHh12dS-1728467567489)(type-bilibili)(url-player.bilibili.com/player.html…)]

三、关键代码:
// 联系:893151960
public class ImagePreviewDialog extends AbsDialogFragment implements View.OnClickListener {

    private View mBg;
    private RecyclerView mRecyclerView;
    private ValueAnimator mAnimator;
    private int mPosition;
    private int mPageCount;
    private ActionListener mActionListener;
    private TextView mCount;
    private ImagePreviewAdapter mAdapter;
    private boolean mNeedDelete;


    @Override
    protected int getLayoutId() {
        return R.layout.view_preview_image;
    }

    @Override
    protected int getDialogStyle() {
        return R.style.dialog2;
    }

    @Override
    protected boolean canCancel() {
        return true;
    }

    @Override
    protected void setWindowAttributes(Window window) {
        WindowManager.LayoutParams params = window.getAttributes();
        params.width = WindowManager.LayoutParams.MATCH_PARENT;
        params.height = WindowManager.LayoutParams.MATCH_PARENT;
        window.setAttributes(params);
    }


    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        mBg = mRootView.findViewById(R.id.bg);
        mCount = findViewById(R.id.count);
        findViewById(R.id.btn_close).setOnClickListener(this);
//        if (mNeedDelete) {
//            View btnDelete = findViewById(R.id.btn_delete);
//            btnDelete.setVisibility(View.VISIBLE);
//            btnDelete.setOnClickListener(this);
//        }
        mRecyclerView = mRootView.findViewById(R.id.recyclerView);
        mRecyclerView.setHasFixedSize(true);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(mContext, LinearLayoutManager.HORIZONTAL, false));
        mAnimator = ValueAnimator.ofFloat(0, 1);
        mAnimator.setDuration(150);
        mAnimator.setInterpolator(new AccelerateDecelerateInterpolator());
        mAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                float v = (float) animation.getAnimatedValue();
                mBg.setAlpha(v);
            }
        });
        mAnimator.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                if (mRecyclerView != null && mPageCount > 0) {
                    ImagePreviewAdapter adapter = new ImagePreviewAdapter(mContext, mPageCount);
                    mAdapter = adapter;
                    adapter.setActionListener(new ImagePreviewAdapter.ActionListener() {

                        @Override
                        public void onPageChanged(int position) {
                            if (mCount != null) {
                                mCount.setText(StringUtil.contact(String.valueOf(position + 1), "/", String.valueOf(mPageCount)));
                            }
                        }

                        @Override
                        public void loadImage(ImageView imageView, int position) {
                            if (mActionListener != null) {
                                mActionListener.loadImage(imageView, position);
                            }
                        }

                        @Override
                        public void saveImage(int position) {
                            if (mActionListener != null) {
                                final String imgUrl = mActionListener.getImageUrl(position);
                                if (TextUtils.isEmpty(imgUrl) || mContext == null) {
                                    return;
                                }
                            }
                        }
                    });
                    mRecyclerView.setAdapter(adapter);
                    if (mPosition >= 0 && mPosition < mPageCount) {
                        adapter.setCurPosition(mPosition);
                        mRecyclerView.scrollToPosition(mPosition);
                    }
                }
            }
        });
        mAnimator.start();
    }

    public void setImageInfo(int pageCount, int position, boolean needDelete, ActionListener actionListener) {
        mActionListener = actionListener;
        mPageCount = pageCount;
        mPosition = position;
        mNeedDelete = needDelete;
    }


    @Override
    public void onDestroy() {
        if (mAnimator != null) {
            mAnimator.cancel();
        }
        mContext = null;
        mActionListener = null;
        super.onDestroy();
    }

    @Override
    public void onClick(View v) {
        int i = v.getId();
        if (i == R.id.btn_close) {
            dismiss();
        }
//        else if (i == R.id.btn_delete) {
//            delete();
//        }
    }

    private void delete() {
        if (mAdapter != null && mActionListener != null) {
            mActionListener.onDeleteClick(mAdapter.getCurPosition());
        }
        dismiss();
    }


    public interface ActionListener {
        void loadImage(ImageView imageView, int position);

        void onDeleteClick(int position);

        String getImageUrl(int position);
    }

}
四、项目demo源码结构图:

在这里插入图片描述

有问题或者需要完整源码的私信我