PhotoView单击退出、双击放大缩小、滑动恢复上一页状态

添加依赖

//图片预览 photoView
api 'com.github.chrisbanes:PhotoView:2.1.3'

一、Activity

public class PhotoViewActivity extends AppCompatActivity {
    private ViewPager VP_photo;
    private PhotoPagerAdapter pagerAdapter;
    private LinearLayout ll_points;
    private int lastPosition;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        StatusBarUtil.setFullScreen(getWindow());//设置全屏模式
        setContentView(R.layout.activity_photoview);
        initUi();
        initData();
    }

    private void initUi() {
        String[] photoLists = getIntent().getStringArrayExtra("photoList");
        int photoPosition = getIntent().getIntExtra("photoPosition", 0);
        pagerAdapter = new PhotoPagerAdapter(this, photoLists);
        VP_photo = findViewById(R.id.VP_photo);
        ll_points = findViewById(R.id.ll_points);
        VP_photo.setAdapter(pagerAdapter);
        for (int i = 0; i < photoLists.length; i++) {
            //根据viewPager的数量,添加白点指示器
            ImageView view = new ImageView(this);
            view.setBackgroundResource(R.drawable.point_back);
            //给点设置宽高
            int px = getResources().getDimensionPixelOffset(R.dimen.x6);
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(px, px);
            params.leftMargin = px;
            //给view设置参数
            view.setLayoutParams(params);
            //将图片添加到线性布局中
            ll_points.addView(view);
        }
        lastPosition = photoPosition;
        ll_points.getChildAt(lastPosition).setBackgroundResource(R.drawable.point_white);
        VP_photo.setCurrentItem(photoPosition);
        VP_photo.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                position = position % photoLists.length;
                //获取子页面数量
                int childCount = VP_photo.getChildCount();
                for (int i = 0; i < childCount; i++) {
                    //获取当前页面的view
                    View child = VP_photo.getChildAt(i);
                    //获取当前页面中的PhotoView
                    PhotoView photoView = child.findViewById(R.id.item_pv);
                    if (photoView != null) {
                        PhotoViewAttacher photoViewAttacher = photoView.getAttacher();
                        if (photoViewAttacher.getScale() != photoViewAttacher.getMinimumScale()) {//图片缩放过恢复初始状态
                            //第一个参数是获取photoViewAttacher自带的缩放大小最小值,第二个和第三个参数设置缩放中心
                            photoViewAttacher.setScale(photoViewAttacher.getMinimumScale(), 0f, 0f, true);
                        }
                    }
                }
                ll_points.getChildAt(lastPosition).setBackgroundResource(R.drawable.point_back);
                ll_points.getChildAt(position).setBackgroundResource(R.drawable.point_white);
                lastPosition = position;
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });

    }

    private void initData() {
    }
}

二、Activity xml文件

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

    <LinearLayout
        android:id="@+id/ll_points"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_marginBottom="@dimen/x20"
        android:gravity="center"
        android:orientation="horizontal" />

</RelativeLayout>

三、pagerAdapter

public class PhotoPagerAdapter extends PagerAdapter {
    private String[] imgList;
    private Activity context;
    public PhotoPagerAdapter(Activity context, String[] imgList) {
        this.imgList = imgList;
        this.context = context;
    }
    @Override
    public int getCount() {
        return imgList.length;
    }
    @Override
    public boolean isViewFromObject(@NotNull View view, @NotNull Object object) {
        //当创建新的条目,又反回来,判断view是否可以被复用(即是否存在)
        return view == object;
    }
    @NotNull
    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        //container  容器  相当于用来存放imageView
        PhotoView photoView = (PhotoView) LayoutInflater.from(context).inflate(R.layout.activity_photoview_item, null);
        Glide.with(context).load(imgList[position]).placeholder(R.drawable.ic_launcher_background).into(photoView);
        //把图片添加到container中
        photoView.setOnDoubleTapListener(new PhotoViewDoubleTapListener(context, photoView));
        container.addView(photoView);
        return photoView;
    }

    //销毁条目
    @Override
    public void destroyItem(ViewGroup container, int position, @NotNull Object object) {
        //object:刚才创建的对象,即要销毁的对象
        container.removeView((View) object);
    }
}

四、pagerAdapter xml

<?xml version="1.0" encoding="utf-8"?>
<com.github.chrisbanes.photoview.PhotoView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/item_pv"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:scaleType="fitCenter" />

五、因为框架里面没有实现单击退出,并且两次双击放大。修改为,双击一次放大再双击缩小。

package com.app.ccmvp.adapter;

import android.app.Activity;
import android.view.GestureDetector;
import android.view.MotionEvent;

import com.app.ccmvp.R;
import com.github.chrisbanes.photoview.PhotoView;

/**
 * 修改为点击一次再双击就恢复原图
 */
public class PhotoViewDoubleTapListener implements GestureDetector.OnDoubleTapListener {
    private Activity activity;
    private PhotoView photoView;

    public PhotoViewDoubleTapListener(Activity activity, PhotoView photoView) {
        this.activity = activity;
        this.photoView = photoView;

    }

    @Override
    public boolean onSingleTapConfirmed(MotionEvent e) {
       //重写单击方法,实现退出页面
        activity.finish();
        activity.overridePendingTransition(R.anim.alpha_fade, R.anim.alpha_hide);//页面跳转跟退出时设置出场入场动画
        return false;
    }

    @Override
    public boolean onDoubleTap(MotionEvent me) {
        try {
            float scale = photoView.getScale();
            float x = me.getX();
            float y = me.getY();
            if (scale < photoView.getMediumScale()) {
                photoView.setScale(photoView.getMediumScale(), x, y, true);
            } else if (scale >= photoView.getMediumScale() && scale < photoView.getMaximumScale()) {
               //关键代码,当放大一次之后再点击就缩小  
                photoView.setScale(photoView.getMinimumScale(), x, y, true);
            } else {
                photoView.setScale(photoView.getMinimumScale(), x, y, true);
            }
        } catch (ArrayIndexOutOfBoundsException e1) {
            // Can sometimes happen when getX() and getY() is called
        }

        return true;
    }

    @Override
    public boolean onDoubleTapEvent(MotionEvent e) {
        return false;
    }
}

过度动画相关代码,我这边是设置渐变动画,可以根据自己的需求修改。

alpha_fade
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="@android:integer/config_longAnimTime"
    android:fromAlpha="0.0"
    android:interpolator="@android:anim/accelerate_interpolator"
    android:toAlpha="1.0" />
<?xml version="1.0" encoding="utf-8"?>

alpha_hide
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="@android:integer/config_longAnimTime"
    android:fromAlpha="1.0"
    android:interpolator="@android:anim/accelerate_interpolator"
    android:toAlpha="0.0" />

最后使用

 private String[] imglist = { 
"https://ss1.baidu.com/9vo3dSag_xI4khGko9WTAnF6hhy/image/h%3D300/sign=82f1640b19ce36d3bd0485300af23a24/fcfaaf51f3deb48f5510390ffc1f3a292cf578e2.jpg",    
"https://ss0.baidu.com/7Po3dSag_xI4khGko9WTAnF6hhy/image/h%3D300/sign=ff6ed7cfa718972bbc3a06cad6cc7b9d/267f9e2f07082838304837cfb499a9014d08f1a0.jpg",
"https://ss2.baidu.com/vo3dSag_xI4khGko9WTAnF6hhy/image/h%3D300/sign=56577be956afa40f23c6c8dd9b66038c/562c11dfa9ec8a1346809b3bfb03918fa1ecc057.jpg",      
"https://ss0.baidu.com/94o3dSag_xI4khGko9WTAnF6hhy/image/h%3D300/sign=4a51c9cd7e8b4710d12ffbccf3ccc3b2/b64543a98226cffceee78e5eb5014a90f703ea09.jpg",
"https://ss3.baidu.com/9fo3dSag_xI4khGko9WTAnF6hhy/image/h%3D300/sign=a537b312164c510fb1c4e41a50582528/b8389b504fc2d562a746bd37eb1190ef77c66c99.jpg"
};
      //点击单张图片跳转到图片合集
        Intent intent = new Intent(getContext(), PhotoViewActivity.class);
        intent.putExtra("photoList", imglist);
        intent.putExtra("photoPosition", position);
        startActivity(intent);
        overridePendingTransition(R.anim.alpha_fade, R.anim.alpha_hide);

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,186评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,858评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,620评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,888评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,009评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,149评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,204评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,956评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,385评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,698评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,863评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,544评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,185评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,899评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,141评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,684评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,750评论 2 351