虚拟手柄开发

几年前项目中想做一个手机模拟手柄的功能,在手机上绘制并通过触摸反馈获取操控信息,当时记录的博客只有贴图,很多人留言想借鉴思路,今天抽点时间把项目转成了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 (先扫码,再发邮件)

 

码字不易,请作者喝杯咖啡吧!

 

 

 

posted @ 2020-01-16 16:32  Liu Siyuan  阅读(1162)  评论(0编辑  收藏  举报