Android 遥控器

在这里插入图片描述

遥控器源码
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RadialGradient;
import android.graphics.Region;
import android.graphics.Shader;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;import androidx.annotation.Nullable;import com.anbao.monitor.robot.schemas.Direction;/*** 方向盘控制*/
public class SteeringView extends View {private Paint paint;//第1个圆颜色private int circle1Color = Color.WHITE;//第2个圆颜色private int circle2Color = Color.parseColor("#4D5D6E");//第3个圆颜色private int circle3Color = Color.WHITE;//第4个圆颜色private int circle4Color = Color.GRAY;//线条颜色private int strokeColor = Color.WHITE;//左边三角形颜色private int leftTriangleColor = Color.WHITE;//右边三角形颜色private int rightTriangleColor = Color.WHITE;//上边三角形颜色private int topTriangleColor = Color.WHITE;//下边三角形颜色private int bottomTriangleColor = Color.WHITE;//第一个圆和第二个圆间距private float padding = 8;//线条宽度private float strokeWidth = 5;//第三个圆比例private float circle3RadiusFactor = 0.4f;//第4个圆比例private float circle4RadiusFactor = 0.3f;//三角形边长private float triangleLength = 100;//三角形和第二个圆间距private float trianglePadding = 90;//中心Xprivate float cx;//中心Yprivate float cy;//半径private float radius;//高度protected float height;//左点击区域private Region leftRegion;//右点击区域private Region rightRegion;//上点击区域private Region topRegion;//下点击区域private Region bottomRegion;public SteeringView(Context context) {this(context, null);}public SteeringView(Context context, @Nullable AttributeSet attrs) {this(context, attrs, 0);}public SteeringView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);paint = new Paint();paint.setAntiAlias(true);paint.setColor(circle2Color);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);height = getMeasuredHeight();radius = Math.min(getMeasuredHeight(), getMeasuredWidth()) / 2f;cx = getMeasuredWidth() / 2f;cy = getMeasuredHeight() / 2f;trianglePadding = radius * 0.2f;triangleLength = radius * 0.22f;}@Overridepublic boolean onTouchEvent(MotionEvent event) {float x = event.getX();float y = event.getY();switch (event.getAction()) {case MotionEvent.ACTION_DOWN:if (leftRegion.contains((int) x, (int) y)) {leftTriangleColor = Color.RED;onSteeringDirection(Direction.LEFT);} else if (rightRegion.contains((int) x, (int) y)) {rightTriangleColor = Color.RED;onSteeringDirection(Direction.RIGHT);} else if (topRegion.contains((int) x, (int) y)) {topTriangleColor = Color.RED;onSteeringDirection(Direction.FORWARD);} else if (bottomRegion.contains((int) x, (int) y)) {bottomTriangleColor = Color.RED;onSteeringDirection(Direction.BACKWARDS);}break;case MotionEvent.ACTION_UP:leftTriangleColor = Color.WHITE;rightTriangleColor = Color.WHITE;topTriangleColor = Color.WHITE;bottomTriangleColor = Color.WHITE;break;}invalidate();return true;}/*** 方向控制** @param direction 方向*/private void onSteeringDirection(Direction direction) {//左转if (direction == Direction.LEFT) {}//右转else if (direction == Direction.RIGHT) {}//前进else if (direction == Direction.FORWARD) {}//后退else if (direction == Direction.BACKWARDS) {}}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);paint.setShader(null);//外圆paint.setStyle(Paint.Style.FILL);paint.setColor(circle1Color);canvas.drawCircle(cx, cy, radius, paint);//内圆paint.setColor(circle2Color);canvas.drawCircle(cx, cy, radius - padding, paint);//中心圆paint.setColor(circle3Color);canvas.drawCircle(cx, cy, radius * circle3RadiusFactor, paint);//左->右斜线paint.setColor(strokeColor);paint.setStrokeWidth(strokeWidth);float radians = (float) Math.toRadians(45);float lsx = cx - (float) ((radius - padding) * Math.cos(radians));float lsy = height / 2.0f - (float) ((radius - padding) * Math.sin(radians));float lex = cx + (float) ((radius - padding) * Math.cos(radians));float ley = height / 2.0f + (float) ((radius - padding) * Math.sin(radians));canvas.drawLine(lsx, lsy, lex, ley, paint);//右->左斜线float rsx = cx + (float) ((radius - padding) * Math.cos(radians));float rsy = height / 2.0f - (float) ((radius - padding) * Math.sin(radians));float rex = cx - (float) ((radius - padding) * Math.cos(radians));float rey = height / 2.0f + (float) ((radius - padding) * Math.sin(radians));canvas.drawLine(rsx, rsy, rex, rey, paint);//绘制左边箭头drawLeftTriangle(canvas);//绘制右边箭头drawRightTriangle(canvas);//绘制上方箭头drawTopTriangle(canvas);//绘制下方箭头drawBottomTriangle(canvas);//按下区域leftRegion = buildLeftRegion();rightRegion = buildRightRegion();topRegion = buildTopRegion();bottomRegion = buildBottomRegion();//外发光圆int[] colors = {Color.TRANSPARENT, circle4Color};float[] stops = {0.3f, 1.0f};RadialGradient gradient = new RadialGradient(cx, cy, radius * 0.3f, colors, stops, Shader.TileMode.CLAMP);paint.setShader(gradient);canvas.drawCircle(cx, cy, radius * circle4RadiusFactor, paint);}/*** 绘制左边三角形** @param canvas*/private void drawLeftTriangle(Canvas canvas) {paint.setStrokeCap(Paint.Cap.ROUND);paint.setStyle(Paint.Style.FILL);paint.setColor(leftTriangleColor);Path path = new Path();path.moveTo(cx - radius + trianglePadding, cy);path.lineTo(cx - radius + trianglePadding + triangleLength, cy - triangleLength / 2f);path.lineTo(cx - radius + trianglePadding + triangleLength, cy + triangleLength / 2f);path.lineTo(cx - radius + trianglePadding, cy);canvas.drawPath(path, paint);}/*** 绘制右边三角形** @param canvas*/private void drawRightTriangle(Canvas canvas) {paint.setStrokeCap(Paint.Cap.ROUND);paint.setStyle(Paint.Style.FILL);paint.setColor(rightTriangleColor);Path path = new Path();path.moveTo(cx + radius - trianglePadding, cy);path.lineTo(cx + radius - trianglePadding - triangleLength, cy - triangleLength / 2f);path.lineTo(cx + radius - trianglePadding - triangleLength, cy + triangleLength / 2f);path.lineTo(cx + radius - trianglePadding, cy);canvas.drawPath(path, paint);}/*** 绘制上方三角形** @param canvas*/private void drawTopTriangle(Canvas canvas) {paint.setStrokeCap(Paint.Cap.ROUND);paint.setStyle(Paint.Style.FILL);paint.setColor(topTriangleColor);Path path = new Path();path.moveTo(cx, cy - radius + trianglePadding);path.lineTo(cx + triangleLength / 2f, cy - radius + trianglePadding + triangleLength);path.lineTo(cx - triangleLength / 2f, cy - radius + trianglePadding + triangleLength);path.lineTo(cx, cy - radius + trianglePadding);canvas.drawPath(path, paint);}/*** 绘制下方箭头** @param canvas*/private void drawBottomTriangle(Canvas canvas) {paint.setStrokeCap(Paint.Cap.ROUND);paint.setStyle(Paint.Style.FILL);paint.setColor(bottomTriangleColor);Path path = new Path();path.moveTo(cx, cy + radius - trianglePadding);path.lineTo(cx + triangleLength / 2f, cy + radius - trianglePadding - triangleLength);path.lineTo(cx - triangleLength / 2f, cy + radius - trianglePadding - triangleLength);path.lineTo(cx, cy + radius - trianglePadding);canvas.drawPath(path, paint);}/*** 构建左边区域** @return*/private Region buildLeftRegion() {Region region = new Region();Path path = new Path();path.moveTo(cx, cy);path.addArc(cx - radius, cy - radius, cx + radius, cy + radius, -135, -90);path.lineTo(cx, cy);paint.setColor(Color.RED);Region clip = new Region((int) (cx - radius), (int) (cy - radius), (int) (cx - radius * circle3RadiusFactor), (int) (cy + radius));region.setPath(path, clip);return region;}/*** 构建右边区域** @return*/private Region buildRightRegion() {Region region = new Region();Path path = new Path();path.moveTo(cx, cy);path.addArc(cx - radius, cy - radius, cx + radius, cy + radius, -45, 90);path.lineTo(cx, cy);paint.setColor(Color.RED);Region clip = new Region((int) (cx + radius * circle3RadiusFactor), (int) (cy - radius), (int) (cx + radius), (int) (cy + radius));region.setPath(path, clip);return region;}/*** 构建上方区域** @return*/private Region buildTopRegion() {Region region = new Region();Path path = new Path();path.moveTo(cx, cy);path.addArc(cx - radius, cy - radius, cx + radius, cy + radius, -45, -90);path.lineTo(cx, cy);paint.setColor(Color.RED);Region clip = new Region((int) (cx - radius), (int) (cy - radius), (int) (cx + radius), (int) (cy - radius * circle3RadiusFactor));region.setPath(path, clip);return region;}/*** 构建下方区域** @return*/private Region buildBottomRegion() {Region region = new Region();Path path = new Path();path.moveTo(cx, cy);path.addArc(cx - radius, cy - radius, cx + radius, cy + radius, 45, 90);path.lineTo(cx, cy);paint.setColor(Color.RED);Region clip = new Region((int) (cx - radius), (int) (cy + radius * circle3RadiusFactor), (int) (cx + radius), (int) (cy + radius));region.setPath(path, clip);return region;}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/36198.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

个微API二次开发

通过 E云API 可以实现 个性化微信功能 (例:营销系统、云发单助手、社群管家webot、客服系统等),用来自动管理微信消息。 可开发的功能包括但不限于: 好友管理: 添加好友、删除好友、修改备注、创建标签、获…

云动态摘要 2024-06-28

给您带来云厂商的最新动态,最新产品资讯和最新优惠更新。 最新优惠与活动 [新客专享]WeData 限时特惠 腾讯云 2024-06-21 数据分类分级管理,构建数据安全屏障 ,仅需9.9元! 云服务器ECS试用产品续用 阿里云 2024-04-14 云服务器…

VMware虚拟机三种网络模式设置 - Host-Only(仅主机模式)

一、前言 在之前的《Bridged(桥接模式)》、《NAT(网络地址转换模式)》中,我详细介绍了虚拟机网络模式设置中的桥接模式与网络地址转换模式。今天详细讲解一下Host-Only(仅主机模式)。 在VMware虚…

Java代码基础算法练习-判断学生成绩等级-2024.06.28

任务描述: 输入一个学生的成绩(成绩大于等于 0 并小于等于 100),根据成绩判断学生成绩的等级。 60 分以下不及格;60-70 分为及格;70-80 分为中等;80-90 分为良好;90 分以上为优秀。 …

版本控制工具-git分支管理

目录 前言一、git分支管理基本命令1.1 基本命令2.1 实例 二、git分支合并冲突解决三、git merge命令与git rebase命令对比 前言 本篇文章介绍git分支管理的基本命令,并说明如何解决git分支合并冲突,最后说明git merge命令与git rebase命令的区别。 一、…

Excel 宏录制与VBA编程 —— 15、MsgBox参数详解

Msgbox参数具体如下 Msgbox参数使用1 Msgbox参数使用2(返回值示例) &ensp ;###### 关注 笔者 - jxd

ANSYS Electronics 电磁场仿真工具下载安装,ANSYS Electronics强大的功能和灵活性

ANSYS Electronics无疑是一款在电磁场仿真领域表现卓越的软件工具。它凭借强大的功能和灵活性,帮助用户在产品设计阶段就能精确预测和优化电磁场性能,从而极大地降低了实际测试成本,并显著提升了产品的可靠性。 这款软件不仅在电子设计领域有…

linux中awk,sed, grep使用(待补充)

《linux私房菜》这本书中将sed和awk一同归为行的修改这一点,虽然对,但不利于实际处理问题时的思考。因为这样的话,当我们实际处理问题时,遇到比如说统计文本打印内容时,我们选择sed还是awk进行处理呢? 也因…

VS Code 配置cmake(Linux环境)

通过sudo apt install cmake在linux上安装cmake 在Vs Code中安装这两个插件 通过命令whereis cmake获取linux中cmake的路径信息 右键CMake Tools右下角齿轮标志,选择扩展设置(Extension Settings) 注意要设置的是本地,还是远程连接…

添加用户页面(Flask+前端+MySQL整合)

首先导入Flask库和pymysql库。Flask用于创建Web应用程序,pymysql用于连接和操作MySQL数据库。 from flask import Flask, render_template, request import pymysql创建一个Flask应用实例。__name__参数告诉Flask使用当前模块作为应用的名称。 app Flask(__name_…

高效管理客户的秘诀:企业如何建立稳固的客户关系

如今的竞争,从商业模式、产品、服务到销售环节,竞争已经不再是单一层面的,而是全方位的,企业需要打造全价值链竞争优势。在这个过程中,客户管理的作用是无可替代的,成为企业成功的关键因素之一。如何高效地…

基于Java的蛋糕预定系统【附源码+LW】

摘 要 当今社会进入了科技进步、经济社会快速发展的新时代。国际信息和学术交流也不断加强,计算机技术对经济社会发展和人民生活改善的影响也日益突出,人类的生存和思考方式也产生了变化。传统购物方式采取了人工的管理方法,但这种管理方法存…

0628_ARM4

练习&#xff1a; stm32流水灯 .text .global _start _start: 使能GPIOE外设时钟 0X50000A28 RCC_MP_AHB4ENSETR[4]->1 LDR R0,0x50000a28 指定操作的内存地址 LDR R1,[R0] 将R0对应的地址空间中的值读取出来 ORR R1,R1,#(0x3<<4) 将第4,5位设置为1 STR…

.net 8 集成 MinIO文件存储服务,实现bucket管理,以及文件对象的基本操作

一、准备工作 1、本地部署MinIO服务 2、创建MinIO的Access Key 3、创建.net 项目 4、下载MinIO sdk 5、相关文档 二、编写MinIO工具类 三、管理存储桶 1、MyBucket类 &#xff08;1&#xff09;判断bucket是否存在 &#xff08;2&#xff09;新建bucket &#xff08…

AI大模型-关于推理、可解释性和 LLMs_ai 推理模型

引言&#xff1a;以下文章的主题我已经思考了很久&#xff0c;我希望能我的话能引起你的思考&#xff0c;并于一些更悲观的AI评论相均衡。推理和可解释性是充满细微差别的主题——我希望这篇文章能体现这一点。 去年 GPT-4 发布时&#xff0c;我注意到出现了一个特殊的议论&…

新能源行业必会基础知识-----电力市场概论笔记-----经济学基础

新能源行业知识体系-------主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/139946830 目录 1. 什么是市场2. 电力市场机制设计的基本要求 1. 什么是市场 经济学定义 市场是供需双方交易并决定商品价格和产量的机制市场可…

JVM原理(一):JVM运行时数据区域的分析

1. 程序计数器 程序计数器是一块较小的内存空间&#xff0c;它可以看作是当前线程所执行的字节码的行号指示器。 作用 在Java虛拟机的概念模型里&#xff0c;字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令&#xff0c;它是程序控制流的指示…

一站式企业服务平台能够帮助企业解决哪些问题?

近年来一站式企业服务平台备受区域政府及园区管理者的青睐&#xff0c;充当着区域政府或园区的千里眼和顺风耳&#xff0c;可以用来捕捉与区域经济发展相关的信息&#xff0c;也可以用来倾听企业的诉求&#xff0c;更是成为了区域深抓企业服务的多面手。 同时&#xff0c;一站式…

高电压技术-冲击高压发生器MATLAB仿真

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 冲击电压发生器是产生冲击电压波的装置&#xff0c;用于检验电力设备耐受大气过电压和操作过电压的绝缘性能&#xff0c;冲击电压发生器能产生标准雷电冲击电压波形&#xff0c;雷电冲击电压截波,标准操作冲击…

容器化spring boot应用程序

容器化spring boot应用程序有多种方式&#xff0c;如基于简单的Dockerfile&#xff0c;多阶段Dockerfile以及基于Docker Compose等&#xff0c;我们将逐步给大家介绍&#xff0c;本节主要介绍基于简单的Dockerfile进行容器化spring boot的应用程序。 创建Spring boot应用程序 …