如何在Android中使用java在单击时放大/缩小imageView?

如何在Android中使用java在单击时放大/缩小imageView?,java,android,android-imageview,zooming,Java,Android,Android Imageview,Zooming,我按照本教程在触摸屏上放大了imageview,但我有一个活动有15个图像,当我单击任何一个图像时,它将打开新活动,并在新活动上放大单击的图像,所以我的问题是 如何将单击的图像src传递给nextActivity,以便我的单一方法适用于所有图像的放大 在新活动(放大)中,当我单击它时,如何再次缩小该图像。 我遵循了这一点: 它成功地放大了图像视图,但我不知道如何编写缩小代码。有人能帮我完成这项任务吗 任何教程都将受到欢迎,但链接必须包含与此url中相同的代码,并对缩小进行一些更改公共类Touch

我按照本教程在触摸屏上放大了
imageview
,但我有一个活动有15个图像,当我单击任何一个图像时,它将打开新活动,并在新活动上放大单击的图像,所以我的问题是

  • 如何将单击的图像src传递给nextActivity,以便我的单一方法适用于所有图像的放大

  • 在新活动(放大)中,当我单击它时,如何再次缩小该图像。 我遵循了这一点:

  • 它成功地放大了
    图像视图
    ,但我不知道如何编写缩小代码。有人能帮我完成这项任务吗

    任何教程都将受到欢迎,但链接必须包含与此url中相同的代码,并对缩小进行一些更改

    公共类TouchImageView扩展ImageView{
    
        public class TouchImageView extends ImageView {
            Matrix matrix;
            static final int NONE = 0;
            static final int DRAG = 1;
            static int ZOOM = 2;
            static int mode = NONE;
            public  int isundo = 0;
            PointF last = new PointF();
            PointF start = new PointF();
            float minScale = 0f;
            float maxScale = 1f;
            float[] m;
            int viewWidth, viewHeight;
            static final int CLICK = 3;
            float saveScale = 1f;
            protected float origWidth, origHeight;
            int oldMeasuredWidth, oldMeasuredHeight;
            float bmWidth, bmHeight;
            ScaleGestureDetector mScaleDetector;
            Context context;
            public TouchImageView(Context context) {
                super(context);
                if (isundo == 0) {
                    sharedConstructing(context);
                }
            }
    
            public TouchImageView(Context context, AttributeSet attrs) {
                super(context, attrs);
                if (isundo == 0) {
                    sharedConstructing(context);
                }
            }
    
            private void sharedConstructing(Context context) {
    
                super.setClickable(true);
                this.context = context;
                mScaleDetector = new ScaleGestureDetector(context, new ScaleListener());
                matrix = new Matrix();
                m = new float[9];
                setImageMatrix(matrix);
                setScaleType(ScaleType.MATRIX);
                setOnTouchListener(new OnTouchListener() {
                    @Override
                    public boolean onTouch(View v, MotionEvent event) {
                        mScaleDetector.onTouchEvent(event);
                        PointF curr = new PointF(event.getX(), event.getY());
                        if (isundo == 0) {
                            switch (event.getAction()) {
                            case MotionEvent.ACTION_DOWN:
                                last.set(curr);
                                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;
                                    matrix.postTranslate(deltaX, deltaY);
                                    fixTrans();
                                    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
                    }
    
                });
    
            }
    
            public void stopInterceptEvent() {
                getParent().requestDisallowInterceptTouchEvent(true);
            }
    
            public void startInterceptEvent() {
                getParent().requestDisallowInterceptTouchEvent(false);
            }
    
            @Override
            public void setImageBitmap(Bitmap bm) {
                super.setImageBitmap(bm);
                if (bm != null) {
                    origWidth = bm.getWidth();
                    origHeight = bm.getHeight();
                }
            }
    
            public void setMaxZoom(float x) {
                maxScale = x;
            }
    
            private class ScaleListener extends
                    ScaleGestureDetector.SimpleOnScaleGestureListener {
                @Override
                public boolean onScaleBegin(ScaleGestureDetector detector) {
                    mode = ZOOM;
                    return true;
                }
    
                @Override
                public boolean onScale(ScaleGestureDetector detector) {
                    float mScaleFactor = detector.getScaleFactor();
                    float origScale = saveScale;
                    saveScale *= mScaleFactor;
                    if (saveScale > maxScale) {
                        saveScale = maxScale;
                        mScaleFactor = maxScale / origScale;
                    } else if (saveScale < minScale) {
                        saveScale = minScale;
                        mScaleFactor = minScale / origScale;
                    }
    
                    if (origWidth * saveScale <= viewWidth
                            || origHeight * saveScale <= viewHeight)
                        matrix.postScale(mScaleFactor, mScaleFactor, viewWidth / 2,
                                viewHeight / 2);
                    else
                        matrix.postScale(mScaleFactor, mScaleFactor,
                                detector.getFocusX(), detector.getFocusY());
    
                    fixTrans();
                    return true;
                }
            }
    
            void fixTrans() {
                matrix.getValues(m);
                float transX = m[Matrix.MTRANS_X];
                float transY = m[Matrix.MTRANS_Y];
    
                float fixTransX = getFixTrans(transX, viewWidth, origWidth * saveScale);
                float fixTransY = getFixTrans(transY, viewHeight, origHeight
                        * saveScale);
    
                if (fixTransX != 0 || fixTransY != 0)
                    matrix.postTranslate(fixTransX, fixTransY);
            }
    
            float getFixTrans(float trans, float viewSize, float contentSize) {
                float minTrans, maxTrans;
    
                if (contentSize <= viewSize) {
                    minTrans = 0;
                    maxTrans = viewSize - contentSize;
                } else {
                    minTrans = viewSize - contentSize;
                    maxTrans = 0;
                }
    
                if (trans < minTrans)
                    return -trans + minTrans;
                if (trans > maxTrans)
                    return -trans + maxTrans;
                return 0;
            }
    
            float getFixDragTrans(float delta, float viewSize, float contentSize) {
                if (contentSize <= viewSize) {
                    return 0;
                }
                return delta;
            }
    
            @Override
            protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
                super.onMeasure(widthMeasureSpec, heightMeasureSpec);
                viewWidth = MeasureSpec.getSize(widthMeasureSpec);
                viewHeight = MeasureSpec.getSize(heightMeasureSpec);
    
                //
                // Rescales image on rotation
                //
                if (oldMeasuredHeight == viewWidth && oldMeasuredHeight == viewHeight
                        || viewWidth == 0 || viewHeight == 0)
                    return;
                oldMeasuredHeight = viewHeight;
                oldMeasuredWidth = viewWidth;
    
                if (saveScale == 1) {
                    // Fit to screen.
                    float scale;
    
                    Drawable drawable = getDrawable();
                    if (drawable == null || drawable.getIntrinsicWidth() == 0
                            || drawable.getIntrinsicHeight() == 0)
                        return;
                    int bmWidth = drawable.getIntrinsicWidth();
                    int bmHeight = drawable.getIntrinsicHeight();
    
                    float scaleX = (float) viewWidth / (float) bmWidth;
                    float scaleY = (float) viewHeight / (float) bmHeight;
                    scale = Math.min(scaleX, scaleY);
                    matrix.setScale(scale, scale);
    
                    // Center the image
                    float redundantYSpace = (float) viewHeight
                            - (scale * (float) bmHeight);
                    float redundantXSpace = (float) viewWidth
                            - (scale * (float) bmWidth);
                    redundantYSpace /= (float) 2;
                    redundantXSpace /= (float) 2;
    
                    matrix.postTranslate(redundantXSpace, redundantYSpace);
    
                    origWidth = viewWidth - 2 * redundantXSpace;
                    origHeight = viewHeight - 2 * redundantYSpace;
                    setImageMatrix(matrix);
                }
                fixTrans();
            }
        }
    
    
    
    
    
    use this way like ::---->>>
    
    
    
    TouchImageView iv = new TouchImageView(getApplicationContext());
                    iv.setImageBitmap(editedImage);
    
                    layout.addView(iv);
    
    矩阵; 静态最终int NONE=0; 静态最终整数阻力=1; 静态整数缩放=2; 静态int模式=无; 公共int=0; PointF last=新的PointF(); PointF start=新的PointF(); 浮动最小刻度=0f; 浮点最大刻度=1f; 浮动[]m; int viewWidth,viewHeight; 静态最终int CLICK=3; 浮动存储比例=1f; 受保护的浮子起始宽度、起始高度; int oldMeasuredWidth,oldMeasuredHeight; 浮动bmWidth,bmHeight; scalegestruedetector mScaleDetector; 语境; 公共TouchImageView(上下文){ 超级(上下文); 如果(isundo==0){ 共享构造(上下文); } } 公共TouchImageView(上下文、属性集属性){ 超级(上下文,attrs); 如果(isundo==0){ 共享构造(上下文); } } 私有void共享构造(上下文){ super.setClickable(true); this.context=上下文; mScaleDetector=新的scalegestruedetector(上下文,新的ScaleListener()); 矩阵=新矩阵(); m=新浮点数[9]; setImageMatrix(矩阵); setScaleType(ScaleType.MATRIX); setOnTouchListener(新的OnTouchListener(){ @凌驾 公共布尔onTouch(视图v,运动事件){ mScaleDetector.onTouchEvent(事件); PointF curr=新的PointF(event.getX(),event.getY()); 如果(isundo==0){ 开关(event.getAction()){ case MotionEvent.ACTION\u DOWN: 最后一组(当前); 开始。设置(最后); 模式=拖动; 打破 case MotionEvent.ACTION\u移动: 如果(模式==拖动){ 浮动deltaX=当前x-最后x; 浮动三角洲=当前y-最后y; 矩阵。后翻译(deltaX、deltaY); fixTrans(); 最后一组(当前x、当前y); } 打破 case MotionEvent.ACTION\u UP: 模式=无; intxdiff=(int)Math.abs(curr.x-start.x); int yDiff=(int)Math.abs(curr.y-start.y); if(xDiff最大比例){ saveScale=maxScale; mScaleFactor=最大刻度/原始刻度; }else if(保存比例<最小比例){ saveScale=minScale; mScaleFactor=最小刻度/原始刻度; } 如果(原始宽度*保存比例 TouchImageView iv=新的TouchImageView(getApplicationContext()); iv.设置图像位图(编辑图像); 布局图。添加视图(四);
    看看这个,我可能需要用xml定义任何东西吗?这个类添加到您的包中,只需将touchimageview添加到布局并开始工作..如何在单击imageView时获取imageView图像名称?如何在此代码中使用iv.setImageResource()动态设置图像名称?让我们来看看