图片浏览fragment

  • 支持缩放,支持长图,支持左右滑动切换

加上viewpager后长图不能自动缩放到手机宽度,以后再优化

  • 自定义PhotoViewPager
public class PhotoViewPager extends ViewPager {
    public PhotoViewPager(Context context) {
        super(context);
    }

    public PhotoViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        try {
            return super.onInterceptTouchEvent(ev);
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
            return false;
        }
    }
}
  • xml:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ui.fragment.ImgDetailFragment">

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fillViewport="true"
        android:scrollbars="none">

    </ScrollView>

    <com.nanmu.weipo.common.PhotoViewPager
        android:id="@+id/iv_imgDetail"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:adjustViewBounds="true"
        android:scaleType="fitCenter"
        android:src="@color/colorAccent"
        app:srcCompat="@drawable/ic_wallpaper_green_100dp" />

</FrameLayout>
  • Fragment:
    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        PhotoViewPager photoViewPager = getActivity().findViewById(R.id.iv_imgDetail);
        // 这里是通过点击缩略图时,navigate过来带的参数,包含所有图片链接,点击的图片位置
        List<PicUrlBean> picUrlBeanList = getArguments().getParcelableArrayList("urlList");
        int position = getArguments().getInt("position");

        // 创建一个List放Photoview
        List<PhotoView> viewLists = new ArrayList<>();
        for (int i=0; i < picUrlBeanList.size(); i++){
            viewLists.add(new PhotoView(requireActivity()));
        }

        // 设置适配器,传递需要的参数
        DetailPicAdapter adapter = new DetailPicAdapter(requireContext(), picUrlBeanList, viewLists);
        photoViewPager.setAdapter(adapter);
        photoViewPager.setCurrentItem(position); // 设置从第几张图片开始浏览
    }

Adapter:

public class DetailPicAdapter extends PagerAdapter {
        List<PicUrlBean> picUrlBeanList;
        Context context;
        List<PhotoView> photoViewArrayList;

    public DetailPicAdapter(Context context, List<PicUrlBean> picUrlBeanList, List<PhotoView> photoViewArrayList) {
        this.picUrlBeanList = picUrlBeanList;
        this.context = context;
        this.photoViewArrayList = photoViewArrayList;
    }

    @Override
        public int getCount() {
            return photoViewArrayList.size();
        }

        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view == object;
        }

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            PhotoView photoView = photoViewArrayList.get(position);
            // 处理缩略图链接,换成中型图
            String thumbnail_pic = picUrlBeanList.get(position).getThumbnail_pic();
            String bmiddle_pic = thumbnail_pic.replace("thumbnail","bmiddle");
            // 网络请求图片
            Glide.with(context)
                    .load(bmiddle_pic)
                    .placeholder(R.drawable.ic_launcher_background)
                    .listener(new RequestListener<Drawable>() {
                        @Override
                        public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
                            return false;
                        }

                        @Override
                        public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
                            return false;
                        }
                    })
                    .into(photoView);
            container.addView(photoView);
            return photoView;
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView((View) object);
        }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容