Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android 多點觸碰實現圖片的縮放

android 多點觸碰實現圖片的縮放

編輯:關於Android編程

package com.siyehuazhilian.view;

import com.siyehuazhilian.touchcontrol.R;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Point;
import android.graphics.drawable.BitmapDrawable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;

public class TouchImageView extends SurfaceView implements Callback {
	private SurfaceHolder holder = null;
	private Bitmap bitmap = null;
	private Matrix matrix = null;

	// 一根手指在觸碰
	private int ONE_TOUCH = 1;
	// 多根手指在觸碰
	private int MORE_TOUCH = 2;
	// 當前觸碰的手指模擬
	private int currentTouch = ONE_TOUCH;

	// 單根手指觸碰的開始點
	private Point startPoint;

	// 多根手指滑動的前後距離
	private float dis1;
	private float dis2;
	// 多根手指滑動的中心點
	private Point centerPoint;

	public TouchImageView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		init();
	}

	public TouchImageView(Context context, AttributeSet attrs) {
		super(context, attrs);
		init();
	}

	public TouchImageView(Context context) {
		super(context);
		init();
	}

	/**
	 * 初始化
	 */
	private void init() {
		holder = this.getHolder();
		holder.addCallback(this);

		// 得到一個Bitmap對象
		bitmap = ((BitmapDrawable) getResources().getDrawable(
				R.drawable.img_027)).getBitmap();

		matrix = new Matrix();

		startPoint = new Point();
		centerPoint = new Point();
	}

	/**
	 * 繪畫
	 */
	private void draw() {
		// 鎖定畫布
		Canvas canvas = holder.lockCanvas();
		if (canvas == null) {
			return;
		}

		// 清除畫布
		canvas.drawColor(Color.BLACK);

		// 畫圖片
		canvas.drawBitmap(bitmap, matrix, null);

		// 解鎖畫布並提交
		holder.unlockCanvasAndPost(canvas);
	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {

		// 能接受單根和多根手指的觸碰
		switch (event.getAction() & MotionEvent.ACTION_MASK) {
		case MotionEvent.ACTION_DOWN:
			// 得到單根手指一開始接觸的坐標
			startPoint.set((int) event.getX(), (int) event.getY());
			// 設置模式為單根手指
			currentTouch = ONE_TOUCH;
			break;
		case MotionEvent.ACTION_POINTER_DOWN:
			// 得到兩根手指一開始觸碰的距離
			dis1 = getDistance(event);
			// 得到這兩根手指的中心點
			getCenter(event);
			// 設置模式為多根手指觸碰
			currentTouch = MORE_TOUCH;
			break;
		case MotionEvent.ACTION_MOVE:
			if (currentTouch == ONE_TOUCH) {
				// 如果是一根手指,則設置平移,平移的距離是從開始點到現在的移動點
				matrix.postTranslate((event.getX() - startPoint.x) / 10,
						(event.getY() - startPoint.y) / 10);
			} else if (currentTouch == MORE_TOUCH) {
				// 如果是多根手指模式,則設置縮放,縮放的比例是剛接觸時兩根手指之間的距離與移動後兩根手指之間的距離比.
				// 縮放的中心點是剛接觸時兩根手指的中心點
				dis2 = getDistance(event);
				matrix.postScale((dis2 / dis1), (dis2 / dis1), centerPoint.x,
						centerPoint.y);
			}
			break;
		case MotionEvent.ACTION_UP:
		case MotionEvent.ACTION_POINTER_UP:
			break;
		default:
			break;
		}

		// 重新畫圖像
		draw();

		return true;
	}

	/**
	 * 得到兩根手指之間的距離
	 * 
	 * @param event
	 * @return
	 */
	private float getDistance(MotionEvent event) {
		float a = event.getX(1) - event.getX(0);
		float b = event.getY(1) - event.getY(0);
		return (float) Math.sqrt(Math.pow(a, 2) + Math.pow(b, 2));
	}

	/**
	 * 得到兩根手指之間的中心點
	 * 
	 * @param event
	 */
	private void getCenter(MotionEvent event) {
		float a = event.getX(1) + event.getX(0);
		float b = event.getY(1) + event.getY(0);
		centerPoint.set((int) a / 2, (int) b / 2);
	}

	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int width,
			int height) {

	}

	@Override
	public void surfaceCreated(SurfaceHolder holder) {
		// 讓這個View在創建的時候就開始畫畫
		draw();
	}

	@Override
	public void surfaceDestroyed(SurfaceHolder holder) {

	}

}

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved