详解 Android中Libgdx使用ShapeRenderer自定义Actor解决无法接收到Touch事件的问题
程序员文章站
2023-12-16 15:05:22
详解 android中libgdx使用shaperenderer自定义actor解决无法接收到touch事件的问题
今天在项目中实现了一个效果,主要是画一个圆。为了后续使...
详解 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(); }
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!