引用:http://snmoney.blog.163.com/blog/static/440058201082522759391/
做一个像走马灯或者说地球仪一样的小玩意,研究触摸屏的交互费了点精神。
我想做到的效果是,用手指搓屏幕上的一个ImageView,图片随着指尖移动的方向切换相应的图像资源
手头的文档实在贫乏,最可恶的是说到各种 Listener 的时候竟然两本书都是用一句话提到触摸用 onTouchListener() 就带过~TNND
陷入了 Google -> 出错 -> BBS发问 -> 无反应 -> 乱蒙 -> 又出错 -> Google 的无间炼狱 囧rz
好,2天之后终于炼狱跳出来了,扼要的实现代码如下
import ..略..
public class MyTouchPad extends Activity implements OnTouchListener {
private GestureDetector gd;//用于捕捉touch的详细手势(gesture)
private TextView tv_log;
private ImageView iv;
@Override
public void onCreate(Bundle saveInstanceState){
... ...
gd = new GestureDetector (this, new GDetector()); //创建一个GestureDetector实例,下文重写其onFling()方法
tv_log = (TextView) findViewById(R.id.tv_log);//没啥特别,用于显示调试信息的TextView
iv = (ImageView) findViewById(R.id.ImageView01); //我要用手指蹂躏的那张图片
iv.setOnTouchListener(this); //这里如果没有 implements OnTouchListener 会报错
iv.setLongClickable(true);//不加这个滑动就没反应了
}
public boolean onTouch(View v, MotionEvent event) {//把touch的event传递给gestureListener处理
return gd.onTouchEvent(event);
}
class GDetector extends SimpleOnGestureListener {//GDetector 名字是随便起的
@Override
public boolean onFling(MotionEvent e1, //按下时的状态,位置
MotionEvent e2, //松手时的状态,位置
float vx,//x坐标的移动速度,单位: px/秒
float vy,){//y坐标的移动速度
if((e1.getX()-e2.getX()>200) && (Math.abs(vx)>50)) {//滑动速度足够快至少50点/秒,手指起落点减起点是正值且>200 判断属于向左滑动
tv_log.setText("Fling to Left.\n"+tv_log.getText());//debug.输出到 tv_log
iv.setImageResouce(...);//向左划的时候如何怎样切换图片..略..
... ...
}else if ((e2.getX()-e1.getX()>200) && (Math.abs(vx)>50)) { //同理判断是向右滑动
tv_log.setText("Fling to Right.\n"+tv_log.getText()); //debug
... ...//相似处理向右划..略
}
}
}
}
如此这般,代码完成鸟,layout的xml我就不贴了,就是一个ImageView 和一个TextView 而已,名字对应就成
然后我发现,和我期望的还是有点不同,onFliing() 是在我滑动完毕后也就是手指离开屏幕的时候才触发和处理
没有那个“搓”的猥琐感觉.., 于是又查了一下 发现 onScroll() 才是更适合我需要的东西
在上面的代码的 GDetector 里面加入
public boolean onScroll(MotionEvent e1, //按下时的状态,位置
MotionEvent e2, //松手时的状态,位置
float dx,//注意!这里不是速度,是距离了!
float dy,){//y的距离,单位px
tv_log.setText("moved"+(e1.getX()-e2.getX())+" distanceX "+ dx + ".\n"+tv_log.getText());//debug
}
再来试试,这个很赞~随着我指尖在屏幕上的游走不断地输出onScroll 的信息,
最后onScroll() 和 onFling() 我都用上了, Scroll 的时候随手指的移动切换,当手指松开之后用Fling实现惯性的切换,这样就显得相当的自然了 :-)
Gesture还有
onDown, onShowPress, onSingleTapUp, onLongPress 等动作,都比较简单就不一一说了,google很轻易能找到范例和详解。