如何在imageview上缩小放大图片,像官方那种可以放大超过屏幕大小,可以移动,网上有的例子都是只有放大但不能移动。
如果描述不清的话就像android版的校内和qq空间图片浏览器的那种效果

解决方案 »

  1.   

    移动的话要具体写函数你就自己自定义一个view,实现放大和缩小和移动。,网上都有代码
      

  2.   

    这个简单,你可以研究一下
            DragView dragView = mDragView = new DragView(mContext, b, registrationX, registrationY,
                    textureLeft, textureTop, textureWidth, textureHeight);
            dragView.show(mWindowToken, (int)mMotionDownX, (int)mMotionDownY);    public DragView(Context context, Bitmap bitmap, int registrationX, int registrationY,
                int left, int top, int width, int height) {
            super(context);        mWindowManager = WindowManagerImpl.getDefault();
            
            mTween = new SymmetricalLinearTween(false, 110 /*ms duration*/, this);        Matrix scale = new Matrix();
            float scaleFactor = width;
            scaleFactor = mScale = (scaleFactor + DRAG_SCALE) / scaleFactor;
            scale.setScale(scaleFactor, scaleFactor);        mBitmap = Bitmap.createBitmap(bitmap, left, top, width, height, scale, true);        // The point in our scaled bitmap that the touch events are located
            mRegistrationX = registrationX + (DRAG_SCALE / 2);
            mRegistrationY = registrationY + (DRAG_SCALE / 2);
        }
        public void show(IBinder windowToken, int touchX, int touchY) {
            WindowManager.LayoutParams lp;
            int pixelFormat;        pixelFormat = PixelFormat.TRANSLUCENT;        lp = new WindowManager.LayoutParams(
                    ViewGroup.LayoutParams.WRAP_CONTENT,
                    ViewGroup.LayoutParams.WRAP_CONTENT,
                    touchX-mRegistrationX, touchY-mRegistrationY,
                    WindowManager.LayoutParams.TYPE_APPLICATION_SUB_PANEL,
                    WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
                        | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
                        /*| WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM*/,
                    pixelFormat);
    //        lp.token = mStatusBarView.getWindowToken();
            lp.gravity = Gravity.LEFT | Gravity.TOP;
            lp.token = windowToken;
            lp.setTitle("DragView");
            mLayoutParams = lp;        mWindowManager.addView(this, lp);        mAnimationScale = 1.0f/mScale;
            mTween.start(true);
        }
      

  3.   

    分给你把,其实用matrix来实现平移,当滑动的时候计算x,y轴的移动位移,然后做平移转换,计算放大后的四个点点不要超出屏幕边界就可以实现移动了,但是我没思路如何获得四个点点坐标。故后面的功能没实现 下面是从网上找到的一个例子,大家可以研究下 package com.oppo;import android.app.Activity;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Matrix;
    import android.graphics.PointF;
    import android.os.Bundle;
    import android.util.FloatMath;
    import android.util.Log;
    import android.view.MotionEvent;
    import android.view.View;
    import android.view.View.OnTouchListener;
    import android.widget.ImageView;
    import android.widget.ZoomControls;public class ZoomInOutTest extends Activity {
    private static final int NONE = 0;
    private static final int DRAG = 1;
    private static final int ZOOM = 2;

    private int mode = NONE;
    private float oldDist;

    private Matrix matrix = new Matrix();
    private Matrix savedMatrix = new Matrix();

    private PointF start = new PointF();
    private PointF mid = new PointF();
    private ImageView imgview;
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    imgview = (ImageView)findViewById(R.id.imgview);
    imgview.setImageResource(R.drawable.asus);
    imgview.setOnTouchListener(new OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {
    ImageView view = (ImageView)v;
    switch (event.getAction() & MotionEvent.ACTION_MASK) {
    case MotionEvent.ACTION_DOWN:
    savedMatrix.set(matrix);
    //保存起始点
    start.set(event.getX(), event.getY());
    mode = DRAG;
    break;
    case MotionEvent.ACTION_UP:
    case MotionEvent.ACTION_POINTER_UP:
    mode = NONE;
    break;
    //多点触控
    case MotionEvent.ACTION_POINTER_DOWN:
    oldDist = spacing(event);
    if(oldDist > 10f){
    savedMatrix.set(matrix);
    midPoint(mid, event);
    mode = ZOOM;
    }
    break;
    case MotionEvent.ACTION_MOVE:
    if(mode == DRAG){
    matrix.set(savedMatrix);
    matrix.postTranslate(event.getX() - start.x,
    event.getY() - start.y);
    }else 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);
    }
    }
    break;
    }
    Log.v("tag", "ttt");
    view.setImageMatrix(matrix);
    return true;
    }
    });






    }
    //两点间距离
    private float spacing(MotionEvent event) {
    float x = event.getX(0) - event.getX(1);
    float y = event.getY(0) - event.getY(2);
    return FloatMath.sqrt(x * x + y * y);
    } //中点坐标
    private void midPoint(PointF point, MotionEvent event) {
    float x = event.getX(0) + event.getX(1);
    float y = event.getY(0) + event.getY(1);
    point.set(x / 2, y / 2);
    }
    }
      

  4.   

            //两点间距离
            private float spacing(MotionEvent event) {
                float x = event.getX(0) - event.getX(1);
                float y = event.getY(0) - event.getY(1);
                return FloatMath.sqrt(x * x + y * y);
            }6楼中的getY(2),应该为getY(1)