多点缩放图片DEMO
http://www.eoeandroid.com/thread-109224-1-1.html
这个demo在activity是可以运行的,并且效果都是有的,为什么我把图片放入popupwindow中就没起作用呢?不能拖动,不能放大缩小!!请教什么原因??

解决方案 »

  1.   

    我在你的代码上改了一下,在PopupWindow上也是可以缩放的main.xml:<?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/main"
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent">
    <Button android:id="@+id/btn"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="弹出PopupWindow"/>
    </LinearLayout>
    poup.xml:<?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content">
    <ImageView android:layout_width="700px"
    android:layout_height="350px" android:scaleType="matrix"
    android:src="@drawable/test" android:id="@+id/image_view"
    android:layout_gravity="center"/>
    </LinearLayout>package mutl.touch.sample;import android.app.Activity;
    import android.content.Context;
    import android.graphics.Matrix;
    import android.graphics.PointF;
    import android.graphics.drawable.ColorDrawable;
    import android.os.Bundle;
    import android.util.FloatMath;
    import android.view.Gravity;
    import android.view.LayoutInflater;
    import android.view.MotionEvent;
    import android.view.View;
    import android.view.ViewGroup.LayoutParams;
    import android.widget.Button;
    import android.widget.ImageView;
    import android.widget.PopupWindow;
    import android.widget.PopupWindow.OnDismissListener;public class Main 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 Button mButton;
    private ImageView mImageView;
    private PopupWindow mPoupuWindow; @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    mButton = (Button) findViewById(R.id.btn);

    mButton.setOnClickListener(new Button.OnClickListener(){
    @Override
    public void onClick(View v) {
    showPopupWindow();
    }
    });
    }

    public void showPopupWindow(){
    final Context context = Main.this;
         final LayoutInflater fliter = (LayoutInflater) context.getSystemService(LAYOUT_INFLATER_SERVICE);
         final View imageWindow = fliter.inflate(R.layout.popup, null);
         mPoupuWindow = new PopupWindow(imageWindow, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, true);
         final ColorDrawable dw = new ColorDrawable(-00000);
         mPoupuWindow.setBackgroundDrawable(dw);
         mPoupuWindow.showAtLocation(findViewById(R.id.main), Gravity.CENTER, 0, 0);
        
         mImageView = (ImageView) imageWindow.findViewById(R.id.image_view);
         mImageView.setOnTouchListener(image_touch_listener);
        
         mPoupuWindow.setOnDismissListener(new OnDismissListener(){
    public void onDismiss() {
    mPoupuWindow.dismiss();
    }
         });
    }

    private ImageView.OnTouchListener image_touch_listener = new ImageView.OnTouchListener(){
    @Override
    public boolean onTouch(View v, MotionEvent event) {
    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;
    }
    mImageView.setImageMatrix(matrix);
    return true;
    }
    };

    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);
    } 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);
    }
    }
    项目已上传,下载地址:http://download.csdn.net/detail/huweilong1030/4384428