转自:http://www.apkbus.com/android-59152-1-1.html
本讲源代码:
edu.nju.wsj.libgdx.rar(3.57 MB, 下载次数: 155)
Libgdx中提供了一个手势检测的类:GestureDetector
- @Override
- public boolean keyDown(int arg0) {
- // TODO Auto-generated method stub
- //这里还要检测一下按键的类型
- if(arg0==Input.Keys.BACK){
- System.out.println("Back Pressed");
- activity.ag.setScreen(activity.mg);
- stage.removeActor(animal);
- }
- return false;
- }
我们来看看0.9.4的API里面对GestureDetector.GestureListener的介绍:
4.tap 就是轻击了,和触摸有点类似,不过速度应该比触摸快一些
5.TouchDown也非常好理解,手指按下的一瞬间就触发,不管其后是什么其他的动作都会触发touchDown()方法,如果时间较短,在touchDown()后会触发tap()
6.zoom与pinch对应,也是是一个多点触摸的手势,并且两个手指做出放大的动作
7.pan 和fliping比较类似,但是没有最后翻页的动作:
有了之前的介绍,相信大家已经大概明白了。我们实际尝试一下,代码在第八讲的基础上修改,让Progress.java实现GestureDetector.GestureListener:
- public class Progress implements Screen,InputProcessor,GestureListener
- @Override
- public boolean fling(float arg0, float arg1) {
- // TODO Auto-generated method stub
- Log.i("Testin-apkbus", "fling");
- return false;
- }
- @Override
- public boolean longPress(int arg0, int arg1) {
- // TODO Auto-generated method stub
- Log.i("Testin-apkbus", "longPress");
- return false;
- }
- @Override
- public boolean pan(int arg0, int arg1, int arg2, int arg3) {
- // TODO Auto-generated method stub
- Log.i("Testin-apkbus", "pan");
- return false;
- }
- @Override
- public boolean pinch(Vector2 arg0, Vector2 arg1, Vector2 arg2, Vector2 arg3) {
- // TODO Auto-generated method stub
- Log.i("Testin-apkbus", "pinch");
- return false;
- }
- @Override
- public boolean tap(int arg0, int arg1, int arg2) {
- // TODO Auto-generated method stub
- Log.i("Testin-apkbus", "tap");
- return false;
- }
- @Override
- public boolean touchDown(int arg0, int arg1, int arg2) {
- // TODO Auto-generated method stub
- Log.i("Testin-apkbus", "touchDown");
- return false;
- }
- @Override
- public boolean zoom(float arg0, float arg1) {
- // TODO Auto-generated method stub
- Log.i("Testin-apkbus", "zoom");
- return false;
- }
- Gdx.input.setInputProcessor();
这里还有一个问题,GestureDetector.GestureListener并不是一个InputProcessor,我们需要封装一个GestureDetector(它是一个InputProcessor)并加入系统监听列表
- Gdx.input.setInputProcessor(new GestureDetector(this));
- multiplexer.addProcessor(this);
- multiplexer.addProcessor(stage);
- multiplexer.addProcessor(new GestureDetector(this));
- Gdx.input.setInputProcessor(multiplexer);
编译一下,运行,进入游戏界面(在代码层次是Progress.java),我们用手来做出各种手势,观察输出。
进入该界面后,用手做出各种手势。
我们一个个来,先做轻击Tap的动作,即速度较快的敲击一下,输出:
- boolean pinch(Vector2 initialFirstPointer, Vector2 initialSecondPointer, Vector2 firstPointer, Vector2 secondPointer)
- boolean zoom(float originalDistance, float currentDistance)
其中pinch()方法中用到了一个类,Vector2,我们从名字就可以看出来,这个类代表了一个二维矢量,不过我们可以更简单的理解为Vector2就是一个点,里面有x,y两个坐标。回调函数pinch()里有四个Vector2对象,分别代表动作开始时的两个手指的位置和当前两个手指的位置。
同理对于zoom()方法也是一样,回调函数里面传入了两个参数,一个是动作开始时两个手指的距离,第二个参数就是当前两个手指之间的距离。
其实我们可以看出,pinch()方法比zoom()方法更全面,因为我们在pinch()方法中得到的是点的坐标,也可以转化成zoom()中的距离。
既然pinch()和zoom()成对出现,那么我们在两个函数中任意一个做处理都是可以的。接下来我们做一个简单的功能,用手指实现舞台stage上的Animal的大小的缩放。我们在AnimalActor.java中添加一个float变量power,标记缩放的倍数,初始值为1.0
- //标记AnimalActor的缩放倍数
- float power=1;
然后我们将AnimalActor的draw()函数中绘图部分的参数乘以power:
- public void draw(SpriteBatch arg0, float arg1) {
- // TODO Auto-generated method stub
- stateTime += Gdx.graphics.getDeltaTime();
- //得到下一帧
- currentFrame = animation.getKeyFrame(stateTime, true);
- //以(0,0)绘制为起点(左下角为0,0)画出动画,大小128*128
- arg0.draw(currentFrame,0, 0,128*power,128*power);
- }
然后我们在Progress.java的zoom()函数中实时修改AnimalActor的power值:
- @Override
- public boolean zoom(float arg0, float arg1) {
- // TODO Auto-generated method stub
- Log.i("Testin-apkbus", "zoom");
- animal.power=arg1/arg0;
- return false;
- }
运行看一下效果,我们用两个手指做一个放大的动作,看看效果吧:
放大的效果
我们再将它缩小
我们借助GestureDector还可以做出更复杂的手势识别,这里只是简单地演示一下,还要大家在平时的使用中多多尝试,就能开发出优秀的手势识别的游戏,提高游戏与用户之间的交互能力。