2016-10-06 7 views
0

ImageView가 스크롤 가능한보기 안에 있습니다. 내가 이미지를 확대하면Android ImavaView 확대/축소되지 않음 Image

<jp.vuph.TwoDScrollView 
    android:id="@+id/two_d_scroll_view" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@android:color/white"> 
    <RelativeLayout 
     android:id="@+id/layout_drawing" 
     android:orientation="horizontal" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"> 
     <ImageView 
      android:id="@+id/image_view_main" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:scaleType="matrix" 
      android:layout_alignParentLeft="true" 
      android:layout_alignParentStart="true" 
      android:adjustViewBounds="true" 
      android:contentDescription="@string/contentDescription"/> 
    </RelativeLayout> 
</jp.vuph.TwoDScrollView> 

는, 그 이미지 뷰는 모든 확대 된 이미지를 워프하지 않는, 그래서 나는 볼 수 없습니다 껄의 일부가 내 코드

private class ScaleGestureListener implements ScaleGestureDetector.OnScaleGestureListener { 

    @Override 
    public boolean onScale(ScaleGestureDetector detector) { 
     d = mImageViewMain.getDrawable(); 
     mScale *= detector.getScaleFactor(); 

     float xDiff = initialFocalPoints[0] - currentFocalPoints[0]; 
     float yDiff = initialFocalPoints[1] - currentFocalPoints[1]; 

     matrix.setScale(mScale, mScale, currentFocalPoints[0], currentFocalPoints[1]); 
     matrix.postTranslate(xDiff, yDiff); 
     mImageViewMain.setImageMatrix(matrix); 
     return true; 
    } 

    @Override 
    public boolean onScaleBegin(ScaleGestureDetector detector) { 
     float startX = detector.getFocusX(); 
     float startY = detector.getFocusY(); 

     initialFocalPoints = new float[]{startX, startY}; 
     Matrix inverseTransformMatrix = new Matrix(); 
     if(matrix.invert(inverseTransformMatrix)) 
     inverseTransformMatrix.mapPoints(currentFocalPoints, initialFocalPoints); 
     return true; 
    } 

    @Override 
    public void onScaleEnd(ScaleGestureDetector detector) { 
     return; 
    } 

입니다 그것은 가능하다 ImageView가 모든 확대 된 이미지를 래핑하게 만드시겠습니까? 나는 여러 가지 방법을 시도했지만 여전히 그렇게 할 수는 없다.

답변

0

내가 옳다면 다음과 같은 일이 일어납니다. 초점을 확대하고 다른 초점에서 축소 할 때 이미지 가장자리에 공백이 표시됩니다. t 중심.

내 맞춤 핀치 확대 이미지보기에서이 문제를 해결해야했습니다. 변환 된 이미지의 경계를 ImageView 경계와 대조하여 검사해야하며 경계가 ImageView 내에 있으면 빈 공간을 해결하기 위해 추가 변환을 추가해야합니다.

이렇게하려면 이미지 변환의 모양을 미리보기 위해 Matrix.mapRect()을 사용했습니다.

이러한 속성입니다, 그래서 당신은 한 번만 각 RectF 할당 : 당신은 모든 측정 배치 된 후 때까지이 작업을 수행 할 수

 RectF imageRect = new RectF(0, 0, bitmap.getIntrinsicWidth(), bitmap.getIntrinsicHeight()); 

     RectF viewRect = new RectF(0, 0, mImageViewMain.getWidth(), mImageViewMain.getHeight()); 

     RectF transform = new RectF(); 

참고.

setScale()postTranslate()onScale()에 따라와 코드를 넣어하지만 mImageViewMain.setImageMatrix(matrix);

 matrix.mapRect(transform, imageRect); // dst, src 

     // for this code to work, your matrix scaleX/Y can never be less that 1.0 

     float xAdj = 0F; 
     float yAdj = 0F; 
     if (transform.left > 0) { // blank space on left 
      xAdj = - transform.left; 
     } else if (transform.right < mImageViewMain.getWidth()) { // on right 
      xAdj = mImageViewMain.getWidth() - transform.right; 
     } 

     if (transform.top > 0) { // blank space on top 
      yAdj = - transform.top; 
     } else if (transform.bottom < mImageViewMain.getHeight()) { // on bottom 
      yAdj = mImageViewMain.getHeight() - transform.bottom; 
     } 

     matrix.postScale(xAdj, yAdj); 

전에 그 코드는 정확히 잘되지 않을 수도 있습니다,하지만 당신은 아이디어를 얻을. matrix.mapRect()을 사용하여 공백이 있는지 확인한 다음 matrix.postScale()을 호출하여 공백을 수정하십시오.

내가 코드에서 제외 부분은 당신이 그렇게 때로는 경계가되고 싶어 , 이미지의 가로 세로 비율이 ImageView의 가로 세로 비율과 일치하지 않을 수 있기 때문에 좀 더 화려한 계산에 넣어야 할 것입니다

안쪽에 있지만 이미지가 중앙에 오도록 조정해야합니다. 그것은 단지 많은 수학입니다.