直接贴代码:
第一个例子:利用手势缩放图片,没有解决图片放的太大,内存泄漏的问题,这个问题之后在研究
- /**
- *实现一个利用手势缩放图片的小例子
- *当手势是从左到右滑动的时候,放大图片
- *当手势是从右到左滑动的时候,缩小图片
- */
- public class GestureZoomImageActivity extends Activity {
- private GestureDetector detector;//手势检测
- private ImageView imageView;//ImageView
- private Bitmap bitmap;//图片资源
- private int width,height;//宽高
- private float scale=1;//缩放比
- private Matrix matrix;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- imageView=(ImageView)findViewById(R.id.imgView);
- detector=new GestureDetector(this,new GestureListener());
- bitmap=BitmapFactory.decodeResource(getResources(), R.drawable.a);
- width=bitmap.getWidth();//获得宽
- height=bitmap.getHeight();//获得高
- matrix=new Matrix();
- imageView.setImageBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.a));
- }
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- return detector.onTouchEvent(event);
- }
- private class GestureListener extends SimpleOnGestureListener{
- @Override
- public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
- velocityX=velocityX>4000?4000:velocityX;
- velocityY=velocityY>4000?4000:velocityY;
- //根据手势的速度来计算缩放比
- scale+=scale*velocityX/4000.0f;
- //保证scale不会等于0
- scale=scale>0.01?scale:0.01f;
- //重置Matrix
- matrix.reset();
- matrix.setScale(scale, scale, 160, 200);
- Bitmap bitmap2=Bitmap.createBitmap(bitmap, 0, 0, width, height,matrix,true);
- //如果图片还没有回收,强制回收
- BitmapDrawable bitmapDrawable=(BitmapDrawable)(imageView.getDrawable());
- if(!bitmapDrawable.getBitmap().isRecycled()){
- bitmapDrawable.getBitmap().recycle();
- }
- //根据原始位图和Matrix创建新的图片
- imageView.setImageBitmap(bitmap2);
- return true;
- }
- }
- }
通过以上的例子,可以发现,确实能够缩放图片,但是图片缩放的过程十分的不平滑,突兀的跳动,感觉十分的不好。
这是因为,采用的是在onFling()回调方法里面度图片进行缩放。
- public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)
所以,在下面的例子中,我使用了onScroll方法来实现图片的缩放:
- public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)
- /**
- * 实现一个利用手势缩放图片的小例子 当手势是从左到右滑动的时候,放大图片 当手势是从右到左滑动的时候,缩小图片
- */
- public class GestureZoomImageActivity extends Activity {
- private GestureDetector detector;// 手势检测
- private ImageView imageView;// ImageView
- private float scale = 1;// 缩放比
- private Matrix matrix;
- private Bitmap bitmap;
- private int width,height;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- // 初始化矩阵
- matrix = new Matrix();
- // 加载ImageView控件
- imageView = (ImageView) findViewById(R.id.imgView);
- // 手势监听
- detector = new GestureDetector(this, new GestureListener());
- bitmap=BitmapFactory.decodeResource(getResources(), R.drawable.aa);
- width=bitmap.getWidth();
- height=bitmap.getHeight();
- }
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- return detector.onTouchEvent(event);
- }
- private class GestureListener extends SimpleOnGestureListener {
- @Override
- public boolean onDown(MotionEvent e) {
- Bitmap bitmap1 = ((BitmapDrawable) imageView.getBackground()).getBitmap();
- scale=(float)bitmap1.getWidth()/width;//计算当前图片的尺寸相对于原来图片的缩放比
- return super.onDown(e);
- }
- @Override
- public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
- //计算缩放比
- scale+=distanceX/320;
- if(scale<0.1)//如果缩放比小于0.1 就不继续缩放了
- return false;
- matrix.reset();
- matrix.setScale(scale, scale, 160, 200);
- // 获得ImageView当前显示的图片
- Bitmap bitmap1 = ((BitmapDrawable) imageView.getBackground()).getBitmap();
- Bitmap bitmap2 = Bitmap.createBitmap(bitmap, 0, 0, width,
- height, matrix, true);
- // 如果图片还没有回收,强制回收
- if (!bitmap1.isRecycled()) {
- bitmap1.recycle();
- }
- imageView.setBackgroundDrawable(new BitmapDrawable(bitmap2));
- return true;
- }
- }
- }