滑轮控件研究六、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;
}
}
}
第一个例子:利用手势缩放图片,没有解决图片放的太大,内存泄漏的问题,这个问题之后在研究
[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;
}
}
}
相关文章推荐
- 滑轮控件研究六、GestureDetector的简单应用,利用手势进行图片的缩放
- 滑轮控件研究六、GestureDetector的简单应用,利用手势进行图片的缩放
- 滑轮控件研究三、GestureDetector的中手势事件的测试
- 滑轮控件研究三、GestureDetector的中手势事件的测试
- 滑轮控件研究三、GestureDetector的中手势事件的测试
- 滑轮控件研究三、GestureDetector的中手势事件的测试
- 滑轮控件的研究五、ViewConfiguration的简单介绍
- 【Android游戏开发十六】Android Gesture之【触摸屏手势识别】操作!利用触摸屏手势实现一个简单切换图片的功能!
- 【Android游戏开发十六】Android Gesture之【触摸屏手势识别】操作!利用触摸屏手势实现一个简单切换图片的功能!
- 缩放图片的ImageView 可以进行两指缩放,并且可以进行拖拉的ImageView最简单原生的实现
- vc++中利用ado和listcontrol控件进行数据库应用开发的一点总结
- (转)【Android游戏开发十六】Android Gesture之【触摸屏手势识别】操作!利用触摸屏手势实现一个简单切换图片的功能!
- 【Android游戏开发十六】Android Gesture之【触摸屏手势识别】操作!利用触摸屏手势实现一个简单切换图片的功能!
- 【Android2D游戏开发十六】(上文之触摸屏手势)详解Android Gesture 手势操作!利用手势实现一个简单切换图片的功能!
- 滑轮控件研究四、VelocityTracker的简单研究
- 利用UIImageJPEGRepresentation与UIGraphicsBeginImageContext进行图片压缩的简单比较
- 滑轮控件研究四、VelocityTracker的简单研究
- 16—【Android游戏开发十六】Android Gesture之【触摸屏手势识别】操作!利用触摸屏手势实现一个简单切换图片的功能
- 【Android游戏开发十六】Android Gesture之【触摸屏手势识别】操作!利用触摸屏手势实现一个简单切换图片的功能!
- 【Android游戏开发十六】Android Gesture之【触摸屏手势识别】操作!利用触摸屏手势实现一个简单切换图片的功能!