2010-01-29 4 views
4

Я пишу приложение для Android (хотя я думаю, что это общий вопрос), и мне нужно отобразить большое изображение (в ImageView), которое можно прокручивать и масштабировать. Мне удалось получить прокрутку, чтобы работать, захватывая события касания и выполняя переводы матриц, и теперь я работаю над масштабированием.Правильные преобразования для масштабирования изображения

Если я просто применяю масштабное преобразование к изображению, оно масштабируется в начале координат, которое является верхним левым углом экрана. Я хотел бы увеличить масштаб в центре экрана. Из того, что я читал, это означает, что мне нужно преобразование, чтобы сделать начало координат в центре экрана. Я думаю, что требуется что-то вроде включено следующее: предположим, что центр экрана (5, 5) для простоты ...

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

Unfortunatly, это не кажется, что работы- трансфокатора, кажется, идет где-нибудь, НО центр ... может кто-то помочь мне здесь?

EDIT: Это код, который теперь работает

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

вы можете разместить свой код преобразования? – AGrunewald

ответ

3

Проверить ImageViewTouchBase в приложении камеры исходного кода в Android; его метод «zoomTo» делает это:

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); 
} 

Этот центр метод, вероятно, немного вы действительно заботитесь о:

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

Отличный! Мне нужна была перегрузка postScale(), которая занимала точку, а также масштаб lol. Код масштабирования теперь выглядит так ... Хорошо, это не подходит, я отредактирую свой вопрос, чтобы включить его. Все, что было необходимо, состояло в том, чтобы умножить текущую матрицу преобразования на единицу, сгенерированную четырьмя аргументами формы scale() –

Смежные вопросы