当前位置: 首页 > news >正文

Android绘制靶面,初步点击位置区域划分取值测试

 自定义View:

public class TargetView extends View {private Paint paint;private int[] radii = {100, 250, 400, 550, 700}; // 五个圆的半径private int numberOfSegments = 8;private int[][] regionValues; // 存储每个区域的值public TargetView(Context context) {super(context);init();}private void init() {paint = new Paint();regionValues = new int[5][numberOfSegments]; // 5个圆,每个圆8个区域for (int i = 0; i < 5; i++) {for (int j = 0; j < numberOfSegments; j++) {regionValues[i][j] = i * numberOfSegments + j + 1; // 示例值}}}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);drawCircles(canvas);drawSegments(canvas);drawSegmentValues(canvas);}private void drawCircles(Canvas canvas) {for (int radius : radii) {paint.setColor(Color.LTGRAY);canvas.drawCircle(getWidth() / 2, getHeight() / 2, radius, paint);}}private void drawSegments(Canvas canvas) {paint.setColor(Color.BLACK);for (int i = 0; i < numberOfSegments; i++) {float angle = (float) (Math.toRadians(360.0 / numberOfSegments * i));for (int radius : radii) {float startX = (float) (getWidth() / 2 + radius * Math.cos(angle));float startY = (float) (getHeight() / 2 + radius * Math.sin(angle));canvas.drawLine(getWidth() / 2, getHeight() / 2, startX, startY, paint);}}}private void drawSegmentValues(Canvas canvas) {paint.setColor(Color.BLACK);paint.setTextSize(40);paint.setTextAlign(Paint.Align.CENTER);for (int i = 0; i < regionValues.length; i++) {for (int j = 0; j < numberOfSegments; j++) {float angle = (float) (Math.toRadians(360.0 / numberOfSegments * j + 22.5)); // 中心角float centerX = (float) (getWidth() / 2 + radii[i] * Math.cos(angle) * 0.5);float centerY = (float) (getHeight() / 2 + radii[i] * Math.sin(angle) * 0.5);canvas.drawText(String.valueOf(regionValues[i][j]), centerX, centerY, paint);}}}@Overridepublic boolean onTouchEvent(MotionEvent event) {if (event.getAction() == MotionEvent.ACTION_DOWN) {float x = event.getX();float y = event.getY();int[] result = getRegionIndex(x, y);if (result != null) {int circleIndex = result[0];int segmentIndex = result[1];String position = getPosition(x, y);String message = "环: " + (circleIndex + 1) + ", 分割点: " + (segmentIndex + 1) + ", 位置: " + position;Toast.makeText(getContext(), message, Toast.LENGTH_SHORT).show();}}return true;}private int[] getRegionIndex(float x, float y) {float dx = x - getWidth() / 2;float dy = y - getHeight() / 2;double distance = Math.sqrt(dx * dx + dy * dy);for (int i = 0; i < radii.length; i++) {if (distance <= radii[i]) {for (int j = 0; j < numberOfSegments; j++) {double angle = Math.toDegrees(Math.atan2(dy, dx));if (angle < 0) angle += 360;if (angle >= (360.0 / numberOfSegments) * j && angle < (360.0 / numberOfSegments) * (j + 1)) {return new int[]{i, j}; // 返回圆的索引和分割区域索引}}}}return null; // 点击不在任何区域内}private String getPosition(float x, float y) {String horizontal = (x < getWidth() / 2) ? "左" : "右";String vertical = (y < getHeight() / 2) ? "上" : "下";return horizontal + " " + vertical;}

TestActivity : 

import android.os.Bundle;import androidx.appcompat.app.AppCompatActivity;public class TestActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(new TargetView(this));TargetView targetView = new TargetView(this);setContentView(targetView);}
}
build.gradle的module中dependencies 增加:
    implementation 'com.licheedev:android-serialport:2.1.3'

xml自定义布局引用:

    <com.所在包名.TargetViewandroid:layout_width="match_parent"android:layout_height="match_parent"/>
http://www.lryc.cn/news/440564.html

相关文章:

  • 【SpringBoot】调度和执行定时任务--Quartz(超详细)
  • 低代码开发平台系统架构概述
  • 源码编译llama.cpp 、ggml 后端启用自定义BLAS加速
  • glb数据格式
  • 手语识别系统源码分享
  • Oracle 数据库部署与实施
  • 【Python】 ast.literal_eval 与 eval
  • Java 入门指南:JVM(Java虚拟机)垃圾回收机制 —— 新一代垃圾回收器 ZGC 收集器
  • 基于 K8S kubernetes 的常见日志收集方案
  • Unity3D 小案例 像素贪吃蛇 02 蛇的觅食
  • 【sgCreateCallAPIFunction】自定义小工具:敏捷开发→调用接口方法代码生成工具
  • 京东商品详情的 API 探秘与应用
  • 功能测试干了三年,快要废了。。。
  • 【C++】多态的认识和理解
  • linux-安全管理-用户认证
  • webpack5 构建优化方案看这篇就够了!【Node.js进阶】
  • esp32-C2 对接火山引擎实现智能语音(一)
  • 【MySQL-初级】mysql基础操作(账户、数据库、表的增删查改)
  • centos bash脚本一键运行安装go环境
  • vue2制作高复用页面
  • Feed流系统重构:架构篇
  • Android 后台服务之Persistent 属性
  • STM32+ESP01连接到机智云
  • 电脑实时监控软件有哪些?七个电脑屏幕监控软件任你选择
  • 信奥学习规划(CSP-J/S)
  • 【Linux取经之路】编译器gcc/g++的使用 调试器gdb的使用
  • 自动化流程机器人(RPA)
  • Unity persistentDataPath使用案例
  • Android 测试手册
  • 各大平台统遭入侵??区块链市场遭攻击损失近3亿!