WidgetList (LibGDX)

  1. package ua.naiksoftware.libgdx.ui;
  2.  
  3. import com.badlogic.gdx.scenes.scene2d.ui.*;
  4.  
  5. import com.badlogic.gdx.scenes.scene2d.Actor;
  6. import com.badlogic.gdx.scenes.scene2d.InputEvent;
  7. import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
  8. import com.badlogic.gdx.scenes.scene2d.utils.Drawable;
  9. import com.badlogic.gdx.utils.Array;
  10.  
  11. /**
  12.  *
  13.  * @author Naik
  14.  */
  15. public class WidgetList extends WidgetGroup {
  16.  
  17.     private List.ListStyle style;
  18.     private int size;
  19.     private WidgetAdapter adapter;
  20.     private ScrollPane scrollPane;
  21.  
  22.     private float prefWidth, prefHeight;
  23.  
  24.     private int selected, last;
  25.     private Array<Actor> items;
  26.  
  27.     public WidgetList(WidgetAdapter adapter, Skin skin) {
  28.         this(adapter, skin.get(List.ListStyle.class));
  29.     }
  30.  
  31.     public WidgetList(WidgetAdapter adapter, List.ListStyle style) {
  32.         this.adapter = adapter;
  33.         this.style = style;
  34.         size = adapter.getCount();
  35.         items = new Array<Actor>(size);
  36.         Table t = new Table();
  37.         t.setBackground(style.background);
  38.         for (int i = 0; i < size; i++) {
  39.             Actor a = adapter.createItem(i);
  40.             t.add(a).row();
  41.             items.add(a);
  42.             a.addListener(selectedListener);
  43.         }
  44.         scrollPane = new ScrollPane(t);
  45.         scrollPane.pack();
  46.         addActor(scrollPane);
  47.         selected = 0;
  48.     }
  49.  
  50.     /**
  51.      * Вызывается не напрямую, а после validate()
  52.      */
  53.     @Override
  54.     public void layout() {
  55.         prefWidth = scrollPane.getPrefWidth();
  56.         prefHeight = scrollPane.getPrefHeight();
  57.         if (size > 0) {
  58.             Actor a = items.get(last), a2 = items.get(selected);
  59.             if (a instanceof Table) {
  60.                 ((Table) a).setBackground((Drawable) null);
  61.             } else {
  62.                 a.setColor(style.fontColorUnselected);
  63.             }
  64.             if (a2 instanceof Table) {
  65.                 ((Table) a2).setBackground(style.selection);
  66.             } else {
  67.                 a2.setColor(style.fontColorSelected);
  68.             }
  69.         }
  70.     }
  71.  
  72.     @Override
  73.     public final float getPrefWidth() {
  74.         validate();
  75.         return prefWidth;
  76.     }
  77.  
  78.     @Override
  79.     public final float getPrefHeight() {
  80.         validate();
  81.         return prefHeight;
  82.     }
  83.  
  84.     private final ClickListener selectedListener = new ClickListener() {
  85.         @Override
  86.         public void clicked(InputEvent event, float x, float y) {
  87.             Widget w = (Widget) event.getListenerActor();
  88.             last = selected;
  89.             selected = items.indexOf(w, true);
  90.             invalidate();
  91.         }
  92.     };
  93.  
  94.     public int getSelectedIndex() {
  95.         return selected;
  96.     }
  97.  
  98.     /**
  99.      * @param <T> - элементы для WidgetList - например Table, Label
  100.      */
  101.     public interface WidgetAdapter<T extends Actor> {
  102.  
  103.         int getCount();
  104.  
  105.         T createItem(int n);
  106.     }
  107. }
Стандартный виджет List может отображать только массив String. В WidgetList можно поместить любые элементы (например Table). Так может выглядеть список из Label помещенный в Dialog http://dbwap.ru/8152919.png

Реклама

Мы в соцсетях

tw tg yt gt