详解 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实现扫码支付【实战】

