Проблема с масштабированием изображения при использовании универсального загрузчика изображений и пейджера просмотра

Я хочу использовать ImageViewZoom с универсальным загрузчиком изображений в ImagePagerActivity.

Я могу увеличить изображение, проведите пальцем к следующему изображению. Но я сталкиваюсь с проблемой, когда изображение находится в положении увеличения.

введите описание изображения здесь

Если изображение увеличено, и я нахожусь в центре, если я хочу увидеть правую часть того же изображения и провести пальцем влево, он перейдет к следующему изображению. Пожалуйста, помогите мне в этом.

вот мой XML-код:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="1dip" >

  <it.sephiroth.android.library.imagezoom.ImageViewTouch
     android:layout_weight="1"
     android:id="@+id/image"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
     android:scaleType="fitCenter" />

  <ProgressBar
    android:id="@+id/loading"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:visibility="gone" />

</FrameLayout>

РЕДАКТИРОВАТЬ:

Спасибо, NOSTRA, теперь я могу управлять масштабированием и перемещением с помощью приведенного ниже кода. Но проблема с мультитач-зумом. Я не могу увеличивать изображение двумя пальцами.

Вот мой предыдущий код (отлично работает двумя пальцами):

public class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {


        @Override
        public boolean onScale( ScaleGestureDetector detector ) {
            Log.d( LOG_TAG, "onScale" );
            float span = detector.getCurrentSpan() - detector.getPreviousSpan();
            float targetScale = mCurrentScaleFactor * detector.getScaleFactor();
            if ( mScaleEnabled ) {
                targetScale = Math.min( getMaxZoom(), Math.max( targetScale, getMinZoom()-0.1f ) );
                zoomTo( targetScale, detector.getFocusX(), detector.getFocusY() );
                mCurrentScaleFactor = Math.min( getMaxZoom(), Math.max( targetScale, getMinZoom()-1.0f ) );
                mDoubleTapDirection = 1;
                invalidate();
                return true;
            }
            return false;
        }
    }

А вот и Модифицированный:

public class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
        @Override
        public boolean onScaleBegin(ScaleGestureDetector detector) {
            externalScaleListener.onScaleBegin();
                return super.onScaleBegin(detector);
        }
        @Override
        public void onScaleEnd(ScaleGestureDetector detector) {
            externalScaleListener.onScaleEnd(mCurrentScaleFactor);
        }
    }

person wolverine    schedule 15.11.2012    source источник
comment
Привет, я тоже ищу то же самое .. Решили ли вы проблему. Когда я попытался загрузить изображение с помощью ImageViewTouch в ViewPager Activity, я не смог увидеть изображение.   -  person sam_k    schedule 25.04.2013
comment
Пожалуйста, помогите мне решить мою проблему   -  person sam_k    schedule 25.04.2013
comment
@Sam_k, приведенный ниже код отлично работает ...   -  person wolverine    schedule 25.04.2013
comment
Вы проделали это с помощью страницы универсального загрузчика изображений и ImageViewTouch? Я тоже собираюсь это сделать .. Я прав?   -  person sam_k    schedule 25.04.2013
comment
Да .. Я уже делал это в Моем приложении .. Вы можете это сделать ..   -  person wolverine    schedule 25.04.2013
comment
Я уверен ... Если я столкнусь с какой-либо проблемой, я свяжусь с вами, пожалуйста, помогите мне, если это необходимо.   -  person sam_k    schedule 25.04.2013
comment
Конечно ... Я вам помогу ..   -  person wolverine    schedule 25.04.2013
comment
что это mCurrentScaleFactor = scale;? Я не могу найти это в ImageviewTouch? эта переменная-член в суперклассе?   -  person sam_k    schedule 26.04.2013
comment
это только в классе ImageViewTouch .. это используется для ограничения действия пейджера.   -  person wolverine    schedule 26.04.2013
comment
Спасибо за ответ. Но это не было объявлено там .. Я должен объявить там какую-либо переменную-член?   -  person sam_k    schedule 26.04.2013
comment
@wolverine, значит, с кодом ниже проблема с просмотром изображения при увеличении исчезла? или вы реализовали жест-изображение? Кажется, я не могу заставить его работать. Буду рада помощи. Сначала вы изменяете Imageviewtouch и создаете новый файл для добавления в библиотеки. Затем вы создаете файл DeactivableViewPager.java? а затем реализовать его в Imagepageractivity? Я просто не могу заставить его работать.   -  person Joe    schedule 07.05.2013


Ответы (2)


Сначала вы должны уметь слышать масштабирование изображения. ImageViewTouch не поддерживает эту функцию (например, gesture-imageview поддерживает ее), поэтому вам следует реализовать ее самостоятельно. .

Измените ImageViewTouch.java следующим образом:

public class ImageViewTouch extends ImageViewTouchBase {

    ...

    private OnPageScaleListener externalScaleListener;

    public void setOnScaleListener(OnPageScaleListener onScaleListener) {
        this.externalScaleListener = onScaleListener;
    }

    public interface OnPageScaleListener {
        void onScaleBegin();

        void onScaleEnd(float scale);
    }

    @Override
    protected void onZoom(float scale) {
        super.onZoom(scale);
        if (!mScaleDetector.isInProgress()) {
            mCurrentScaleFactor = scale;
            externalScaleListener.onScaleEnd(scale);
        }
    }

    public class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
        @Override
        public boolean onScaleBegin(ScaleGestureDetector detector) {
            externalScaleListener.onScaleBegin();
                return super.onScaleBegin(detector);
        }

        ...

        @Override
        public void onScaleEnd(ScaleGestureDetector detector) {
            externalScaleListener.onScaleEnd(mCurrentScaleFactor);
        }
    }

    ...
}

Затем используйте следующую реализацию ViewPager в своем приложении:

import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;

/**
 * {@link ViewPager} which can be deactivated (ignore touch events)
 * 
 * @author Sergey Tarasevich
 * @created 19.07.2012
 */
public class DeactivableViewPager extends ViewPager {

    private boolean activated = true;

    public DeactivableViewPager(Context context) {
        super(context);
    }

    public DeactivableViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public void activate() {
        activated = true;
    }

    public void deactivate() {
        activated = false;
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        if (activated) {
            try {
                return super.onInterceptTouchEvent(event);
            } catch (Exception e) { // sometimes happens
                return true;
            }
        } else {
        return false;
    }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        try {
            return super.onTouchEvent(event);
        } catch (Exception e) {
            return true;
        }
    }
}

Затем в адаптере ViewPager вы должны установить слушателя следующего масштаба для вашего ImageViewTouch:

ImageViewTouch imageView = ...;
imageView.setOnScaleListener(new OnPageScaleListener() {
    @Override
    public void onScaleBegin() {
        viewPager.deactivate();
    }

    @Override
    public void onScaleEnd(float scale) {
        if (scale > 1.0) {
            viewPager.deactivate();
        } else {
            viewPager.activate();
        }
    }
});

imageLoader.displayImage(url, imageView, ...);

И не забудьте установить большие значения для maxImage***ForMemoryCache в конфигурации ImageLoader, чтобы UIL не уменьшал масштаб исходных изображений во время декодирования в растровые изображения:

ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())
        ...
        .memoryCacheExtraOptions(3000, 3000)
        ...
        .build();
person nostra13    schedule 15.11.2012
comment
Привет, я также использовал жест-изображение, хотя у меня такая же проблема. - person wolverine; 16.11.2012
comment
Я могу управлять масштабированием изображения и перемещением с помощью приведенного выше кода, но я могу увеличивать масштаб, используя только двойное нажатие. Я хочу, чтобы функция масштабирования также использовалась двумя пальцами. Как я могу это сделать. Пожалуйста, посмотрите мое редактирование. - person wolverine; 16.11.2012
comment
Вам следует не заменять ScaleListener, а добавлять методы onScaleBegin() и onScaleEnd(). Был 3 способ ... - person nostra13; 16.11.2012
comment
@NOSTRA После добавления этого класса DeactivableViewPager в UIL. что мне делать после этого? Мне нужно расширить этот класс вместо PageAdapter? - person sam_k; 26.04.2013
comment
@Sam_k Нет, вы по-прежнему расширяете PagerAdapter, но вы меняете тип переменной экземпляра ViewPager на DeactivableViewPager, а в методе ImagePagerAdapter instantiateItem вы меняете строку на ImageViewTouch imageView = (ImageViewTouch) imageLayout.findViewById (R.id.pager_image); - person brendan; 30.07.2013
comment
@NOSTRA Я добавил ваш код, и это позволяет мне успешно увеличивать и уменьшать масштаб, однако активность пейджера иногда не позволяет мне перейти к следующему изображению. Если я масштабирую изображение, увеличивая или уменьшая масштаб, тогда я могу перейти к следующему изображению. Я помещаю операторы печати в onScale, и похоже, что это происходит при масштабировании ›1. Знаете ли вы, что может вызвать эту проблему? - person brendan; 01.08.2013

У меня были проблемы с предварительно увеличенными изображениями в viewPager, но теперь все в порядке и проблема решена.

Вы должны найти в классе ImageViewTouchBase эту строку:

protected DisplayType mScaleType = DisplayType.NONE;

затем измените его на:

protected DisplayType mScaleType = DisplayType.FIT_TO_SCREEN;

По умолчанию DisplayType установлен на NONE, это просто, просто используйте FIT_TO_SCREEN, и ваши изображения будут иметь размер по умолчанию при перемещении в viewPager.

Ваше здоровье


Вы можете настроить эти свойства, чтобы изображение всегда соответствовало экрану.

<it.sephiroth.android.library.imagezoom.ImageViewTouch
    android:id="@+id/iv_pager_image"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:adjustViewBounds="true"
    android:contentDescription="@string/descr_image"
    android:scaleType="matrix" />
person blueware    schedule 14.11.2013