Android 通用图像加载程序和视图寻呼机的图像缩放问题
我想在ImagePagePractivity中使用带有通用图像加载程序的ImageViewZoom 我可以缩放图像,滑动到下一个图像。但当图像处于缩放位置时,我面临着这个问题 如果一个图像被放大,我处于中间位置,如果我想看到同一图像的右侧部分并向左滑动,它将转到下一个图像。请帮我做这件事 以下是我的XML代码:Android 通用图像加载程序和视图寻呼机的图像缩放问题,android,android-viewpager,zooming,universal-image-loader,Android,Android Viewpager,Zooming,Universal Image Loader,我想在ImagePagePractivity中使用带有通用图像加载程序的ImageViewZoom 我可以缩放图像,滑动到下一个图像。但当图像处于缩放位置时,我面临着这个问题 如果一个图像被放大,我处于中间位置,如果我想看到同一图像的右侧部分并向左滑动,它将转到下一个图像。请帮我做这件事 以下是我的XML代码: <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layou
<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>
这是修改后的一个:
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);
}
}
首先,您必须能够听到图像的缩放。ImageViewTouch不支持此功能(例如支持它),因此您应该自己实现它 更改
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, ...);
不要忘记在ImageLoader的配置中为maxImage***FormMemoryCache
设置大值,以便UIL在解码到位图时不会缩小原始图像的比例:
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())
...
.memoryCacheExtraOptions(3000, 3000)
...
.build();
我在viewPager中使用预缩放图像时遇到问题,但现在一切正常并解决了问题 您必须在ImageViewTouchBase类中搜索此行:
protected DisplayType mScaleType = DisplayType.NONE;
然后将其更改为:
protected DisplayType mScaleType = DisplayType.FIT_TO_SCREEN;
默认情况下,DisplayType设置为NONE,这很简单,只需使用FIT_to_屏幕,在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" />
Hi,我也使用了手势图像视图,尽管我遇到了同样的问题。我可以使用上面的代码控制图像缩放和滑动,但我只需双击即可进行缩放。我想通过使用两个手指也缩放功能。我该怎么做呢。请看我的编辑。您不应该替换ScaleListener,而应该附加onScaleBegin()
和onScaleEnd()
方法。在UIL中添加了这个类deactivatableviewpager
之后,出现了第三个方法…@NOSTRA。在这之后我要做什么?我必须扩展这个类而不是PageAdapter?@Sam_k否,您仍然扩展PagerAdapter,但是您将实例变量ViewPager的类型更改为DeactivableViewPager,并且在ImagePagerAdapter实例化Item方法中,您将行更改为ImageViewTouch imageView=(ImageViewTouch)imageLayout.findViewById(R.id.pager_image);嗨,我也在找同样的。。你们解决问题了吗。当我尝试在ViewPager活动中使用ImageViewTouch加载图像时,我无法看到图像。请帮助我解决问题issue@Sam_k,下面的代码工作得很好…你用通用图像加载器页面活动和ImageViewTouch做过这件事吗?我也打算这么做。。我说得对吗?是的。。我已经在我的应用程序中这样做了。。你能做到的。。
<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" />