как масштабировать изображение для просмотра изображений в onCreate, когда мне нужно использовать матрицу scaleType - PullRequest
1 голос
/ 27 января 2012

Я пытаюсь создать ImageView с функциями масштабирования.Я получил готовую функцию масштабирования, но теперь я хочу, чтобы изображение масштабировалось до ImageView при запуске Activity.Обычно я бы использовал ScaleType в макете xml, но для функции масштабирования он должен быть Matrix.Как я могу это сделать?

Я пытался решить этот вопрос: Матрица просмотра изображений Android + переводить

Matrix m = imageView.getImageMatrix();
RectF drawableRect = new RectF(0, 0, imageWidth, imageHeight);
RectF viewRect = new RectF(0, 0, imageView.getWidth(), imageView.getHeight());
m.setRectToRect(drawableRect, viewRect, Matrix.ScaleToFit.CENTER);
imageView.setImageMatrix(m);

Но проблема в том, что я не могуиспользуйте getWidth() и getHeight(), потому что это рано (возвращает только 0).Есть ли работа вокруг?Или как я могу это исправить?

Ответы [ 3 ]

1 голос
/ 31 декабря 2012

У меня была та же проблема с матрицей, масштабированием и просмотром изображения, и самое простое решение, которое я нашел, - визуализировать изображение дважды, один с помощью fitcenter scaleType и Matrix.

После многих (действительно многих ..) соблазнов с setRectToRect и решением, упомянутым ранее (и т. Д.), Я наконец-то нашел решение (по крайней мере, для моего случая, подобное посту):

В просмотре изображений в xml установите fitcenter:

    <ImageView
     ...
    android:scaleType="fitCenter"

Затем в вашем Java-файле определите функцию инициализации при изменении фокуса

public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    if (hasFocus) {
        init();
    }
}

private void init() {
    maxZoom = 10;
    minZoom = 1f;
    height = viewHeight;
    width = viewWidth;
    **Matrix m = imageSWT.getImageMatrix();
    imageSWT.setScaleType(ScaleType.MATRIX);
    matrix.set(m);**

}

Так что я используюсвойство fitcenter и затем я получаю его матрицу, после чего я переключаюсь в режим Matrix (для функции масштабирования) и сохраняю fitcentered-matrix в объект matrix-zoom для сохранения изменений при использовании масштабирования.

Надеюсь, это решение кому-нибудь поможет;)

1 голос
/ 27 января 2012

Вам необходимо добавить наблюдателя в ImageView, который будет вызываться при наложении объекта:

imageView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
       int width = imageView.getWidth();
       int height = imageView.getHeight();
       // do your stuff
    }
});
0 голосов
/ 27 января 2012

Единственный способ убедиться в ширине и высоте видов - это создать подкласс вида и переопределить onSizeChanged() и использовать заданную ширину / высоту или onLayout() и использовать getMeasuredHeight() и getMeasuredWidth().

Это означает, что ваша матрица не будет настроена до тех пор, пока onCreate() (до тех пор, пока представление не будет визуализировано в первый раз), но, по крайней мере, код, который вы разместили, мог бы быть полностьюв подклассе.

...