欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解 Android中Libgdx使用ShapeRenderer自定義Actor解決無(wú)法接收到Touch事件的問(wèn)題

 更新時(shí)間:2017年09月06日 11:10:04   作者:Danny_姜  
這篇文章主要介紹了詳解 Android中Libgdx使用ShapeRenderer自定義Actor解決無(wú)法接收到Touch事件的問(wèn)題的相關(guān)資料,希望通過(guò)本文能幫助到大家解決這樣的問(wèn)題,需要的朋友可以參考下

詳解 Android中Libgdx使用ShapeRenderer自定義Actor解決無(wú)法接收到Touch事件的問(wèn)題

今天在項(xiàng)目中實(shí)現(xiàn)了一個(gè)效果,主要是畫(huà)一個(gè)圓。為了后續(xù)使用方便,將這個(gè)圓封裝在一個(gè)自定義Actor(CircleActot)中,后續(xù)想顯示一個(gè)圓的時(shí)候,只要?jiǎng)?chuàng)建一個(gè)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();

    ...
  }

然后創(chuàng)建一個(gè)Stage對(duì)象,并將CircleActor對(duì)象添加到Stage中即可顯示。 但是無(wú)法給此CircleActor對(duì)象添加一個(gè)ClickLitener監(jiān)聽(tīng)。

例如如下代碼:

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方法永遠(yuǎn)無(wú)法被調(diào)用! 后續(xù)調(diào)了大半天之后終于弄清楚了原因:雖然在CircleActor的draw方法中通過(guò)ShapeRenderer.circle方法將一個(gè)圓畫(huà)到了屏幕上的某一位置,但是此ShapeRenderer其實(shí)和Actor之間并沒(méi)有太多的聯(lián)系。唯一的聯(lián)系就是以下兩句代碼, 意思應(yīng)該是將ShapeRenderer的camera和Actor對(duì)象一致。

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

但是此時(shí),CircleActor并沒(méi)有設(shè)置真正的大小與位置, 因此解決上述問(wèn)題,需要在構(gòu)造器中將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無(wú)法獲取Touch事件
    setPosition(centerX - radius, centerY - radius);
    setSize(radius * 2, radius * 2);

    sr = new ShapeRenderer();
  }

如有疑問(wèn)請(qǐng)留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

最新評(píng)論