图片放大问题的通用图像装载机和查看传呼机 [英] Image Zoom Issue with Universal Image Loader and View Pager

查看:335
本文介绍了图片放大问题的通用图像装载机和查看传呼机的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想使用ImageViewZoom在ImagePagerActivity通用图像装载机。

我能够形象,滑动缩放到下一个图像。但我现在面临的问题,当图像在变焦位置。

如果图像被放大,我在中锋位置上,如果我希望看到相同的图像的右侧部分,刷卡离开它要下一个图像。请帮我做这个。

这里是我的XML code:

 <的FrameLayout的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    机器人:layout_width =FILL_PARENT
    机器人:layout_height =FILL_PARENT
    机器人:填充=1dip>

  < it.sephiroth.android.library.imagezoom.ImageViewTouch
     机器人:layout_weight =1
     机器人:ID =@ + ID /图像
     机器人:layout_width =FILL_PARENT
     机器人:layout_height =FILL_PARENT
     机器人:scaleType =fitCenter/>

  <进度
    机器人:ID =@ + ID /加载
    机器人:layout_width =WRAP_CONTENT
    机器人:layout_height =WRAP_CONTENT
    机器人:layout_gravity =中心
    机器人:能见度=水涨船高/>

< /的FrameLayout>
 

编辑:

感谢您NOSTRA,我现在能够控制缩放和滑动与下面code。但随着多问题触摸变焦。我不能够放大用两个手指。

下面是我的previous code(工作正常用两个手指):

 公共类ScaleListener扩展ScaleGestureDetector.SimpleOnScaleGestureListener {


        @覆盖
        公共布尔onScale(ScaleGestureDetector检测器){
            Log.d(LOG_TAGonScale);
            浮动跨度= detector.getCurrentSpan() -  detector.get previousSpan();
            浮targetScale = mCurrentScaleFactor * detector.getScaleFactor();
            如果(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;
                无效();
                返回true;
            }
            返回false;
        }
    }
 

和下面是修改之一:

 公共类ScaleListener扩展ScaleGestureDetector.SimpleOnScaleGestureListener {
        @覆盖
        公共布尔onScaleBegin(ScaleGestureDetector检测器){
            externalScaleListener.onScaleBegin();
                返回super.onScaleBegin(探测器);
        }
        @覆盖
        公共无效onScaleEnd(ScaleGestureDetector检测器){
            externalScaleListener.onScaleEnd(mCurrentScaleFactor);
        }
    }
 

解决方案

首先,你必须能够听的图像缩放。 ImageViewTouch不支持此功能(如手势ImageView的支持),所以你应该自己实现了。

修改 ImageViewTouch.java 是这样的:

 公共类ImageViewTouch扩展ImageViewTouchBase {

    ...

    私人OnPageScaleListener externalScaleListener;

    公共无效setOnScaleListener(OnPageScaleListener onScaleListener){
        this.externalScaleListener = onScaleListener;
    }

    公共接口OnPageScaleListener {
        无效onScaleBegin();

        无效onScaleEnd(浮动比例);
    }

    @覆盖
    保护无效onZoom(浮动比例){
        super.onZoom(规模);
        如果(!mScaleDetector.isInProgress()){
            mCurrentScaleFactor =规模;
            externalScaleListener.onScaleEnd(规模);
        }
    }

    公共类ScaleListener扩展ScaleGestureDetector.SimpleOnScaleGestureListener {
        @覆盖
        公共布尔onScaleBegin(ScaleGestureDetector检测器){
            externalScaleListener.onScaleBegin();
                返回super.onScaleBegin(探测器);
        }

        ...

        @覆盖
        公共无效onScaleEnd(ScaleGestureDetector检测器){
            externalScaleListener.onScaleEnd(mCurrentScaleFactor);
        }
    }

    ...
}
 

然后用接下来的实施 ViewPager 的应用程序中的:

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

/ **
 * {@link ViewPager}可停用(忽略触摸事件)
 *
 * @author谢尔盖Tarasevich
 * @Created 2012年7月19日
 * /
公共类DeactivableViewPager扩展ViewPager {

    私人布尔激活= TRUE;

    公共DeactivableViewPager(上下文的背景下){
        超(上下文);
    }

    公共DeactivableViewPager(上下文的背景下,ATTRS的AttributeSet){
        超(背景下,ATTRS);
    }

    公共无效启动(){
        激活= TRUE;
    }

    公共无效停用(){
        激活= FALSE;
    }

    @覆盖
    公共布尔onInterceptTouchEvent(MotionEvent事件){
        如果(激活){
            尝试 {
                返回super.onInterceptTouchEvent(事件);
            }赶上(例外五){//有时会发生
                返回true;
            }
        } 其他 {
        返回false;
    }
    }

    @覆盖
    公共布尔的onTouchEvent(MotionEvent事件){
        尝试 {
            返回super.onTouchEvent(事件);
        }赶上(例外五){
            返回true;
        }
    }
}
 

然后在您的ViewPager的适配器,你应该设置一个比额表监听器为您ImageViewTouch:

  ImageViewTouch的ImageView = ...;
imageView.setOnScaleListener(新OnPageScaleListener(){
    @覆盖
    公共无效onScaleBegin(){
        viewPager.deactivate();
    }

    @覆盖
    公共无效onScaleEnd(浮动比例){
        如果(规模> 1.0){
            viewPager.deactivate();
        } 其他 {
            viewPager.activate();
        }
    }
});

imageLoader.displayImage(URL,ImageView的,...);
 

,不要忘记在ImageLoader的配置设置大值 maxImage *** ForMemoryCache 所以UIL进行解码,以位图过程中不会降尺度的原始图像:

  ImageLoaderConfiguration配置=新ImageLoaderConfiguration.Builder(getApplicationContext())
        ...
        .memoryCacheExtraOptions(3000,3000)
        ...
        。建立();
 

I'd like to use ImageViewZoom with Universal Image Loader in ImagePagerActivity.

I am able to zoom the image, Swipe to the next image. But i am facing problem when image is in Zoom position.

if an image is zoomed and i am at center position, if i want to see the right side part of the same image and swipe left it is going to the next image. Please help me in doing this.

here is my XML code:

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

Thank you NOSTRA, Now i am able to control the zoom and slide with the below code. But the problem with Multi touch zoom. I am not able to zoom with two fingers.

Here is my previous code(working fine with two finger):

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

And here is the Modified one:

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

解决方案

First you must be able to listen scaling of image. ImageViewTouch doesn't support this feature (e.g gesture-imageview support it) so you should implement it yourself.

Change ImageViewTouch.java like this:

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

    ...
}

Then use next implementation of ViewPager in your application:

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

Then in your ViewPager's adapter you should set next scale listener for your 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, ...);

And don't forget set big values for maxImage***ForMemoryCache in ImageLoader's configuration so UIL won't downscale original images during decoding to Bitmaps:

ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())
        ...
        .memoryCacheExtraOptions(3000, 3000)
        ...
        .build();

这篇关于图片放大问题的通用图像装载机和查看传呼机的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆