Problem z powiększeniem obrazu z Universal Image Loader I View Pager

Chciałbym użyć ImageViewZoom z Universal Image Loader w ImagePagerActivity.

Jestem w stanie powiększyć obraz, przesuń palcem do następnego obrazu. Ale mam problem, gdy obraz jest w pozycji zoomu.

Tutaj wpisz opis obrazka

Jeśli obraz jest powiększony, a ja jestem w pozycji środkowej, jeśli chcę zobaczyć prawą część tego samego obrazu i przesuń palcem w lewo, przechodzi do następnego obrazu. Proszę, pomóż mi w tym.

Oto mój XML kod:

<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>

EDIT:

Dziękuję NOSTRA, teraz jestem w stanie kontrolować zoom i slajd za pomocą poniższego kodu. Ale problem z Multi touch zoom. Nie jestem w stanie powiększyć dwoma palcami.

Oto mój poprzedni kod (działa dobrze z dwoma palcami):

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

A oto zmodyfikowany:

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);
        }
    }
Author: wolverine, 2012-11-15

2 answers

Najpierw musisz być w stanie słuchać skalowania obrazu. ImageViewTouch nie obsługuje tej funkcji (np. G gest-imageview obsługuje ją), więc powinieneś ją zaimplementować samodzielnie.

Zmień ImageViewTouch.java tak:

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

    ...
}

Następnie użyj następnej implementacji ViewPager w swojej aplikacji:

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

Następnie w adapterze Viewpagera należy ustawić następny detektor skali dla 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, ...);

I nie zapomnij ustawić dużych wartości dla maxImage***ForMemoryCache W ImageLoader ' s Konfiguracja, aby UIL nie zmniejszył oryginalnych obrazów podczas dekodowania do Bitmap:

ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())
        ...
        .memoryCacheExtraOptions(3000, 3000)
        ...
        .build();
 8
Author: nostra13,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-15 20:32:22

Miałem problem z wstępnie powiększonymi obrazami w viewPager, ale teraz jest w porządku i rozwiązałem problem.

Musisz przeszukać klasę ImageViewTouchBase dla tej linii:

protected DisplayType mScaleType = DisplayType.NONE;

Następnie zmień go na:

protected DisplayType mScaleType = DisplayType.FIT_TO_SCREEN;

Domyślnie DisplayType jest ustawiony na NONE, to proste, wystarczy użyć FIT_TO_SCREEN, a twoje obrazy będą w domyślnym rozmiarze podczas przesuwania w viewPager.

Cheers


Możesz ustawić te właściwości tak, aby obraz zawsze pasował do ekranu

<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" />
 0
Author: blueware,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-08 08:56:28