您的位置:首页 > 其它

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

2014-12-25 10:54 423 查看
直接贴代码:

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

[java] view
plaincopy

/**

*实现一个利用手势缩放图片的小例子

*当手势是从左到右滑动的时候,放大图片

*当手势是从右到左滑动的时候,缩小图片

*/

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()回调方法里面度图片进行缩放。

[java] view
plaincopy

public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)

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

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

[java] view
plaincopy

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
plaincopy

/**

* 实现一个利用手势缩放图片的小例子 当手势是从左到右滑动的时候,放大图片 当手势是从右到左滑动的时候,缩小图片

*/

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;

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐