滑轮控件研究六、GestureDetector的简单应用,利用手势进行图片的缩放
2012-05-15 18:24
537 查看
直接贴代码:
第一个例子:利用手势缩放图片,没有解决图片放的太大,内存泄漏的问题,这个问题之后在研究
通过以上的例子,可以发现,确实能够缩放图片,但是图片缩放的过程十分的不平滑,突兀的跳动,感觉十分的不好。
这是因为,采用的是在onFling()回调方法里面度图片进行缩放。
所以,在下面的例子中,我使用了onScroll方法来实现图片的缩放:
第一个例子:利用手势缩放图片,没有解决图片放的太大,内存泄漏的问题,这个问题之后在研究
/** *实现一个利用手势缩放图片的小例子 *当手势是从左到右滑动的时候,放大图片 *当手势是从右到左滑动的时候,缩小图片 */ 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)onFling方法的参数意思是这样的:e1代表按下的事件,e2代表抬起的事件,velocityX代表x上的速度,velocityY代表Y上面的速度。也就是说,这个图片缩放的时刻是在手指抬起的时候,所以,才会有突兀的缩小或放大的感觉。
所以,在下面的例子中,我使用了onScroll方法来实现图片的缩放:
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)onScroll方法的参数意思是这样的:e1代表按下的事件,e2代表当前的滑动事件,distanceX代表两次滑动事件滑动x轴上面的距离,distanceY代表两次滑动事件滑动Y轴上面的距离。也就是说e1.getX()-e2.getX() 并不等于distanceX.
/**
* 实现一个利用手势缩放图片的小例子 当手势是从左到右滑动的时候,放大图片 当手势是从右到左滑动的时候,缩小图片
*/
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;
}
}
}
相关文章推荐
- 滑轮控件研究六、GestureDetector的简单应用,利用手势进行图片的缩放
- 滑轮控件研究六、GestureDetector的简单应用,利用手势进行图片的缩放
- 滑轮控件研究三、GestureDetector的中手势事件的测试
- 滑轮控件研究三、GestureDetector的中手势事件的测试
- 滑轮控件研究三、GestureDetector的中手势事件的测试
- 滑轮控件研究三、GestureDetector的中手势事件的测试
- 【Android游戏开发十六】Android Gesture之【触摸屏手势识别】操作!利用触摸屏手势实现一个简单切换图片的功能!
- 滑轮控件研究二、GestureDetector的深入研究
- 25-UI基础通过控件的 transform 属性,对控件进行移动,缩放,旋转操作,(补充简单动画)
- 手势操作(拖动控件、缩放图片)
- 滑轮控件研究四、VelocityTracker的简单研究
- 利用UIImageJPEGRepresentation与UIGraphicsBeginImageContext进行图片压缩的简单比较
- [置顶] Android 基于手势进行图片缩放
- 滑轮控件研究四、VelocityTracker的简单研究
- Android之——根据手势简单缩放图片
- android 关于图片缩放,旋转的简单应用
- 【Android游戏开发十六】Android Gesture之【触摸屏手势识别】操作!利用触摸屏手势实现一个简单切换图片的功能!
- Android应用中实现手势控制图片缩放的完全攻略
- 16—【Android游戏开发十六】Android Gesture之【触摸屏手势识别】操作!利用触摸屏手势实现一个简单切换图片的功能
- 滑轮控件研究四、VelocityTracker的简单研究