android noTouch (二)

简介: 引用:http://snmoney.blog.163.com/blog/static/440058201082522759391/     做一个像走马灯或者说地球仪一样的小玩意,研究触摸屏的交互费了点精神。

引用: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很轻易能找到范例和详解。
相关文章
|
11月前
|
API Android开发
android:descendantFocusability
android:descendantFocusability
40 0
|
Android开发
Android | 理解 ViewRootImpl
Android | 理解 ViewRootImpl
Android | 理解 ViewRootImpl
|
Android开发
Android 多进程通信之几个基本问题
开启多进程的方法 Android 中使用多进程只有一种方法,那就是给四大组件(Activity、Service、Receiver、ContentProvider)在AndroidMenifest中指定android:process属性 <service android:name="com.
2438 0
|
编解码 Java Android开发
Android小知识10则(上)(2018.8重编版)
Android小知识10则(下) 目录 前言 横竖屏锁定 不同分辨率的图标 将字符串写在资源文件中 为AlertDialog设置点击监听 ProgressDialog了解一下 最后 前言 Android的知识还是比较碎的, 日常积累很重要.
1024 0
|
Java Android开发 Shell
|
消息中间件 XML Android开发
|
Java 测试技术 Android开发
|
存储 Android开发 数据安全/隐私保护