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>