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.
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);
}
}
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();
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" />
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