PhotoView使用及解决滑动冲突

  • Post author:
  • Post category:其他



前言

这是一个图片查看库,可以实现图片浏览功能,支持手势或者点击缩放的功能,支持在ViewPager中使用,允许应用程序通知照片上的用户点击



使用方法:

首先在根build.gradle文件添加

allprojects {
    repositories {
        maven { url "https://jitpack.io" }
    }
}

然后在模块build.gradle添加库

dependencies {
//这里说明一下,官方文档给出的latest.release.here是根据版本而设置的
    implementation 'com.github.chrisbanes:PhotoView:latest.release.here'
}

接着再xml布局使用

    <com.github.chrisbanes.photoview.PhotoView
        android:id="@+id/photo_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
    />

最后再java文件调用即可

PhotoView photoView = (PhotoView) findViewById(R.id.photo_view);
photoView.setImageResource(R.mipmap.ceshi);


如果联网操作的话记得加网络权限,好多人太马虎了


在日常开发中,如果搭配ViewPager使用,到这就回出现问题,那是因为viewpager的切换与photoview的缩放有时候会有手势冲突,当缩放的时候会报出异常,根据官方文档提示,需要自己写一个自定义viewpager,重写onInterceptTouchEvent来解决该问题

滑动异常提示

//重写该方法来解决冲突问题  test.bawei.com.tupianosuofang.PhotoViewPager(自定义布局的全名自己//类的名字)
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        try {
            return super.onInterceptTouchEvent(ev);
        } catch (IllegalArgumentException e) {
            //写自己要处理的error包括报错日志
            e.printStackTrace();
            Log.e("TAG", "onInterceptTouchEvent: " );

            return false;
        }
    }


MainActivity.java

public class MainActivity extends AppCompatActivity {

    private MyViewPager mVp;
    private List<View> list = new ArrayList<>();
    private int[] imgs = {R.mipmap.ceshi, R.mipmap.ceshi2, R.mipmap.ceshi3, R.mipmap.ceshi4};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initList();
        mVp = findViewById(R.id.mVp);
        mVp.setAdapter(new VPAdapter());


    }

    private void initList() {

        for (int i = 0; i < imgs.length; i++) {
            View v = View.inflate(MainActivity.this, R.layout.adapter, null);
            PhotoView photoView = v.findViewById(R.id.photo_view);
            photoView.setImageResource(imgs[i]);
            list.add(photoView);
        }
    }

    /**
     * 适配器
     **/
    public class VPAdapter extends PagerAdapter {
        @Override
        public int getCount() {
            return list.size();
        }

        @Override
        public boolean isViewFromObject(View view, Object object) {

            return view == object;
        }

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            int p = position % list.size();
            //获取当前的照片
            PhotoView img = (PhotoView) list.get(p);
            //获取照片的父容器
            ViewParent parent = img.getParent();
            //判断父容器不是空的话,删除的当前位置的照片,进行下一步操作,增加新的照片
            if (parent != null) {
                ViewGroup vp = (ViewGroup) parent;
                vp.removeView(list.get(p));
            }
            container.addView(list.get(p));
            return list.get(p);
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            //      super.destroyItem(container, position, object);
//      container.removeView(list.get(position%list.size()));
        }
    }
}


MyViewPager.java

public class MyViewPager extends ViewPager {

    public MyViewPager(Context context) {
        super(context);
    }

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

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        try {
            return super.onInterceptTouchEvent(ev);
        } catch (IllegalArgumentException e) {
            //这里就是我们想要处理的问题
            e.printStackTrace();
            Log.e("TAG", "onInterceptTouchEvent: " );

            return false;
        }
    }
}


总结

微信的头像点击放大实现,很多App的图片显示响应手势按压实现


github

地址



版权声明:本文为m0_37711172原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。