Android viewpager+photoview的使用

可实现多张图片点击放大,手指控制,左右滑动,多张图片点击任意位置定位显示任意位置图片;无动画

这里写图片描述

这里写图片描述

核心代码:

viewpager:

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;
        }
    }

}

adapter:

public class PageAdapter extends PagerAdapter {
    List<String> imagesUrl;
    Context context;

    public PageAdapter(List<String> imagesUrl, Context context) {
        this.imagesUrl = imagesUrl;
        this.context = context;
    }

    @Override
    public int getCount() {
        return (imagesUrl == null || imagesUrl.size() == 0) ? 0 : imagesUrl.size();
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        String url = imagesUrl.get(position);

        PhotoView photoView = new PhotoView(context);
        Glide.with(context)
                .load("http://test.zuihou99.com" + url)
                .into(photoView);
        container.addView(photoView);
        photoView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

            }
        });
        return photoView;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView((View) object);
    }

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

}

activity里有保存图片到本地相册的功能实现代码如下:

public class ImageBigActivity extends BaseActivity implements EasyPermissions.PermissionCallbacks {
    @Bind(R.id.page)
    TextView page;
    @Bind(R.id.top)
    RelativeLayout top;
    @Bind(R.id.viewPager)
    PhotoViewPager viewPager;
    @Bind(R.id.save)
    TextView save;
    ArrayList<String> imagesUrl;
    int current;
    PageAdapter pagerAdapter;

    private static final int REQUEST_CODE_SAVE_IMG = 10;

    @Override
    public int getLayoutId() {
        return R.layout.imagebig_layout;
    }

    @Override
    public void initView() {

    }

    @Override
    public void initData() {
        if (getIntent() != null) {
            Intent intent = getIntent();
            imagesUrl = intent.getStringArrayListExtra("images");
            current = intent.getIntExtra("position", 0);
        }
        pagerAdapter = new PageAdapter(imagesUrl, getApplicationContext());
        viewPager.setAdapter(pagerAdapter);
        viewPager.setCurrentItem(current);
        page.setText(current + 1 + "/" + imagesUrl.size());
        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                current = position;
                page.setText(current + 1 + "/" + imagesUrl.size());
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });

    }

    @OnClick(R.id.save)
    public void save() {
        requestPermission();
    }

    /**
     * 请求读取sd卡的权限
     */
    private void requestPermission() {
        if (Build.VERSION.SDK_INT >= 23) {
            //读取sd卡的权限
            String[] mPermissionList = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE};
            if (EasyPermissions.hasPermissions(getApplicationContext(), mPermissionList)) {
                //已经同意过
                saveImage();
            } else {
                //未同意过,或者说是拒绝了,再次申请权限
                EasyPermissions.requestPermissions(
                        this,  //上下文
                        "保存图片需要读取sd卡的权限", //提示文言
                        REQUEST_CODE_SAVE_IMG, //请求码
                        mPermissionList //权限列表
                );
            }
        } else {
            saveImage();
        }
    }


    /**
     * 保存图片
     */
    private void saveImage() {
        System.out.println(" 6666 ");
        System.out.println(current + " current ");
        final String urls = imagesUrl.get(current);
        System.out.println(urls + " url ");
        System.out.println(" 8888 ");

//        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.fj);

        new Thread(new Runnable() {
            Bitmap bitmap = null;
            @Override
            public void run() {
                URL url = null;
                try {
                    url = new URL("http://test.zuihou99.com" + urls);
                    InputStream is = null;
                    BufferedInputStream bis = null;
                    try {
                        is = url.openConnection().getInputStream();
                        bis = new BufferedInputStream(is);
                        bitmap = BitmapFactory.decodeStream(bis);

                        boolean isSaveSuccess = ImgUtils.saveImageToGallery(getApplicationContext(), bitmap);
                        if (isSaveSuccess) {
                            Looper.prepare();
                            Toast.makeText(getApplicationContext(), "保存图片成功", Toast.LENGTH_SHORT).show();
                            Looper.loop();
                        } else {
                            Looper.prepare();
                            Toast.makeText(getApplicationContext(), "保存图片失败,请稍后重试", Toast.LENGTH_SHORT).show();
                            Looper.loop();
                        }

                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }


    /**
     * 根据图片的url路径获得Bitmap对象
     *
     * @param url
     * @return
     */
    private Bitmap decodeUriAsBitmapFromNet(String url) {
        URL fileUrl = null;
        Bitmap bitmap = null;

        try {
            fileUrl = new URL(url);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }

        try {
            HttpURLConnection conn = (HttpURLConnection) fileUrl
                    .openConnection();
            conn.setDoInput(true);
            conn.connect();
            InputStream is = conn.getInputStream();
            bitmap = BitmapFactory.decodeStream(is);
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return bitmap;
    }


    //授权结果,分发下去
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        // Forward results to EasyPermissions
        //跳转到onPermissionsGranted或者onPermissionsDenied去回调授权结果
        EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
    }


    //同意授权
    @Override
    public void onPermissionsGranted(int requestCode, List<String> list) {
        saveImage();
    }

    //拒绝授权
    @Override
    public void onPermissionsDenied(int requestCode, List<String> perms) {
        if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {
            //打开系统设置,手动授权
            new AppSettingsDialog.Builder(this).build().show();
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == AppSettingsDialog.DEFAULT_SETTINGS_REQ_CODE) {
            //拒绝授权后,从系统设置了授权后,返回APP进行相应的操作
            saveImage();
        }
    }


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // TODO: add setContentView(...) invocation
        ButterKnife.bind(this);
    }
}

startActivity跳转代码:

 private void statPhotoViewActivity(int position) {
        Intent intent = new Intent(this, ImageBigActivity.class);
        intent.putStringArrayListExtra("images", imagesList);
        intent.putExtra("position", position);
        startActivity(intent);
    }

activity布局文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/black"
    android:orientation="vertical">

    <RelativeLayout
        android:id="@+id/top"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:paddingLeft="@dimen/margin_8"
        android:paddingRight="@dimen/margin_8">

        <ImageView
            android:id="@+id/back"
            android:layout_width="15dp"
            android:layout_height="15dp"
            android:layout_centerVertical="true"
            android:onClick="back"
            android:scaleType="centerCrop"
            android:src="@mipmap/ic_image_back" />

        <TextView
            android:id="@+id/page"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:text=""
            android:textColor="@color/homepage_type_bg"
            android:textSize="@dimen/font_15" />
    </RelativeLayout>

    <com.zuihou.drunkenmonkey.widget.view.PhotoViewPager
        android:id="@+id/viewPager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/top"
        android:background="#444444" />

    <TextView
        android:id="@+id/save"
        android:layout_width="match_parent"
        android:layout_height="30dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:clickable="true"
        android:gravity="right"
        android:paddingRight="@dimen/margin_16"
        android:text="保存"
        android:textColor="@color/homepage_type_bg"
        android:textSize="@dimen/font_16" />
</RelativeLayout>
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页