Android中使用手势Gesture实现图片放缩

jopen 11年前

在本实例中,通过手指滑动来实现图片放缩,用户只要在图片上随意“挥动手指”,图片就可被放缩,从左向右挥动时,图片被放大,当从右向左挥动时图片被缩小:挥动速度越快,缩放比越大。代码如下:</span>

import android.os.Bundle;  import android.app.Activity;  import android.graphics.Bitmap;  import android.graphics.BitmapFactory;  import android.graphics.Matrix;  import android.graphics.drawable.BitmapDrawable;  import android.view.GestureDetector;  import android.view.GestureDetector.OnGestureListener;  import android.view.MotionEvent;  import android.widget.ImageView;    public class MainActivity extends Activity implements OnGestureListener {   // 定义手势检测器实例   private GestureDetector detector;   // 定义ImageView实例   private ImageView imageView;   // 定义初始的图片资源   private Bitmap bitmap;   // 定义图片的宽、高   private int width, height;   // 记录当前的缩放比   private float currentScale = 1;   // 控制图片缩放的Matrix对象   private Matrix matrix;     @Override   protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    // 创建手势检测器    detector = new GestureDetector(this);    imageView = (ImageView) findViewById(R.id.activity_main_image);    matrix = new Matrix();    // 获取被放缩的源图片    bitmap = BitmapFactory.decodeResource(this.getResources(),      R.drawable.image5);    // 获得位图宽    width = bitmap.getWidth();    // 获得位图高    height = bitmap.getHeight();    // 设置ImageVIew初始化时显示的图片    imageView.setImageBitmap(BitmapFactory.decodeResource(      this.getResources(), R.drawable.image5));   }     @Override   public boolean onTouchEvent(MotionEvent event) {    // 将该Activity上的触碰事件交给GestureDetector处理    return detector.onTouchEvent(event);   }     @Override   public boolean onDown(MotionEvent e) {    return false;   }     @Override   public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,     float velocityY) {    velocityX = velocityX > 4000 ? 4000 : velocityX;    velocityX = velocityX < -4000 ? -4000 : velocityX;    // 根据手势的速度来计算缩放比,如果velocityX>0,放大图像,否则缩小图像    currentScale += currentScale * velocityX / 4000.0f;    // 保证currentScale不会等于0    currentScale = currentScale > 0.01 ? currentScale : 0.01f;    // 重置Matrix    matrix.reset();    // 缩放Matrix    matrix.setScale(currentScale, currentScale, 160, 200);    BitmapDrawable tmp = (BitmapDrawable) imageView.getDrawable();    // 如果图片还未回收,先强制回收该图片    if (!tmp.getBitmap().isRecycled()) {     tmp.getBitmap().recycle();    }    // 根据原始位图和Matrix创建新图片    Bitmap bitmap2 = Bitmap.createBitmap(bitmap, 0, 0, width, height,      matrix, true);    // 显示新的位图    imageView.setImageBitmap(bitmap2);    return false;   }     @Override   public void onLongPress(MotionEvent e) {   }     @Override   public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,     float distanceY) {    return false;   }     @Override   public void onShowPress(MotionEvent e) {   }     @Override   public boolean onSingleTapUp(MotionEvent e) {    return false;   }    }
</span>