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