您的位置:首页 > 其它

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

2012-05-15 18:24 537 查看
直接贴代码:

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

/**
*实现一个利用手势缩放图片的小例子
*当手势是从左到右滑动的时候,放大图片
*当手势是从右到左滑动的时候,缩小图片
*/
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;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  matrix float class
相关文章推荐