虚拟手柄开发
几年前项目中想做一个手机模拟手柄的功能,在手机上绘制并通过触摸反馈获取操控信息,当时记录的博客只有贴图,很多人留言想借鉴思路,今天抽点时间把项目转成了AndroidStudio版本,稍微写详细一点。
现在手机比几年前快了N倍,非常流畅毫无卡顿
首先上图:
这是我用到的素材(每个键的常态和按下状态,就是按下时要换图)
实现的效果:
然后写一下思路吧:
1、手柄按键分两类:
按键(A、B、X、Y,DPAD等,反馈的值是一个确定的值)
模拟量(左右摇杆,左右扳机(triggerL triggerR),反馈的值是一个偏移量(0到1之间的浮点值))
2、所有按键需要在SurfaceView上进行绘制,drawCanvas()方法进行实时状态绘制
3、相关技术:
- SurfaceView
- 触屏和多点触控处理
- Bitmap处理
- 震动
4、实现步骤:(按难度逐渐增加)
- 实现SurfaceView绘制
- 普通按钮
- 方向键
- 扳机键
- 摇杆
按键信息:--1 // A按下 按键信息:--0 // A抬起 按键信息:--2 // B按下 按键信息:--0 // B抬起 按键信息:--8 // X按下 按键信息:--0 // X抬起 按键信息:--16 // Y按下 按键信息:--0 // Y抬起
//每个按钮都独立封装,自己处理自己的贴图和触屏事件 //触屏事件处理,每个按键View自识别点击事件是否在自己的范围内: //手柄对象视图继承SurfaceView实现,加载所有按钮,统一对外输出按钮事件 @Override public boolean onTouchEvent(MotionEvent event) { if(gameButtonA != null) { gameButtonA.checkTouch(event); } if(gameButtonB != null) { gameButtonB.checkTouch(event); } if(gameButtonC != null) { gameButtonC.checkTouch(event); } if(gameButtonX != null) { gameButtonX.checkTouch(event); } if(gameButtonY != null) { gameButtonY.checkTouch(event); } if(gameButtonZ != null) { gameButtonZ.checkTouch(event); } if(gameButtonL1 != null) { gameButtonL1.checkTouch(event); } if(gameButtonR1 != null) { gameButtonR1.checkTouch(event); } if(gameButtonSelect != null) { gameButtonSelect.checkTouch(event); } if(gameButtonStart != null) { gameButtonStart.checkTouch(event); } if(gameButtonDpad != null) { gameButtonDpad.checkTouch(event); } if(mGameJoyL != null) { mGameJoyL.onTouchEvent(event); } if(mGameJoyR != null) { mGameJoyR.onTouchEvent(event); } if(mGameTriggerL != null) { mGameTriggerL.onTouchEvent(event); } if(mGameTriggerR != null) { mGameTriggerR.onTouchEvent(event); } return true; }
// 最后直接加载手柄视图 public class MainActivity extends Activity { private GamePadSurfaceView mouseSurfaceView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); requestWindowFeature(Window.FEATURE_NO_TITLE); mouseSurfaceView = new GamePadSurfaceView(this); mouseSurfaceView.setOnGamePadKeyActionListener(padKeyActionListener); mouseSurfaceView.setOnGamePadMotionActionListener(padMotionActionListener); setContentView(mouseSurfaceView); } private GamePadSurfaceView.OnGamePadKeyActionListener padKeyActionListener = new GamePadSurfaceView.OnGamePadKeyActionListener() { @Override public void onKeyActionListener(long keyInfo) { } }; private GamePadSurfaceView.OnGamePadMotionActionListener padMotionActionListener = new GamePadSurfaceView.OnGamePadMotionActionListener() { @Override public void onMotionActionListener(float[] motionValues) { } }; }
代码刚找回编译,需要源码参考,可以发邮件到:syliu.11@163.com (先扫码,再发邮件)
码字不易,请作者喝杯咖啡吧!