本示例实现 通过手指来移动手机上的照片
程序原理是: 使用 ImageView 包含的Drawable 图片,照片在程序运行的一开始,就放在屏幕的中央。 通过 实现 onTouchEvent 来处理按下 (ACTION_DOWN)、 拖动(ACTION_MOVE)、 放开(ACTION_UP) 等事件来完成拖动图片的效果。 另外设置 ImageView 的 onClickListener 事件,在用户单击图片时,还原图片的初始位置.
要注意 3个 重点:
1. 通过 TouchEvent 重设图片的位置 setLayoutParams()
2. 取得屏幕大小范围,防止图片移出屏幕范围
3. 处理 onTouchEvent 事件,判断 User 操作行为
在 onTouchEvent() 方法中,针对 MotionEvent 的 ACTION_DOWN、ACTION_MOVE、ACTION_UP 动作, 自定义一个 picMove( ) 方法来重设图片位置。
在picMove () 方法中,先判断传入坐标的位置是否超过 屏幕的宽高,若已超过,则对传入的坐标进行调整,最后才是使用 ImageView 的 setLayoutParams () 方法,并添加一个AbsoluteLayout 对象。使用 AbsoluteLayout.LayoutParams () 方法带入宽、高、x坐标、y坐标等参数来重设图片显示的位置.
/*移动图片的方法*/
private void picMove(float x, float y) {
/*默认微调图片与指针的相对位置*/
mX=x-(intWidth/2);
mY=y-(intHeight/2);
/*防图片超过屏幕的相关处理*/
/*防止屏幕向右超过屏幕*/
if((mX+intWidth)>intScreenX) {
mX = intScreenX-intWidth;
}
/*防止屏幕向左超过屏幕*/
else if(mX<0) {
mX = 0;
}
/*防止屏幕向下超过屏幕*/
else if ((mY+intHeight)>intScreenY) {
mY=intScreenY-intHeight;
}
/*防止屏幕向上超过屏幕*/
else if (mY<0) {
mY = 0;
}
/*通过log 来查看图片位置*/
Log.i("jay", Float.toString(mX)+","+Float.toString(mY));
/* 以setLayoutParams方法,重新安排Layout上的位置 */
mImageView01.setLayoutParams (
new AbsoluteLayout.LayoutParams
(intWidth,intHeight,(int) mX,(int)mY)
);
}
示意图如下
在 使用 onTouchEvent 来实现触摸事件时,用到了 MotionEvent 对象,它可以用来判断单击触控屏幕的动作。MotionEvent 在 Android API中是一个通用的对象,可用来传递相关鼠标、触摸笔、手指与轨迹球等动作, 并返回绝对或相对的移动状态.
MotionEvent 对象提供了一些常用的常量, 用于判断动作.
名 称 | 值 | 说 明 |
ACTION_CANCEL | 3 | |
ACTION_DOWN | 0 | |
ACTION_MOVE | 2 | |
ACTION_UP | 1 | |
CREATER | ||
EDGE_BOTTOM | 2 | 是否触及屏幕的下方边界 |
EDGE_LEFT | 4 | 是否触及屏幕的左方边界 |
EDGE_RIGHT | 8 | 是否触及屏幕的右方边界 |
EDGE_TOP | 1 | 是否触及屏幕的上方边界 |
本示例具体代码 请参见 EX07_04 工程