详解 Android中Libgdx使用ShapeRenderer自定义Actor解决无法接收到Touch事件的问题

发布时间 - 2026-01-11 03:07:58    点击率:

详解 Android中Libgdx使用ShapeRenderer自定义Actor解决无法接收到Touch事件的问题

今天在项目中实现了一个效果,主要是画一个圆。为了后续使用方便,将这个圆封装在一个自定义Actor(CircleActot)中,后续想显示一个圆的时候,只要创建一个CircleActor中即可。 部分代码如下所示:

package com.ef.smallstar.unitmap.widget;

import android.content.res.Resources;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.g2d.Batch;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.ef.smallstar.EFApplication;
import com.ef.smallstar.R;

/**
 * Created by ext.danny.jiang on 17/4/17.
 *
 * A Widget currently used in the UnitMap, shown as a CIRCLE shape
 * if text not null, there would be a text drawn in the center of the circle
 */

public class CircleActor extends Actor {

  private float centerX;
  private float centerY;
  private String text;
  private float radius;

  private ShapeRenderer sr;
  private BitmapFont bitmapFont;

  public CircleActor(float x, float y, float radius) {
    this(x, y, radius, null);
  }

  public CircleActor(float x, float y, float radius, String text) {
    this.centerX = x;
    this.centerY = y;
    this.radius = radius;
    this.text = text;

    sr = new ShapeRenderer();
  }

  @Override
  public void act(float delta) {
    super.act(delta);
  }

  @Override
  public void draw(Batch batch, float parentAlpha) {
    ...

    batch.end();

    sr.setProjectionMatrix(batch.getProjectionMatrix());
    sr.setTransformMatrix(batch.getTransformMatrix());

    sr.begin(ShapeRenderer.ShapeType.Filled);

    sr.circle(centerX, centerY, radius);

    sr.end();

    batch.begin();

    ...
  }

然后创建一个Stage对象,并将CircleActor对象添加到Stage中即可显示。 但是无法给此CircleActor对象添加一个ClickLitener监听。

例如如下代码:

Stage stage = new Stage();

CircleActor ca = new CircleActor(100, 100, 50, "Hello World");
ca.addListener(new ClickListener(){
  public void click(){
    Gdx.app.log("TAG", "ca is clicked");
  }
})

stage.add(ca);

上述代码中的click方法永远无法被调用! 后续调了大半天之后终于弄清楚了原因:虽然在CircleActor的draw方法中通过ShapeRenderer.circle方法将一个圆画到了屏幕上的某一位置,但是此ShapeRenderer其实和Actor之间并没有太多的联系。唯一的联系就是以下两句代码, 意思应该是将ShapeRenderer的camera和Actor对象一致。

sr.setProjectionMatrix(batch.getProjectionMatrix());
sr.setTransformMatrix(batch.getTransformMatrix());

但是此时,CircleActor并没有设置真正的大小与位置, 因此解决上述问题,需要在构造器中将CircleActor的大小和位置与ShapeRenderer做到一致 !!

如下代码所示,只要添加两行代码即可:

public EfCircle(float x, float y, float radius, String text) {
    this.centerX = x;
    this.centerY = y;
    this.radius = radius;
    this.text = text;

    //解决ShapeRenderer无法获取Touch事件
    setPosition(centerX - radius, centerY - radius);
    setSize(radius * 2, radius * 2);

    sr = new ShapeRenderer();
  }

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# Android中Libgdx使用ShapeRenderer解决Touch事件  # Android  # shapeRendere解决Touch事件的问题  # 详解Android Libgdx中ScrollPane和Actor事件冲突问题的解决办法  # Android使用libgdx实现模拟方向键控制角色移动的方法  # Android 游戏引擎libgdx 资源加载进度百分比显示案例分析  # Android drawable微技巧  # 你不知道的drawable细节  # Android指纹识别API讲解  # 一种更快更好的用户体验  # Android在Kotlin中更好地使用LitePal  # Android Studio轻松构建自定义模板的步骤记录  # 详解Android 检测权限的三种写法  # Android最简单的状态切换布局实现教程  # android自定义环形对比图效果  # Libgdx解决部分Android机型锁屏崩溃的方法  # 自定义  # 所示  # 创建一个  # 太多  # 如有  # 大半天  # 希望能  # 并将  # 两句  # 谢谢大家  # 装在  # 弄清楚  # 两行  # 画一  # 主要是  # 应该是  # 疑问请  # 实现了  # 器中  # 屏幕上 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】  Laravel定时任务怎么设置_Laravel Crontab调度器配置  如何实现javascript表单验证_正则表达式有哪些实用技巧  如何构建满足综合性能需求的优质建站方案?  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  如何挑选最适合建站的高性能VPS主机?  HTML 中动态设置元素 name 属性的正确语法详解  Python面向对象测试方法_mock解析【教程】  BootStrap整体框架之基础布局组件  Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】  Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解  如何快速启动建站代理加盟业务?  Midjourney怎么调整光影效果_Midjourney光影调整方法【指南】  Laravel怎么实现微信登录_Laravel Socialite第三方登录集成  简单实现Android文件上传  Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】  Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区  laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法  香港服务器租用费用高吗?如何避免常见误区?  Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道  Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  Claude怎样写约束型提示词_Claude约束提示词写法【教程】  成都网站制作公司哪家好,四川省职工服务网是做什么用?  用v-html解决Vue.js渲染中html标签不被解析的问题  如何快速查询域名建站关键信息?  Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】  网站制作免费,什么网站能看正片电影?  Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程  Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】  免费网站制作appp,免费制作app哪个平台好?  晋江文学城电脑版官网 晋江文学城网页版直接进入  微信小程序 HTTPS报错整理常见问题及解决方案  详解Huffman编码算法之Java实现  php打包exe后无法访问网络共享_共享权限设置方法【教程】  如何在阿里云域名上完成建站全流程?  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  如何在万网开始建站?分步指南解析  Laravel如何与Inertia.js和Vue/React构建现代单页应用  Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明  Laravel Seeder填充数据教程_Laravel模型工厂Factory使用  Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控  Laravel如何与Docker(Sail)协同开发?(环境搭建教程)  Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解  1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  如何挑选优质建站一级代理提升网站排名?  php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】  Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程  Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】