} else {//范围内触摸
smallCircleX = (int) event.getX();
smallCircleY = (int) event.getY();
}
} else if (event.getAction() == MotionEvent.ACTION_UP) {
smallCircleX = bigCircleX;
smallCircleY = bigCircleY;

}
return true;
}

弧度计算

通过 event.getX(), event.getY()获得当前的触摸点,与圆点进行计算,获取弧度

/***

  • 得到两点之间的弧度
    */
    public float getRad(float px1, float py1, float px2, float py2) {
    float x = px2 - px1;

float y = py1 - py2;
//斜边的长
float z = (float) Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));
float cosAngle = x / z;
float rad = (float) Math.acos(cosAngle);

if (py2 < py1) {
rad = -rad;
}
return rad;
}

图形绘制

通过 canvas.drawCircle()和 canvas.drawBitmap()分别进行遥感按钮和遥感背景的绘制,注意对遥感背景的保存,如果在绘制的时候每次BitmapFactory.decodeResource()会增加耗时,因此只需在surfaceCreated()中进行bitmap的生成即可。

public void draw() {
try {
canvas = sfh.lockCanvas();
canvas.drawColor(getResources().getColor(R.color.ghostwhite));

// 指定图片绘制区域(左上角的四分之一)
Rect src = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());

// 指定图片在屏幕上显示的区域
Rect dst = new Rect(bigCircleX - bigCircleR, bigCircleY - bigCircleR, bigCircleX + bigCircleR, bigCircleY + bigCircleR);
// 绘制图片
remoteViewBg.draw(canvas, paint, src, dst);
paint.setColor(0x70ff0000);
//绘制摇杆
canvas.drawCircle(smallCircleX, smallCircleY, smallCircleR, paint);
} catch (Exception e) {
// TODO: handle exception
} finally {
try {
if (canvas != null)
sfh.unlockCanvasAndPost(canvas);
} catch (Exception e2) {
e2.printStackTrace();
}
}
}

使用

在activity中动态添加

RelativeLayout relativeLayout = (RelativeLayout) findViewById(R.id.dance_relative_layout);
remoteSurfaceView = new RemoteSurfaceView(this);
params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT,
RelativeLayout.LayoutParams.MATCH_PARENT);
remoteSurfaceView.setLayoutParams(params);
relativeLayout.addView(remoteSurfaceView);

关键代码

public RemoteSurfaceView(Context context) {
super(context);
sfh = this.getHolder();
sfh.addCallback(this);
paint = new Paint();
paint.setAntiAlias(true);
setFocusable(true);
setFocusableInTouchMode(true);
setZOrderOnTop(true);
getHolder().setFormat(PixelFormat.TRANSPARENT);

}

public void surfaceCreated(SurfaceHolder holder) {
int width = getWidth();
int height = getHeight();
bigCircleX = width / 2;
bigCircleY = height / 2;
bigCircleR = width / 4;
smallCircleX = width / 2;
smallCircleY = height / 2;
smallCircleR = width / 8;
bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.fangxiang);
remoteViewBg = new RemoteViewBg(bitmap);
th = new Thread(this);
flag = true;
th.start();

}

/***

  • 得到两点之间的弧度
    */
    public float getRad(float px1, float py1, float px2, float py2) {
    float x = px2 - px1;

float y = py1 - py2;
//斜边的长
float z = (float) Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));
float cosAngle = x / z;
float rad = (float) Math.acos(cosAngle);

if (py2 < py1) {
rad = -rad;
}
return rad;
}

@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN || event.getAction() == MotionEvent.ACTION_MOVE) {
// 范围外触摸
if (Math.sqrt(Math.pow((bigCircleX - (int) event.getX()), 2) + Math.pow((bigCircleY - (int) event.getY()), 2)) >= bigCircleR) {

double tempRad = getRad(bigCircleX, bigCircleY, event.getX(), event.getY());

getXY(bigCircleX, bigCircleY, bigCircleR, tempRad);
} else {//范围内触摸
smallCircleX = (int) event.getX();
smallCircleY = (int) event.getY();
}
} else if (event.getAction() == MotionEvent.ACTION_UP) {
smallCircleX = bigCircleX;
smallCircleY = bigCircleY;

文末

很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从那里入手去学习,对此我整理了一些资料,需要的可以免费分享给大家

这里笔者分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司19年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。如有需要点击这里前往我的GitHub免费获取。

【视频教程】

天道酬勤,只要你想,大厂offer并不是遥不可及!希望本篇文章能为你带来帮助,如果有问题,请在评论区留言。

44035206141)]

[外链图片转存中…(img-shjyE0tG-1644035206142)]

【视频教程】

[外链图片转存中…(img-ICamgxua-1644035206143)]

天道酬勤,只要你想,大厂offer并不是遥不可及!希望本篇文章能为你带来帮助,如果有问题,请在评论区留言。

Android自定义View之游戏摇杆键盘实现(一),值得推荐相关推荐

  1. Android自定义view摇杆,Android自定义View实现游戏摇杆键盘的方法示例

    前言 本文主要给大家介绍的是关于Android自定义View实现游戏摇杆键盘的相关内容,为什么会有这篇文章呢?因为在之前的一个项目,操作方向的方式为上下左右,左上需要同时按住左键和右键的方式进行操作. ...

  2. 自定义View之游戏摇杆键盘实现(二)

    前言 去年开发项目,需要实现一个遥感按钮,控制公司机器人行走,于是通过自定义SurfaceView实现了该功能,想了解的话,传送门在这自定义View之游戏摇杆键盘实现,但由于传输指令过程中对时间准确度 ...

  3. Android自定义View进阶-MotionEvent详解

    欢迎Follow我的GitHub, 关注我的CSDN. 其余参考Android目录 我们微信公众号:杨守乐 推荐文章: 如果你喜欢上了一个程序员小伙,献给所有的程序员女友 学习资料(干货汇集)不断更新 ...

  4. [原] Android 自定义View 密码框 例子

    遵从准则 暴露您view中所有影响可见外观的属性或者行为. 通过XML添加和设置样式 通过元素的属性来控制其外观和行为,支持和重要事件交流的事件监听器 详细步骤见:Android 自定义View步骤 ...

  5. Android 自定义view完全解析--带你通透了解自定义view

    参考转自郭霖博客带你一步步深入了解View系列 Android LayoutInflater原理分析 相信接触Android久一点的朋友对于LayoutInflater一定不会陌生,都会知道它主要是用 ...

  6. 【朝花夕拾】Android自定义View篇之(六)Android事件分发机制(中)从源码分析事件分发机制...

    前言 转载请注明,转自[https://www.cnblogs.com/andy-songwei/p/11039252.html]谢谢! 在上一篇文章[[朝花夕拾]Android自定义View篇之(五 ...

  7. 【朝花夕拾】Android自定义View篇之(六)Android事件分发机制(中)从源码分析事件分发逻辑及经常遇到的一些“诡异”现象

    前言 转载请注明,转自[https://www.cnblogs.com/andy-songwei/p/11039252.html]谢谢! 在上一篇文章[[朝花夕拾]Android自定义View篇之(五 ...

  8. Android 自定义View合集

    http://blog.csdn.net/u011507982/article/details/51199644 自定义控件学习  https://github.com/GcsSloop/Androi ...

  9. Android自定义View(七)_Canvas之图片文字

    在上一篇文章Canvas之画布操作中我们了解了画布的一些基本操作方法,本次了解一些绘制图片文字相关的内容.如果你对前几篇文章讲述的内容熟练掌握的话,那么恭喜你,本篇结束之后,大部分的自定义View已经 ...

最新文章

  1. VC编写自己构造http协议数据的post上传图片类(MFC环境 带编码转换)(转)
  2. mysql生产环境加索引_MySQl开发和生产环境索引对比
  3. Ubuntu 安装 QQ
  4. Java并发编程—为什么 wait() 方法需要写在 while 里,而不是 if?
  5. p1044与p1898
  6. 鸿蒙系统多会发布,华为官宣鸿蒙系统将发布,还将发布多款新品
  7. Prim最小生成树算法
  8. c++判断字符是否为空格或数字
  9. 阿里巴巴Java开发手册建议创建HashMap时设置初始化容量,但是多少合适呢?
  10. 撩妹利器之心形函数代码
  11. BLAST原理和用法总结(二)
  12. 银行营销策略数据分析 - 智能定位
  13. mac屏幕录像怎么录-ScreenFlow for mac完整安装-screenflow录屏录声音的方法
  14. 只有一端开口的瓶子(C++)
  15. GPS 车辆导航定位的应用前景
  16. 分享google+facebook+twitter(Eclipse)
  17. wnmp mysql_wnmp配置(windows+nginx+mysql+php开发环境)
  18. undefined reference to winmain
  19. javaCV将socket获取的视频流推到流媒体(RTMP)服务器
  20. 一日一技 | 利用油猴插件自定义网页显示字体

热门文章

  1. Dolby和DTS分别推出新一代环绕音频格式——DD PLUS DTS HD
  2. C语言电脑联想小新Air14可以,thinkbook14对比小新air14哪个更好
  3. QML中的Easing插值方式
  4. leetcode 1005. Maximize Sum Of Array After K Negations(python)
  5. python timedelta函数_通过日期字段提取年月日、timedelta提取时分秒并进行小时汇总...
  6. 一个for循环实现数组排序
  7. AI 换脸项目 ALAE 登顶 Github,AI 换脸又升级?
  8. 【ROG】关闭睡眠时键盘背光
  9. C#进阶系列——MEF实现设计上的“松耦合”(四):构造函数注入
  10. Macbook Pro 副屏 - Gobigger 4k 便携屏使用体验