マルチタッチストレッチ画像


次のコードは、画像の拡大または縮小を、二指の引張りまたは収縮によって実現するために実装される.この中でいくつか注意します.
1)マルチタッチの定数は、ブログの知識を参考にしてください.
http://blog.csdn.net/barryhappy/article/details/7392326
2)Bitmapの回収メカニズム.ここではBitmapを複数回作成するとメモリ不足になりますが、以下はこの問題を解決していないので、複数回ストレッチするとプログラムが切れます.
3)後記:この言葉は後につけたものです.上記の問題はすでに解決しました.詳細は私の別のブログを見てください.
http://blog.csdn.net/hhysirius/article/details/21525105
package com.example.mytest;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.os.Bundle;
import android.util.FloatMath;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;

public class MainActivity extends Activity {
	private ImageView iv;
	private Bitmap bm;
	private Bitmap alterBm;
	private Bitmap temp;
	private Paint paint;
	private Matrix matrix;
	
	//      
	private float oldDis = 0.0f;
	//      
	private float newDis = 0.0f;
	
	//       
	private boolean flag = false;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		iv = (ImageView) this.findViewById(R.id.iv);
		
		bm = BitmapFactory.decodeResource(getResources(), R.drawable.xiamu);

		temp = bm.copy(bm.getConfig(), true);
		alterBm = bm.copy(bm.getConfig(), true);
		paint = new Paint();
		paint.setColor(Color.BLACK);
		matrix = new Matrix();
		
		iv.setImageBitmap(alterBm);
	
		iv.setOnTouchListener(new OnTouchListener() {
			
			@Override
			public boolean onTouch(View v, MotionEvent event) {
				// TODO Auto-generated method stub
				switch (event.getAction()&MotionEvent.ACTION_MASK) {
				//       
				case MotionEvent.ACTION_DOWN:
					break;
					
				//       
				case MotionEvent.ACTION_POINTER_DOWN:
					flag = true;		
					oldDis = spacing(event);
					break;
					
				//    
				case MotionEvent.ACTION_MOVE:
					
					if (flag == false) {
						//           
						break;
					}
					
					newDis = spacing(event);
					
					//        
					if (newDis > (oldDis - 10.0f) && newDis < (oldDis + 10.0f)) {
						break;
					}
					
					float scale = newDis / oldDis;
					
					if (scale > 1) {
						float t = scale - 1.0f;
						t = t/2.0f;
						scale = scale - t;
					}
					if (scale < 1) {
						float t = 1.0f - scale;
						t = t/2.0f;
						scale = scale + t;
					}

					matrix.setScale(scale, scale);
					int newHeight = alterBm.getHeight();
					int newWidth = alterBm.getWidth();
					
					temp.recycle();
					temp = Bitmap.createBitmap(alterBm, 0, 0, newWidth, newHeight, matrix ,true);
					
					iv.setImageBitmap(temp);
					alterBm.recycle();
					alterBm = temp.copy(temp.getConfig(), true);		
					newDis = oldDis;
				
					break;
					
				case MotionEvent.ACTION_POINTER_UP:
					flag = false;
					break;
					
				default:
					break;
				}			
				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);  
    }  
  
}