【Android源码 栏目提醒】:网学会员为广大网友收集整理了,Android触摸屏及按键处理代码 - 企业软件开发,希望对大家有所帮助!
第4章 触 摸 屏 触摸屏给用户带来了全新的体检。
几年前它还是高端手机的专利现在触摸屏、多点触摸已成为手机必须支持的内容。
手机对触摸屏的支持极大地方便了用户操作多点触摸、手势的引入成就了很多经典应用如滑动页面、浏览器、图片放大等。
Android、iOS、Windows Phone对触摸屏的支持非常好本章将介绍如何设计触摸屏程序、如何支持手势等。
单点是指每次一个指头触控屏幕而两个以上的指头同时触屏称为多点触摸。
一系列的触摸点形成的路径称为手势。
4.1
Android触摸屏 输入是用户交互的一个重要组成部分触摸屏和键盘是
Android系统的标配输入设备多数游戏、应用都离不开这两个输入设备。
本节给出一个小程序演示基本的触摸屏和按键处理虽然不能覆盖全部的情况但至少可以起到抛砖引玉的作用。
4.1.1
Android输入处理 在
Android系统中输入事件一般是由View类来处理的通过实现一些事件监听接口就能够处理这些事件并且决定是否拦截下来。
1事件监听接口及设置监听
Android系统提供了几个事件监听接口见表4-1。
表4-1
Android系统事件监听接口 事件监听接口 方 法 功 能 View.OnClickListener onClickView 监听在View上面的屏幕单击事件 View.OnLongClickListener onLongClickView 监听在View上面的屏幕长按事件 View.OnKeyListener onKeyView 监听在View上面的按键事件 View.OnTouchListener onTouchViewMotionEvent 监听在View上面的屏幕长按事件 提 示 View.OnKeyListener只有在View被选中的情况下才会监听到事件所以这个按键处理的方法不是很常用。
如果要监听某个View窗口中的输入事件只要实现对应的接口并且在View中设置监听即可。
比如 public class TouchDemo extends Activity implements OnClickListener //..省略部分代码 mTouchView.setOnClickListenerthis //..省略部分代码 Override public void onClickView arg0 ifarg0.getId R.id.tv1 mLogView.appendonClick eventn mLogView.scrollBy0 10 上面的代码实现了一个简单的监听接口interface并将其添加到View窗口的监听队列中去。
提 示 除了监听接口以外View类里面也有默认的处理方法在实现View类的时候进行重载就可以了 onKeyDownint KeyEvent——处理按键按下事件 onKeyUpint KeyEvent——处理按键弹起事件 onTrackballEventMotionEvent——处理轨迹球运动事件 onTouchEventMotionEvent——处理触摸事件。
2按键事件处理 上一节已介绍过可以在View中处理按键事件只要实现了OnKeyEventListener接口即可同时也可以使用View类的onKeyDown或者onKeyUp。
但是我们往往希望按键事件是在整个程序屏幕上都可以响应的所以这个时候在Activity中进行响应会更加方便。
Activity提供了“boolean onKeyDownint keyCodeKeyEvent event”方法可以监听到按键而KeyEvent类提供了按键编码的常量定义例如KeyEvent.KEYCODE_MENU表示菜单按键。
3输入事件拦截器 在了解了触屏和按键操作的处理以后我们来完成一个输入事件拦截器的小应用如图4-1所示。
图4-1 程序实现了对click事件longclick、touch轨迹的拦截从图4-1中可以看出实现了所有4种拦截全部打开而触摸的轨迹在屏幕上面也形成了“test”字样。
也就是说这个小程序可以实现单击、长按、触摸事件的拦截而要实现按键、多点触摸、方向的拦截只需在这个小程序的基础上进行一定的扩充即可。
下面来看具体的程序实现 1布局文件main.xml的片段 拦截功能区 触摸区 事件日志区 2主类实现了所有的事件监听器 public class TouchDemo extends Activity implements OnClickListener OnLongClickListener OnTouchListener OnCheckedChangeListener private TextView mLogView private SimpleView mTouchView private CheckBox mBoxClick private CheckBox mBoxLongClick private CheckBox mBoxTouch private CheckBox mBoxTouchTrack Override public void onCreateBundle savedInstanceState super.onCreatesavedInstanceState setContentViewR.layout.main mLogView TextViewfindViewByIdR.id.tv0 mTouchView SimpleViewfindViewByIdR.id.tv1 mTouchView.setBackgroundColorColor.CYAN mTouchView.setOnClickListenerthis mTouchView.setOnLongClickListenerthis mTouchView.setOnTouchListenerthis mLogView.setTextSizefloat 10.0 mBoxClick CheckBoxfindViewByIdR.id.box_click mBoxLongClick CheckBoxfindViewByIdR.id.box_longclick mBoxTouch CheckBoxfindViewByIdR.id.box_touch mBoxTouchTrack CheckBoxfindViewByIdR.id.box_touch_track mBoxTouchTrack.setOnCheckedChangeListenerthis Override public void onClickView arg0 // 单击 ifmBoxClick.isChecked // 确定用户是否选择了监听单击事件 ifarg0.getId R.id.tv1 mLogView.appendonClick eventn // 记录到日志窗口 mLogView.scrollBy0 10 // 滚动日志 Override public boolean onLongClickView arg0 // 长按 ifmBoxLongClick.isChecked ifarg0.getId R.id.tv1 mLogView.appendonLongClick eventn // 下面进行随机返回处理以便于观察事件处理之间的关系请参考后面的小结 ifSystem.currentTimeMillis 2 0 mLogView.appendonLongClick return truen return true else mLogView.appendonLongClick return falsen return false return false // 默认不处理交由后面的环节去处理 Override public boolean onTouchView arg0 MotionEvent ev ifmBoxTouchTrack.isChecked // FIXME: 多点触摸版本 // 参考后面对多点触摸API的描述很容易就能够修改成支持多点触摸的版本 final int historySize ev.getHistorySize for int h 0 h historySize h mTouchView.DrawPointev.getHistoricalXh ev.getHistoricalYh mTouchView.DrawPointev.getX ev.getY ifmBoxTouch.isChecked ifarg0.getId R.id.tv1 mLogView.appendonTouch event point ev.getX ev.getY mLogView.scrollBy0 10 // 同样随机返回处理只是用于实验真实的场景不必如此 ifSystem.currentTimeMillis 2 0 mLogView.appendonTouch return truen mLogView.scrollBy0 10 return true else mLogView.appendonTouch return falsen mLogView.scrollBy0 10 return false return false Override public void onCheckedChangedCompoundButton arg0 boolean arg1 ifarg0 mBoxTouchTrack ifarg1 mTouchView.InitCache // 清空轨迹面板 Override public boolean onKeyDownint keyCode KeyEvent event mLogView.appendkeyCode keyCode action event.getAction if keyCode KeyEvent.KEYCODE_MENU // 按下菜单按键的处理 mLogView.append按下菜单 return true return super.onKeyDownkeyCode event 3触摸类负责接收触摸事件并画出轨迹 public class SimpleView extends View private final static int WIDTH 320 private final static int HEIGHT 200 private Bitmap mBitmapCache private Canvas mCanvasCache private Paint mPaint public SimpleViewContext context supercontext Constructcontext public SimpleViewContext contextAttributeSet attr supercontextattr Constructcontext private void ConstructContext context // FIXME: onMesured的时候要重新创建cache mBitmapCache Bitmap.createBitmapWIDTH HEIGHT Bitmap.Config.ARGB_8888 mCanvasCache new CanvasmBitmapCache mPaint new Paint mPaint.setAlpha0x40 mPaint.setColorColor.BLUE // 在缓冲中划一个点并且通知刷新画面 public void DrawPointfloat x float y mCanvasCache.drawPointx y mPaint invalidate public void InitCache mCanvasCache.drawColorColor.WHITE invalidate protected void onDrawCanvas canvas super.onDrawcanvas canvas.drawBitmapmBitmapCache 0 0 mPaint 4.1.2
Android多点触摸与手势 更多源代码下载地址http://www.devdiv.com/thread-85477-1-1.html
上一篇:
Android实现方式
下一篇:
4种小菜缓解孕妈咪不适