如何修改TouchImageView与双击放大和缩小? [英] How do I modify TouchImageView with double tap to zoom in and out?

查看:102
本文介绍了如何修改TouchImageView与双击放大和缩小?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我修改TouchImageView(https://github.com/MikeOrtiz/TouchImageView/issues)有放大和缩小的,当你双击。我已经开始按照这一职位 - 如何TouchImageView工作并添加了手势检测?

现在我要实现的放大和缩小而我不知道该怎么办。这里是code我迄今为止的zoomIn和zoomOut方法未实现。任何人都知道如何做到这一点?另外我注意到,双指缩放并没有真正放大到你捏的位置,所以我希望这可以作出的行为更像gallery3D双指缩放。谢谢你。

 进口android.content.Context;
进口android.graphics.Bitmap;
进口android.graphics.Matrix;
进口android.graphics.PointF;
进口android.util.AttributeSet;
进口android.view.GestureDetector;
进口android.view.GestureDetector.SimpleOnGestureListener;
进口android.view.MotionEvent;
进口android.view.ScaleGestureDetector;
进口android.view.ScaleGestureDetector.SimpleOnScaleGestureListener;
进口android.view.View;
进口android.widget.ImageView;

公共类TouchImageView扩展ImageView的{

私有静态最后字符串变量= TouchImageView.class.getSimpleName();

字模=新的Matrix();

//我们可以在这3个状态之一
静态最终诠释无= 0;
静态最终诠释DRAG = 1;
静态最终诠释ZOOM = 2;
INT模式=无;

//记住一些东西放大
的PointF最后=新的PointF();
的PointF开始=新的PointF();
浮minScale = 1F;
浮maxScale = 3F;
浮动[]米;

浮redundantXSpace,redundantYSpace;

浮动宽度,高度;
静态最终诠释CLICK = 3;
浮saveScale = 1F;
浮动右,下,origWidth,origHeight,bmWidth,bmHeight;

ScaleGestureDetector mScaleDetector;

私人GestureDetector gestureDetector;

上下文语境;

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

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

公共无效的init(上下文的背景下){
    gestureDetector =新GestureDetector(新DoubleTapGestureListener());

    super.setClickable(真正的);
    this.context =背景;
    mScaleDetector =新ScaleGestureDetector(上下文,新ScaleListener());
    matrix.setTranslate(1F,1F);
    M =新的浮动[9];
    setImageMatrix(矩阵);
    setScaleType(ScaleType.MATRIX);

    setOnTouchListener(新OnTouchListener(){

        @覆盖
        公共布尔onTouch(视图V,MotionEvent事件){

            如果(gestureDetector.onTouchEvent(事件)){
                返回true;
            }

            mScaleDetector.onTouchEvent(事件);

            matrix.getValues​​(米);
            浮法X = M [Matrix.MTRANS_X]
            浮动Y = M [Matrix.MTRANS_Y]
            的PointF CURR =新的PointF(event.getX(),event.getY());

            开关(event.getAction()){
            案例MotionEvent.ACTION_DOWN:
                last.set(event.getX(),event.getY());
                start.set(最后一次);
                模式=阻力;
                打破;
            案例MotionEvent.ACTION_MOVE:
                如果(模式==拖动){
                    浮DELTAX = curr.x  -  last.x;
                    漂浮移动deltaY = curr.y  -  last.y;
                    浮scaleWidth = Math.round(origWidth * saveScale);
                    浮scaleHeight = Math.round(origHeight * saveScale);
                    如果(scaleWidth<宽度){
                        DELTAX = 0;
                        如果(Y +移动deltaY大于0)
                            移动deltaY = -y;
                        否则,如果(Y +移动deltaY<汉字)
                            移动deltaY =  - (Y +底部);
                    }否则如果(scaleHeight<高度){
                        移动deltaY = 0;
                        如果(X + DELTAX大于0)
                            DELTAX = -x;
                        否则,如果(X + DELTAX<右汉字)
                            DELTAX =  - (X +右);
                    } 其他 {
                        如果(X + DELTAX大于0)
                            DELTAX = -x;
                        否则,如果(X + DELTAX<右汉字)
                            DELTAX =  - (X +右);

                        如果(Y +移动deltaY大于0)
                            移动deltaY = -y;
                        否则,如果(Y +移动deltaY<汉字)
                            移动deltaY =  - (Y +底部);
                    }
                    matrix.postTranslate(DELTAX,移动deltaY);
                    last.set(curr.x,curr.y);
                }
                打破;

            案例MotionEvent.ACTION_UP:
                模式=无;
                INT xDiff =(INT)Math.abs(curr.x  -  start.x);
                INT yDiff =(INT)Math.abs(curr.y  -  start.y);
                如果(xDiff<点击&功放;&安培; yDiff<点击)
                    performClick();
                打破;

            案例MotionEvent.ACTION_POINTER_UP:
                模式=无;
                打破;
            }
            setImageMatrix(矩阵);
            无效();
            返回true; //表示事件已经被处理
        }

    });
}

@覆盖
公共无效setImageBitmap(位图BM){
    super.setImageBitmap(BM);
    bmWidth = bm.getWidth();
    bmHeight = bm.getHeight();
}

公共无效setMaxZoom(浮X){
    maxScale = X;
}

私有类ScaleListener扩展SimpleOnScaleGestureListener {
    @覆盖
    公共布尔onScaleBegin(ScaleGestureDetector检测器){
        模式=变焦;
        返回true;
    }

    @覆盖
    公共布尔onScale(ScaleGestureDetector检测器){

        LogUtil.i(TAG,detector.getScaleFactor()++ detector.getFocusX()++ detector.getFocusY());

        浮动mScaleFactor =(浮点)Math.min(Math.max(.95f,detector.getScaleFactor()),1.05);
        浮origScale = saveScale;
        saveScale * = mScaleFactor;
        如果(saveScale> maxScale){
            saveScale = maxScale;
            mScaleFactor = maxScale / origScale;
        }否则如果(saveScale< minScale){
            saveScale = minScale;
            mScaleFactor = minScale / origScale;
        }
        右=宽* saveScale  - 宽 - (2 * redundantXSpace * saveScale);
        底部=身高* saveScale  - 高 - (2 * redundantYSpace * saveScale);
        如果(origWidth * saveScale< =宽度|| origHeight * saveScale< =身高){
            matrix.postScale(mScaleFactor,mScaleFactor,宽/ 2,高度/ 2);
            如果(mScaleFactor&小于1){
                matrix.getValues​​(米);
                浮法X = M [Matrix.MTRANS_X]
                浮动Y = M [Matrix.MTRANS_Y]
                如果(mScaleFactor&小于1){
                    如果(Math.round(origWidth * saveScale)<宽度){
                        如果(Y<汉字)
                            matrix.postTranslate(0, - (Y +底部));
                        否则如果(γ大于0)
                            matrix.postTranslate(0,-y);
                    } 其他 {
                        如果(X<右汉字)
                            matrix.postTranslate( - (X +右),0);
                        否则如果(X 0)
                            matrix.postTranslate(-x,0);
                    }
                }
            }
        } 其他 {
            matrix.postScale(mScaleFactor,mScaleFactor,detector.getFocusX(),detector.getFocusY());
            matrix.getValues​​(米);
            浮法X = M [Matrix.MTRANS_X]
            浮动Y = M [Matrix.MTRANS_Y]
            如果(mScaleFactor&小于1){
                如果(X<右汉字)
                    matrix.postTranslate( - (X +右),0);
                否则如果(X 0)
                    matrix.postTranslate(-x,0);
                如果(Y<汉字)
                    matrix.postTranslate(0, - (Y +底部));
                否则如果(γ大于0)
                    matrix.postTranslate(0,-y);
            }
        }
        返回true;

    }
}

@覆盖
保护无效onMeasure(INT widthMeasureSpec,诠释heightMeasureSpec){
    super.onMeasure(widthMeasureSpec,heightMeasureSpec);
    宽度= MeasureSpec.getSize(widthMeasureSpec);
    身高= MeasureSpec.getSize(heightMeasureSpec);
    //适应屏幕。
    浮规模;
    浮动的scaleX =(浮点)宽/(浮点)bmWidth;
    浮动的scaleY =(浮点)高度/(浮点)bmHeight;
    规模= Math.min(将scaleX,的scaleY);
    matrix.setScale(秤,秤);
    setImageMatrix(矩阵);
    saveScale = 1F;

    //中心图像
    redundantYSpace =(浮点)高度 - (规模*(浮点)bmHeight);
    redundantXSpace =(浮点)宽度 - (规模*(浮点)bmWidth);
    redundantYSpace / =(浮点)2;
    redundantXSpace / =(浮点)2;

    matrix.postTranslate(redundantXSpace,redundantYSpace);

    origWidth =宽度 -  2 * redundantXSpace;
    origHeight =身高 -  2 * redundantYSpace;
    右=宽* saveScale  - 宽 - (2 * redundantXSpace * saveScale);
    底部=身高* saveScale  - 高 - (2 * redundantYSpace * saveScale);
    setImageMatrix(矩阵);
}

类DoubleTapGestureListener扩展SimpleOnGestureListener {

    @覆盖
    公共布尔onDown(MotionEvent E){
        返回true;
    }

    //事件时双击出现
    @覆盖
    公共布尔onDoubleTap(MotionEvent E){
        浮X = e.getX();
        浮动Y = e.getY();
        LogUtil.i(TAG,去敲:(+ X +,+ Y +));
        如果(isZoomed()){
            缩小();
        } 其他 {
            放大();
        }
        返回true;
    }

}

公共布尔isZoomed(){
    返回saveScale> minScale; //这似乎工作
}

公共无效zoomIn(){
    LogUtil.i(TAG,拉近);
    // TODO:不知道如何做到这一点

}

公共无效zoomOut(){
    LogUtil.i(TAG,放大了);
    // TODO:不知道如何做到这一点
}

}
 

解决方案

我的答案可能是不完全针对您的问题,但它涵盖的ImageView Zooom /缩小,双击,在当其放大ImageView的包围盒的形象,总之是酷似默认的Andr​​oid画廊的应用程序

<一个href="http://blog.sephiroth.it/2011/04/04/imageview-zoom-and-scroll/">http://blog.sephiroth.it/2011/04/04/imageview-zoom-and-scroll/

随着博客说:

  

只要Android不具备一个内置的ImageView小部件缩放和滚动功能,我试图通过自己从谷歌的存储库开始创建一个。

     

结果是pretty的很好,所以我在这里张贴的来源$ C ​​$ C,若   有人有兴趣,或者根本不想浪费时间   创建一个新的。

I am modifying the TouchImageView (https://github.com/MikeOrtiz/TouchImageView/issues) to have zoom in and out for when you double tap. I have started as per this post - How does TouchImageView works? and have added the gesture detection.

Now I have to implement the zooming in and zooming out which I am not sure how to do. Here is the code I have so far with the zoomIn and zoomOut methods unimplemented. Anyone know how to do this? In addition I noticed that the pinch zoom doesn't really zoom to the location where you pinch, so I was hoping that this could be made to behave more like the gallery3D pinch zoom. Thanks.

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
import android.view.ScaleGestureDetector.SimpleOnScaleGestureListener;
import android.view.View;
import android.widget.ImageView;

public class TouchImageView extends ImageView {

private static final String TAG = TouchImageView.class.getSimpleName();

Matrix matrix = new Matrix();

// We can be in one of these 3 states
static final int NONE = 0;
static final int DRAG = 1;
static final int ZOOM = 2;
int mode = NONE;

// Remember some things for zooming
PointF last = new PointF();
PointF start = new PointF();
float minScale = 1f;
float maxScale = 3f;
float[] m;

float redundantXSpace, redundantYSpace;

float width, height;
static final int CLICK = 3;
float saveScale = 1f;
float right, bottom, origWidth, origHeight, bmWidth, bmHeight;

ScaleGestureDetector mScaleDetector;

private GestureDetector gestureDetector;

Context context;

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

public TouchImageView(Context context) {
    super(context);
    init(context);
}

public void init(Context context) {
    gestureDetector = new GestureDetector(new DoubleTapGestureListener());

    super.setClickable(true);
    this.context = context;
    mScaleDetector = new ScaleGestureDetector(context, new ScaleListener());
    matrix.setTranslate(1f, 1f);
    m = new float[9];
    setImageMatrix(matrix);
    setScaleType(ScaleType.MATRIX);

    setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {

            if (gestureDetector.onTouchEvent(event)) {
                return true;
            }

            mScaleDetector.onTouchEvent(event);

            matrix.getValues(m);
            float x = m[Matrix.MTRANS_X];
            float y = m[Matrix.MTRANS_Y];
            PointF curr = new PointF(event.getX(), event.getY());

            switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                last.set(event.getX(), event.getY());
                start.set(last);
                mode = DRAG;
                break;
            case MotionEvent.ACTION_MOVE:
                if (mode == DRAG) {
                    float deltaX = curr.x - last.x;
                    float deltaY = curr.y - last.y;
                    float scaleWidth = Math.round(origWidth * saveScale);
                    float scaleHeight = Math.round(origHeight * saveScale);
                    if (scaleWidth < width) {
                        deltaX = 0;
                        if (y + deltaY > 0)
                            deltaY = -y;
                        else if (y + deltaY < -bottom)
                            deltaY = -(y + bottom);
                    } else if (scaleHeight < height) {
                        deltaY = 0;
                        if (x + deltaX > 0)
                            deltaX = -x;
                        else if (x + deltaX < -right)
                            deltaX = -(x + right);
                    } else {
                        if (x + deltaX > 0)
                            deltaX = -x;
                        else if (x + deltaX < -right)
                            deltaX = -(x + right);

                        if (y + deltaY > 0)
                            deltaY = -y;
                        else if (y + deltaY < -bottom)
                            deltaY = -(y + bottom);
                    }
                    matrix.postTranslate(deltaX, deltaY);
                    last.set(curr.x, curr.y);
                }
                break;

            case MotionEvent.ACTION_UP:
                mode = NONE;
                int xDiff = (int) Math.abs(curr.x - start.x);
                int yDiff = (int) Math.abs(curr.y - start.y);
                if (xDiff < CLICK && yDiff < CLICK)
                    performClick();
                break;

            case MotionEvent.ACTION_POINTER_UP:
                mode = NONE;
                break;
            }
            setImageMatrix(matrix);
            invalidate();
            return true; // indicate event was handled
        }

    });
}

@Override
public void setImageBitmap(Bitmap bm) {
    super.setImageBitmap(bm);
    bmWidth = bm.getWidth();
    bmHeight = bm.getHeight();
}

public void setMaxZoom(float x) {
    maxScale = x;
}

private class ScaleListener extends SimpleOnScaleGestureListener {
    @Override
    public boolean onScaleBegin(ScaleGestureDetector detector) {
        mode = ZOOM;
        return true;
    }

    @Override
    public boolean onScale(ScaleGestureDetector detector) {

        LogUtil.i(TAG, detector.getScaleFactor() + " " + detector.getFocusX() + " " + detector.getFocusY());

        float mScaleFactor = (float) Math.min(Math.max(.95f, detector.getScaleFactor()), 1.05);
        float origScale = saveScale;
        saveScale *= mScaleFactor;
        if (saveScale > maxScale) {
            saveScale = maxScale;
            mScaleFactor = maxScale / origScale;
        } else if (saveScale < minScale) {
            saveScale = minScale;
            mScaleFactor = minScale / origScale;
        }
        right = width * saveScale - width - (2 * redundantXSpace * saveScale);
        bottom = height * saveScale - height - (2 * redundantYSpace * saveScale);
        if (origWidth * saveScale <= width || origHeight * saveScale <= height) {
            matrix.postScale(mScaleFactor, mScaleFactor, width / 2, height / 2);
            if (mScaleFactor < 1) {
                matrix.getValues(m);
                float x = m[Matrix.MTRANS_X];
                float y = m[Matrix.MTRANS_Y];
                if (mScaleFactor < 1) {
                    if (Math.round(origWidth * saveScale) < width) {
                        if (y < -bottom)
                            matrix.postTranslate(0, -(y + bottom));
                        else if (y > 0)
                            matrix.postTranslate(0, -y);
                    } else {
                        if (x < -right)
                            matrix.postTranslate(-(x + right), 0);
                        else if (x > 0)
                            matrix.postTranslate(-x, 0);
                    }
                }
            }
        } else {
            matrix.postScale(mScaleFactor, mScaleFactor, detector.getFocusX(), detector.getFocusY());
            matrix.getValues(m);
            float x = m[Matrix.MTRANS_X];
            float y = m[Matrix.MTRANS_Y];
            if (mScaleFactor < 1) {
                if (x < -right)
                    matrix.postTranslate(-(x + right), 0);
                else if (x > 0)
                    matrix.postTranslate(-x, 0);
                if (y < -bottom)
                    matrix.postTranslate(0, -(y + bottom));
                else if (y > 0)
                    matrix.postTranslate(0, -y);
            }
        }
        return true;

    }
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    width = MeasureSpec.getSize(widthMeasureSpec);
    height = MeasureSpec.getSize(heightMeasureSpec);
    // Fit to screen.
    float scale;
    float scaleX = (float) width / (float) bmWidth;
    float scaleY = (float) height / (float) bmHeight;
    scale = Math.min(scaleX, scaleY);
    matrix.setScale(scale, scale);
    setImageMatrix(matrix);
    saveScale = 1f;

    // Center the image
    redundantYSpace = (float) height - (scale * (float) bmHeight);
    redundantXSpace = (float) width - (scale * (float) bmWidth);
    redundantYSpace /= (float) 2;
    redundantXSpace /= (float) 2;

    matrix.postTranslate(redundantXSpace, redundantYSpace);

    origWidth = width - 2 * redundantXSpace;
    origHeight = height - 2 * redundantYSpace;
    right = width * saveScale - width - (2 * redundantXSpace * saveScale);
    bottom = height * saveScale - height - (2 * redundantYSpace * saveScale);
    setImageMatrix(matrix);
}

class DoubleTapGestureListener extends SimpleOnGestureListener {

    @Override
    public boolean onDown(MotionEvent e) {
        return true;
    }

    // event when double tap occurs
    @Override
    public boolean onDoubleTap(MotionEvent e) {
        float x = e.getX();
        float y = e.getY();
        LogUtil.i(TAG, "Tapped at: (" + x + "," + y + ")");
        if (isZoomed()) {
            zoomOut();
        } else {
            zoomIn();
        }
        return true;
    }

}

public boolean isZoomed() {
    return saveScale > minScale; // this seems to work
}

public void zoomIn() {
    LogUtil.i(TAG, "Zooming in");
    // TODO: no idea how to do this

}

public void zoomOut() {
    LogUtil.i(TAG, "Zooming out");
    // TODO: no idea how to do this
}

}

解决方案

My answer might be not exactly specific to your problem but it covers ImageView Zooom in/out, double tap, Bounding image in Imageview when its zoomed , In short is exactly like the default Gallery app of Android

http://blog.sephiroth.it/2011/04/04/imageview-zoom-and-scroll/

As the blog says:

As long as Android doesn’t have a built-in ImageView widget with zoom and scroll capabilities I tries to create one by myself starting from the google repository.

The result is pretty nice so I’m posting here the source code, if anyone is interested, or simply doesn’t want to waste the time creating a new one.

这篇关于如何修改TouchImageView与双击放大和缩小?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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