Glide가 PhotoView와 함께 사용될 경우 이미지 확대/축소 시 너비 및 높이 문제 해결 레코드 표시(새 업데이트)

PhotoView 프로젝트는 사용하기에 매우 편리하고 효과가 매우 nice입니다.그러나 프로젝트에서 Glide와 결합하여 사용할 때 문제가 하나 존재한다. 바로 불러오기가 끝난 후에 그림을 축소할 때 그림의 폭이 갑자기 커지고 실제 원하는 효과와 전혀 맞지 않는다는 것이다.처음에는 ImageView에 FIT-CENTER 속성을 설정하지 않아서 그런 줄 알았는데 설정한 후에도 이 문제가 존재했다.
잠시 멍하니 있다가 원인을 곰곰이 생각해 보았다.아마도 포토뷰를 초기화할 때 측정한 그림의 폭이 높아서 문제가 생겼을 것이다. 그렇다면 어떤 원인이 있었을까?이리저리 찾아보니 점위도 크기와 인터넷에서 다운로드한 그림의 크기가 일치하지 않기 때문이다.그림을 다운로드하는 데 일정한 시간이 걸리기 때문에 인터넷 사진이 다운로드되지 않았을 때 포토뷰 애처쳐를 초기화하고 그림의 넓이를 측정했기 때문이다. 그러나 그림을 불러온 후에 포토뷰는 인터넷에서 다운로드한 그림을 나타냈지만 초기화할 때 이미 측정된 것은 비트맵의 넓이이기 때문에 그림의 축소에 문제가 존재한다.
다운로드할 네트워크 그림의 넓이와 높이가 고정되어 있다면, 같은 크기의 점위도를 설정할 수 있어 문제가 해결되었다.그러나 일반적인 상황에서 인터넷 사진은 확실하지 않기 때문에 이런 방법은 합리적이지 않다.우리는 두 가지 처리 방법이 있다(두 번째 방법을 권장한다).
첫 번째 방법: 비트맵에 대한 요구가 있어도 되고 없어도 된다면 Glide 비트맵 설정을 주석해 버릴 수 있다.(인터넷 그림을 불러오지 않았을 때 포토뷰는 빈 그림이다).
Glide.with(this)
        .load(url)
        /*.placeholder(R.mipmap.ic_default_man)*/ 
        .diskCacheStrategy(DiskCacheStrategy.RESULT)
        .into(iv_photo);


XML 레이아웃 파일에서 PhotoView의 부모 컨트롤은 Relativelayout이어야 하며 Linerlayout을 사용하면 측정된 PhotoView의 폭이 0으로 커집니다.
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center">

                <uk.co.senab.photoview.PhotoView
                    android:id="@+id/iv_photo"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:scaleType="fitCenter"/>

</RelativeLayout>

두 번째 방법: Glide에 다운로드 진도 감청을 설정하고 인터넷 사진 다운로드가 완료된 후에 PhotoView Attacher를 초기화합니다.
코드는 다음과 같습니다.
Glide.with(this)
        .load(url)
        .placeholder(R.mipmap.ic_default_man) //    
        .diskCacheStrategy(DiskCacheStrategy.RESULT)//      
        .listener(new RequestListener() {

                      @Override
                      public boolean onException(Exception e, Object model, Target target, boolean isFirstResource) {
                          Toast.makeText(PhotoViewActivity.this,
                                  "", Toast.LENGTH_SHORT).show();
                          return false;
                      }

                      @Override
                      public boolean onResourceReady(Object resource, Object model, Target target, boolean isFromMemoryCache, boolean isFirstResource) {
                          //                

                            // The MAGIC happens here!
                         mAttacher = new PhotoViewAttacher(iv_photo);

                         // Lets attach some listeners, not required though!
                         mAttacher.setOnMatrixChangeListener(new MatrixChangeListener());//    
                           mAttacher.setOnPhotoTapListener(new PhotoTapListener());//    
                           //mAttacher.setOnSingleFlingListener(new SingleFlingListener());//      
                          return false;
                      }
                  })
        .into(iv_photo);


참고로 원래 프로젝트 코드에 작은 문제가 있습니다. 데모 코드는 다음과 같습니다.

ImageView mImageView = (ImageView) findViewById(R.id.iv_photo);


ImageView는 xml 레이아웃 파일에서 사용자 정의되므로 다음과 같이 변경해야 합니다.

PhotoView mImageView = (PhotoView) findViewById(R.id.iv_photo);
 

좋은 웹페이지 즐겨찾기