【问题标题】:android image zoom using multi touch使用多点触控的android图像缩放
【发布时间】:2015-07-30 11:22:15
【问题描述】:

我正在尝试创建一个应用程序,用户可以在其中触摸图像并使用多点触控手势进行缩放。我在网上搜索,发现很少有解决方案。我什至实现了这些,但我所有的努力都是徒劳的。首先,我的代码无法检测到多点触控,我意识到我们还需要在开关盒中添加 MotionEvent.ACTION_MASK。然后,现在当我尝试使用多点触控进行缩放时,不会发生任何效果。请纠正我。

TIA。

    OnTouchListener onTouchListener = new OnTouchListener() {

    int prevX,prevY;
    float scale;
    float mCurrentScale = 1.0f;
    @Override
    public boolean onTouch(View v, MotionEvent event) {


        //view.setScaleType(ImageView.ScaleType.MATRIX);
        scaleGestureDetector.onTouchEvent(event);
        ImageView view = (ImageView) v;
        v.bringToFront();
        final RelativeLayout.LayoutParams par=(RelativeLayout.LayoutParams)v.getLayoutParams();
        switch(event.getAction() & MotionEvent.ACTION_MASK)
        {
        case MotionEvent.ACTION_UP:
            par.topMargin+=(int)event.getRawY()-prevY;
            par.leftMargin+=(int)event.getRawX()-prevX;
            v.setLayoutParams(par);
            break;
        case MotionEvent.ACTION_POINTER_UP:
            mode = NONE;
            lastEvent = null;
            break;
        case MotionEvent.ACTION_DOWN:

            prevX=(int)event.getRawX();
            prevY=(int)event.getRawY();
            par.bottomMargin=-2*view.getHeight();
            par.rightMargin=-2*view.getWidth();
            v.setLayoutParams(par);
            savedMatrix.set(matrix);
            start.set(event.getX(), event.getY());
            Log.d("hi","outside if DRAG");
            mode = DRAG;
            lastEvent = null;

        break;
        case MotionEvent.ACTION_POINTER_DOWN:
            oldDist = spacing(event);
            Log.d("hi","Checking");
            if (oldDist > 10f) {
                savedMatrix.set(matrix);
                midPoint(mid, event);
                mode = ZOOM;
            }
            lastEvent = new float[4];
            lastEvent[0] = event.getX(0);
            lastEvent[1] = event.getX(1);
            lastEvent[2] = event.getY(0);
            lastEvent[3] = event.getY(1);
            d = rotation(event);
            break;
        case MotionEvent.ACTION_MOVE:


            if(mode == DRAG){
                par.topMargin+=(int)event.getRawY()-prevY;
                prevY=(int)event.getRawY();
                par.leftMargin+=(int)event.getRawX()-prevX;
                prevX=(int)event.getRawX();
                v.setLayoutParams(par);
            }
             if (mode == ZOOM) {
                float newDist = spacing(event);
                if (newDist > 10f) {
                    matrix.set(savedMatrix);
                    float scale = (newDist / oldDist);

                    matrix.postScale(scale, scale, mid.x, mid.y);
                    Log.e("hi", "TEsting");
                }
                if (lastEvent != null && event.getPointerCount() == 3) {
                    newRot = rotation(event);
                    float r = newRot - d;
                    float[] values = new float[9];
                    matrix.getValues(values);
                    float tx = values[2];
                    float ty = values[5];
                    float sx = values[0];
                    float xc = (v.getWidth() / 2) * sx;
                    float yc = (v.getHeight() / 2) * sx;
                    matrix.postRotate(r, tx + xc, ty + yc);
                }
            }
            break;

        }
        //ImageView view = (ImageView) v;
        view.setImageMatrix(matrix);

        v.invalidate();
        return true;

    }
};

【问题讨论】:

    标签: android zooming scale gesture multi-touch


    【解决方案1】:

    您可能需要使用这段代码:

    import android.os.Bundle;  
    import android.app.Activity;  
    import android.view.Menu;  
    
    public class MultiTouchActivity extends Activity {  
        @Override  
        protected void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            //setContentView(R.layout.activity_main);  
    
            TouchImageView img = new TouchImageView(this);  
            img.setImageResource(R.drawable.ice_age_2);  
            img.setMaxZoom(4f);  
            setContentView(img);  
        }  
    }   
    

    参考链接 here

    【讨论】:

    • 我点击了链接并检查了。我相信(可能我错了)这实际上是一回事。但也会尝试。你能证明这两者和我所缺少的有什么区别吗?我想知道代码有什么问题。感谢您的评论。
    猜你喜欢
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-13
    • 1970-01-01
    相关资源
    最近更新 更多