滑轮控件研究六、GestureDetector的简单应用,利用手势进行图片的缩放

直接贴代码:


第一个例子:利用手势缩放图片,没有解决图片放的太大,内存泄漏的问题,这个问题之后在研究

[java]  view plain copy
  1. /** 
  2.  *实现一个利用手势缩放图片的小例子 
  3.  *当手势是从左到右滑动的时候,放大图片 
  4.  *当手势是从右到左滑动的时候,缩小图片 
  5.  */  
  6. public class GestureZoomImageActivity extends Activity {  
  7.       
  8.     private GestureDetector detector;//手势检测  
  9.     private ImageView imageView;//ImageView  
  10.     private Bitmap bitmap;//图片资源  
  11.     private int width,height;//宽高  
  12.     private float scale=1;//缩放比  
  13.     private Matrix matrix;  
  14.     @Override  
  15.     public void onCreate(Bundle savedInstanceState) {  
  16.         super.onCreate(savedInstanceState);  
  17.         setContentView(R.layout.main);  
  18.         imageView=(ImageView)findViewById(R.id.imgView);  
  19.         detector=new GestureDetector(this,new GestureListener());  
  20.         bitmap=BitmapFactory.decodeResource(getResources(), R.drawable.a);  
  21.         width=bitmap.getWidth();//获得宽  
  22.         height=bitmap.getHeight();//获得高  
  23.         matrix=new Matrix();  
  24.         imageView.setImageBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.a));  
  25.     }  
  26.     @Override  
  27.     public boolean onTouchEvent(MotionEvent event) {  
  28.         return detector.onTouchEvent(event);  
  29.     }  
  30.     private class GestureListener extends SimpleOnGestureListener{  
  31.         @Override  
  32.         public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {  
  33.             velocityX=velocityX>4000?4000:velocityX;  
  34.             velocityY=velocityY>4000?4000:velocityY;  
  35.             //根据手势的速度来计算缩放比  
  36.             scale+=scale*velocityX/4000.0f;  
  37.             //保证scale不会等于0  
  38.             scale=scale>0.01?scale:0.01f;  
  39.             //重置Matrix  
  40.             matrix.reset();  
  41.             matrix.setScale(scale, scale, 160200);  
  42.              
  43.             Bitmap bitmap2=Bitmap.createBitmap(bitmap, 00, width, height,matrix,true);  
  44.             //如果图片还没有回收,强制回收  
  45.             BitmapDrawable bitmapDrawable=(BitmapDrawable)(imageView.getDrawable());  
  46.             if(!bitmapDrawable.getBitmap().isRecycled()){  
  47.                 bitmapDrawable.getBitmap().recycle();  
  48.             }  
  49.             //根据原始位图和Matrix创建新的图片  
  50.            imageView.setImageBitmap(bitmap2);  
  51.             return true;  
  52.         }  
  53.     }  
  54. }  



通过以上的例子,可以发现,确实能够缩放图片,但是图片缩放的过程十分的不平滑,突兀的跳动,感觉十分的不好。

这是因为,采用的是在onFling()回调方法里面度图片进行缩放。

[java]  view plain copy
  1. public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)   
onFling方法的参数意思是这样的:e1代表按下的事件,e2代表抬起的事件,velocityX代表x上的速度,velocityY代表Y上面的速度。也就是说,这个图片缩放的时刻是在手指抬起的时候,所以,才会有突兀的缩小或放大的感觉。


所以,在下面的例子中,我使用了onScroll方法来实现图片的缩放:

[java]  view plain copy
  1. public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)   
onScroll方法的参数意思是这样的:e1代表按下的事件,e2代表当前的滑动事件,distanceX代表两次滑动事件滑动x轴上面的距离,distanceY代表两次滑动事件滑动Y轴上面的距离。也就是说e1.getX()-e2.getX()  并不等于distanceX.


[java]  view plain copy
  1. /** 
  2.  * 实现一个利用手势缩放图片的小例子 当手势是从左到右滑动的时候,放大图片 当手势是从右到左滑动的时候,缩小图片 
  3.  */  
  4. public class GestureZoomImageActivity extends Activity {  
  5.     private GestureDetector detector;// 手势检测  
  6.     private ImageView imageView;// ImageView  
  7.     private float scale = 1;// 缩放比  
  8.     private Matrix matrix;  
  9.     private Bitmap bitmap;  
  10.     private int width,height;  
  11.     @Override  
  12.     public void onCreate(Bundle savedInstanceState) {  
  13.         super.onCreate(savedInstanceState);  
  14.         setContentView(R.layout.main);  
  15.         // 初始化矩阵  
  16.         matrix = new Matrix();  
  17.         // 加载ImageView控件  
  18.         imageView = (ImageView) findViewById(R.id.imgView);  
  19.         // 手势监听  
  20.         detector = new GestureDetector(thisnew GestureListener());  
  21.         bitmap=BitmapFactory.decodeResource(getResources(), R.drawable.aa);  
  22.         width=bitmap.getWidth();  
  23.         height=bitmap.getHeight();  
  24.     }  
  25.   
  26.     @Override  
  27.     public boolean onTouchEvent(MotionEvent event) {  
  28.         return detector.onTouchEvent(event);  
  29.     }  
  30.   
  31.     private class GestureListener extends SimpleOnGestureListener {  
  32.         @Override  
  33.         public boolean onDown(MotionEvent e) {  
  34.             Bitmap bitmap1 = ((BitmapDrawable) imageView.getBackground()).getBitmap();  
  35.             scale=(float)bitmap1.getWidth()/width;//计算当前图片的尺寸相对于原来图片的缩放比  
  36.             return super.onDown(e);  
  37.         }  
  38.           
  39.         @Override  
  40.         public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {  
  41.             //计算缩放比  
  42.             scale+=distanceX/320;  
  43.             if(scale<0.1)//如果缩放比小于0.1 就不继续缩放了  
  44.                 return false;  
  45.             matrix.reset();  
  46.             matrix.setScale(scale, scale, 160200);  
  47.             // 获得ImageView当前显示的图片  
  48.             Bitmap bitmap1 = ((BitmapDrawable) imageView.getBackground()).getBitmap();  
  49.             Bitmap bitmap2 = Bitmap.createBitmap(bitmap, 00, width,  
  50.                     height, matrix, true);  
  51.             // 如果图片还没有回收,强制回收  
  52.             if (!bitmap1.isRecycled()) {  
  53.                 bitmap1.recycle();  
  54.             }  
  55.             imageView.setBackgroundDrawable(new BitmapDrawable(bitmap2));  
  56.             return true;  
  57.         }  
  58.     }  
  59. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值