欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

详解 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();
  }

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

上一篇:

下一篇: