在做图片浏览器例子的时候,想实现ImageView2随着手指在ImageView1上的滑动即时显示局部图像,但是教材上的例子不能做到即时效果,折腾很久。
image01.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO 自动生成的方法存根
Bitmap bitmap = ((BitmapDrawable)image01.getDrawable()).getBitmap();
//bitmap实际大小与image01的比值
double scale = bitmap.getWidth()/(double)image01.getWidth();
int x = (int)(event.getX()*scale);
int y = (int)(event.getY()*scale);
if(x+120>bitmap.getWidth())
x = bitmap.getWidth()-120;
if(y+120>bitmap.getHeight())
y = bitmap.getHeight()-120;
image02.setImageBitmap(Bitmap.createBitmap(bitmap,x,y,120,120));
image02.setAlpha(alpha);
return true;
}
});
后来试了新写一个ImageView继承类的onTouchEvent方法,ImageView2连图像都不显示。然后研究下了下两个方法的区别:
1.onTouch方法:
onTouch方法是View的 OnTouchListener借口中定义的方法。
当一个View绑定了OnTouchLister后,当有touch事件触发时,就会调用onTouch方法。
(当把手放到View上后,onTouch方法被一遍一遍地被调用)
2.onTouchEvent方法:
onTouchEvent方法是override 的Activity的方法。
重新了Activity的onTouchEvent方法后,当屏幕有touch事件时,此方法就会别调用。
(当把手放到Activity上时,onTouchEvent方法就会一遍一遍地被调用)
3.touch事件的传递:
在一个Activity里面放一个TextView的实例tv,并且这个tv的属性设定为 fill_parent
在这种情况下,当手放到屏幕上的时候,首先会是tv响应touch事件,执行onTouch方法。
如果onTouch返回值为true,
表示这个touch事件被onTouch方法处理完毕,不会把touch事件再传递给Activity,
也就是说onTouchEvent方法不会被调用。
(当把手放到屏幕上后,onTouch方法被一遍一遍地被调用)
如果onTouch的返回值是false,
表示这个touch事件没有被tv完全处理,onTouch返回以后,touch事件被传递给Activity,
onTouchEvent方法被调用。
(当把手放到屏幕上后,onTouch方法调用一次后,onTouchEvent方法就会一遍一遍地被调用)
由此将onTouch方法最后的返回值改为true问题就可以解决了