PhotoView單擊退出、雙擊放大縮小标捺、滑動恢復上一頁狀態(tài)

添加依賴

//圖片預覽 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()) {//圖片縮放過恢復初始狀態(tài)
                            //第一個參數是獲取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) {
        //當創(chuàng)建新的條目萍倡,又反回來身弊,判斷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:剛才創(chuàng)建的對象,即要銷毀的對象
        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);

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市秧耗,隨后出現的幾起案子备籽,更是在濱河造成了極大的恐慌,老刑警劉巖分井,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件车猬,死亡現場離奇詭異霉猛,居然都是意外死亡,警方通過查閱死者的電腦和手機珠闰,發(fā)現死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門惜浅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人伏嗜,你說我怎么就攤上這事赡矢。” “怎么了阅仔?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵吹散,是天一觀的道長。 經常有香客問我八酒,道長空民,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任羞迷,我火速辦了婚禮界轩,結果婚禮上,老公的妹妹穿的比我還像新娘衔瓮。我一直安慰自己浊猾,他們只是感情好,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布热鞍。 她就那樣靜靜地躺著葫慎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪薇宠。 梳的紋絲不亂的頭發(fā)上偷办,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天,我揣著相機與錄音澄港,去河邊找鬼椒涯。 笑死,一個胖子當著我的面吹牛回梧,可吹牛的內容都是我干的废岂。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼狱意,長吁一口氣:“原來是場噩夢啊……” “哼湖苞!你這毒婦竟也來了?” 一聲冷哼從身側響起髓涯,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤袒啼,失蹤者是張志新(化名)和其女友劉穎哈扮,沒想到半個月后纬纪,有當地人在樹林里發(fā)現了一具尸體蚓再,經...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年包各,在試婚紗的時候發(fā)現自己被綠了摘仅。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡问畅,死狀恐怖娃属,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情护姆,我是刑警寧澤矾端,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站卵皂,受9級特大地震影響秩铆,放射性物質發(fā)生泄漏。R本人自食惡果不足惜灯变,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一殴玛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧添祸,春花似錦滚粟、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至耙替,卻和暖如春鲤遥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背林艘。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工盖奈, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人狐援。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓钢坦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親啥酱。 傳聞我的和親對象是個殘疾皇子爹凹,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355