2010-01-29 5 views
4

나는 (이것은 일반적인 질문이라고 생각되지만) android 용 앱을 작성하고 있으며 스크롤 및 확대/축소 가능한 큰 이미지 (ImageView에서)를 표시해야합니다. 나는 터치 이벤트를 캡쳐하고 매트릭스 변환을 수행함으로써 작업 스크롤을 할 수 있었고 이제 나는 확대 작업을하고있다.이미지 확대/축소를위한 올바른 변환

이미지에 축척 변환을 적용하기 만하면 화면의 왼쪽 상단 모서리에서 확대됩니다. 화면의 중앙을 확대하고 싶습니다. 필자가 읽은 바로는, 화면의 중심을 원점으로 만들기위한 변환이 필요하다는 것을 의미합니다. 내가 화면의 중심이 가정 다음과 같은 - 등 뭔가 (5, 5) 편의를 위해 ...

-Translate by (-5, -5)
-Scale by the zoom factor
-Translate by (+5, +5)*zoomfactor

불행히도이 무엇을 필요 생각이 나던 줌 갈 것 같다 워크 보인다 어디에서든지 ... 센터는 ... 누군가 나를 도와 줄 수 있습니까?

편집 :이 이제 안드로이드 소스 코드의 카메라 응용 프로그램에서

Matrix zoommatrix = new Matrix(); 
    float[] centerpoint = {targetimageview.getWidth()/2.0f, targetimageview.getHeight()/2.0f}; 

    zoommatrix.postScale(zoomfactor, zoomfactor, centerpoint[0], centerpoint[1]); 
    zoommatrix.preConcat(targetimageview.getImageMatrix()); 

    targetimageview.setImageMatrix(zoommatrix); 
    targetimageview.invalidate(); 
+0

당신이 당신의 변환 코드를 게시 할 수 있습니다 : 센터 방법은 당신이 정말로 걱정하는거야 비트가 아마도

protected void zoomTo(float scale, float centerX, float centerY) { if (scale > mMaxZoom) { scale = mMaxZoom; } float oldScale = getScale(); float deltaScale = scale/oldScale; mSuppMatrix.postScale(deltaScale, deltaScale, centerX, centerY); setImageMatrix(getImageViewMatrix()); center(true, true); } 

그건 : 그 "zoomTo"방법이 무엇입니까? – AGrunewald

답변

3

확인 ImageViewTouchBase를 작동하는 코드;

protected void center(boolean horizontal, boolean vertical) { 
    if (mBitmapDisplayed.getBitmap() == null) { 
     return; 
    } 

    Matrix m = getImageViewMatrix(); 

    RectF rect = new RectF(0, 0, 
      mBitmapDisplayed.getBitmap().getWidth(), 
      mBitmapDisplayed.getBitmap().getHeight()); 

    m.mapRect(rect); 

    float height = rect.height(); 
    float width = rect.width(); 

    float deltaX = 0, deltaY = 0; 

    if (vertical) { 
     int viewHeight = getHeight(); 
     if (height < viewHeight) { 
      deltaY = (viewHeight - height)/2 - rect.top; 
     } else if (rect.top > 0) { 
      deltaY = -rect.top; 
     } else if (rect.bottom < viewHeight) { 
      deltaY = getHeight() - rect.bottom; 
     } 
    } 

    if (horizontal) { 
     int viewWidth = getWidth(); 
     if (width < viewWidth) { 
      deltaX = (viewWidth - width)/2 - rect.left; 
     } else if (rect.left > 0) { 
      deltaX = -rect.left; 
     } else if (rect.right < viewWidth) { 
      deltaX = viewWidth - rect.right; 
     } 
    } 

    postTranslate(deltaX, deltaY); 
    setImageMatrix(getImageViewMatrix()); 
} 
+0

Excelent! 내가 필요한 것은 규모뿐만 아니라 지점을 차지하는 postScale()의 오버로드입니다. 줌 코드는 이제 다음과 같이 보입니다 ... 좋아, 맞지 않아, 내 질문을 편집하여 포함시킵니다. 필요한 모든 것은 현재 변환 행렬에 scale()의 네 가지 인수 형식에 의해 생성 된 행렬을 곱하는 것이 었습니다. –

관련 문제