android 图片之多点触控放大缩小


Activity:
package com.bocom;

import android.app.Activity;
import android.content.pm.ActivityInfo;
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.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.View.OnTouchListener;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;

public class MainActivityImage extends Activity implements OnTouchListener {

	private ImageView imgview;
	private ImageView img;

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

	static final int NONE = 0;
	static final int DRAG = 1;
	static final int ZOOM = 2;
	int mode = NONE;

	// Remember some things for zooming
	PointF start = new PointF();
	PointF mid = new PointF();
	float oldDist = 1f;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.activity_main_activity_image);
		setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
		imgview = (ImageView) this.findViewById(R.id.imag1);
		// imgview.setAnimation(AnimationUtils.loadAnimation(this,
		// R.anim.newanim));

//		img = (ImageView) this.findViewById(R.id.imag);
//		Matrix mt = img.getImageMatrix();
//		// mt.postRotate(30);
//		mt.postScale(0.5f, 0.5f);
//		mt.postScale(1.5f, 1.5f);
//		mt.postRotate(30, 130, 100);
//		mt.postTranslate(100, 10);
//
//		img.setImageMatrix(mt);

		// imgview.setLongClickable(true);
		String v=getIntent().getStringExtra("iv");
		if("1".equals(v))
		imgview.setImageBitmap(BitmapFactory.decodeResource(
				this.getResources(), R.drawable.i1_1));
		if("2".equals(v))
		imgview.setImageBitmap(BitmapFactory.decodeResource(
				this.getResources(), R.drawable.i1_2));
		
		imgview.setOnTouchListener(this);
		imgview.setLongClickable(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);
	}

	@Override
	public boolean onTouch(View v, MotionEvent event) {
		// TODO Auto-generated method stub
		/*
		 * Log.d("Infor", "类别:"+event.getAction()); Log.d("Infor",
		 * "mask:"+event.getActionMasked()); Log.d("Infor",
		 * "index:"+event.getActionIndex()); Log.d("Infor",
		 * "points:"+event.getPointerCount());
		 */
		ScaleType type=ScaleType.MATRIX;
		imgview.setScaleType(type);
		Log.d("Infor", "size:" + event.getSize());
		if (event.getActionMasked() == MotionEvent.ACTION_POINTER_UP)
			Log.d("Infor", "多点操作");
		switch (event.getActionMasked()) {
		case MotionEvent.ACTION_DOWN:
			matrix.set(imgview.getImageMatrix());
			savedMatrix.set(matrix);
			start.set(event.getX(), event.getY());
			Log.d("Infor", "触摸了...");
			mode = DRAG;
			break;
		case MotionEvent.ACTION_POINTER_DOWN: // 多点触控
			oldDist = this.spacing(event);
			if (oldDist > 10f) {
				Log.d("Infor", "oldDist" + oldDist);
				savedMatrix.set(matrix);
				midPoint(mid, event);
				mode = ZOOM;
			}
			break;
		case MotionEvent.ACTION_POINTER_UP:
			mode = NONE;
			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 > 10) {
					matrix.set(savedMatrix);
					float scale = newDist / oldDist;
					matrix.postScale(scale, scale, mid.x, mid.y);
				}
			}
			break;
		}
		imgview.setImageMatrix(matrix);
		return false;
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.activity_main_activity_image, menu);
		return true;
	}
}



xml:
<?xml version="1.0" encoding="UTF-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_height="fill_parent" 
    android:layout_width="fill_parent" 
    android:id="@+id/linearLayout1" 
    >
        <ImageView 
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:id="@+id/imag1"
        android:scaleType="center"
        ></ImageView>
   </RelativeLayout>



Manifast,colors.xml,styles.xml:
<activity
            android:name=".MainActivityImage"
            android:theme="@style/Transparent" 
            android:label="@string/title_activity_main_activity_image" >
        </activity>

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="transparent">#9000</color>
</resources>

<style  name="Transparent"> 
  		<item name="android:windowBackground">@color/transparent</item> 
  		<item name ="android:windowIsTranslucent">true</item> 
  		<item  name="android:windowAnimationStyle">@+android:style/Animation.Translucent</item> 
  </style> 

猜你喜欢

转载自everlxq.iteye.com/blog/1973816