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