Java tutorial
/* * Copyright 2017 Aurlien Gteau <mail@agateau.com> * * This file is part of Pixel Wheels. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. * * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ package com.agateau.ui.menu; import com.badlogic.gdx.math.Rectangle; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.scenes.scene2d.Actor; import com.badlogic.gdx.scenes.scene2d.ui.ScrollPane; import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener; /** * A ScrollPane which can track the current item of a menu */ public class MenuScrollPane extends ScrollPane { private Menu mMenu; private final Vector2 mTmp = new Vector2(); private ChangeListener mListener = new ChangeListener() { @Override public void changed(ChangeEvent event, Actor actor) { layout(); ensureItemVisible(); } }; public MenuScrollPane(Menu menu) { super(null); // Do not steal touch events from items like sliders setCancelTouchFocus(false); setMenu(menu); } public Menu getMenu() { return mMenu; } public void setMenu(Menu menu) { setWidget(menu); mMenu = menu; mMenu.addListener(mListener); } public float getPrefWidth() { return mMenu.getWidth(); } private void ensureItemVisible() { Menu.MenuStyle style = mMenu.getMenuStyle(); MenuItem item = mMenu.getCurrentItem(); Rectangle rect = item.getFocusRectangle(); mTmp.set(rect.x, rect.y); item.getActor().localToAscendantCoordinates(mMenu, mTmp); scrollTo(mTmp.x - style.focusPadding, mTmp.y - style.focusPadding, rect.width + 2 * style.focusPadding, rect.height + 2 * style.focusPadding); } }