预期达到的效果:使用者在屏幕上进行滑扫操作,当滑扫到对应按钮时,手机会发出提示音。没有滑扫到对应按钮的时候无反应,能够做到简单的适盲化。
要重写onTouchEvent()函数。在函数中首先通过getX(),getY()函数获取屏幕滑扫过程中扫到的屏幕位置的坐标。然后根据坐标判断是否滑扫到了按钮,如果滑扫到了按钮,就执行对应的代码。
此处onTouchEvent()并非绑定在某个按钮下的,而是监测整个屏幕的。因为onTouchEvent方法是override 的Activity的方法。重新了Activity的onTouchEvent方法后,当屏幕有touch事件时,此方法就会别调用。
@Override
public boolean onTouchEvent(MotionEvent event) {
// 拦截底部布局的点击事件 返回值为true 消费事件
int x = (int) event.getX();
int y = (int) event.getY();
if(inner(entry,x,y))
{//滑扫到entry按钮后对应的事件 此处是音频播放
MediaPlayer mediaPlayer = MediaPlayer.create(this,R.raw.denglu);
mediaPlayer.start();
}
return true;
}
inner函数为判断滑扫位置是否在按钮中的函数,三个参数为Button n,int x,int y。n为被判断的按钮、x,y为滑扫位置的横、纵坐标。返回值为布尔型变量。true表面为在范围内,false表面不在范围内。inner的代码如下:
boolean inner(Button b,int x,int y)
{
float height=b.getHeight();
float width=b.getWidth();
//按钮宽度、高度
float xleftup=b.getX();
float yleftup=b.getY();
//左上角
float xrightdown=xleftup+height;
float yrightdown=yleftup+width;
//右下角
if (xleftup<x&&x<xrightdown&&yleftup<y&&y<yrightdown)
{
//判断是否滑扫到了按钮
return true;
}
return false;
}
需要通过Button.getX()函数、Button.getY()函数得出左上角的横纵坐标,再通过Button.getHeight()函数、Button.getWidth()函数获取按钮的高度和宽度,进而得出按钮的右下坐标的横纵坐标。
由于一条对角线就可以确定一个矩形,故通过左上角、右下角和扫描位置三个点的横纵坐标,可以判断出是否滑扫到了按钮。具体方法是:通过左上角和右下角的坐标可以得出按钮的上界,下界,左界,右界。故只要检测到滑扫时的触摸点在四个界限之内即可判断滑扫到了按钮。
不足之处:当屏幕有touch事件时,onTouchEvent()方法就会被调用,当没有扫描到按钮的时候,寒素的运行也会带来花销。这样会浪费手机运行资源,且实际使用时如果滑扫过快,会有一定的延迟。但上述方法大体能够完成基本功能要求。可以通过简化inner函数中判断是否滑扫到按钮的算法来降低延迟。
整个java文件的结构以及几个函数的位置安放如下所示: