2015-11-18 2 views
0

Я пытаюсь использовать кнопку изображения на LIBGDX, чтобы создать кнопку на основе двух изображений.LIBGDX - Кнопка изображения - объединение изображений

Использование второго изображения, отлично работает, но имеет одну проблему. Изображения разных размеров.

Примечание: Я тестирую с теми же картинами, чтобы увидеть результат

Есть ли способ исправить это? Используя некоторый масштаб для изображений?

levelsTexture = new Texture(Gdx.files.internal("level1.png")); 
levels = new TextureRegion(levelsTexture).split(TILE_WIDTH, TILE_HEIGHT); 
ImageButton levels_image = new ImageButton(new TextureRegionDrawable(new    
TextureRegion(levels[0][0]))); 
levels_image.add(new Image (levels[0][0])); 
stage.addActor(levels_image); 
levels_image.setScale(2f); 

Проблема:

Problem with scales

ответ

0

ImageButton является расширением класса таблицы и обычно изображения ImageButton устанавливаются в качестве фона. Использование метода «добавить» для второго изображения, как и вы, может работать как-то иначе, но оно ведет себя иначе, чем установка фона, а также может быть не так, как вы хотите, если вы хотите, чтобы второе изображение также изменилось при нажатии кнопки ,

Самый простой способ добавить два изображения в один ImageButton - просто объединить два изображения в Photoshop (или их эквивалент) и использовать это единственное изображение на ImageButton.

Более продвинутый (и более гибкий) метод заключается в том, чтобы объединить два изображения программно и использовать их в качестве фона для вашего ImageButton. Это можно сделать, создав пользовательский класс, который расширяет BaseDrawable и имеет два конструктора в конструкторе. Если вы хотите, чтобы ваши изображения были сложены друг на друга, установите minHeight вашего настраиваемого класса drawable как комбинированную высоту ваших двух изображений. Затем переопределить метод рисования и нарисуйте свои два изображения друг на друга, как это:

@Override 
public void draw(Batch batch, float x, float y, float width, float height){ 
    img1.getDrawable().draw(batch, x, y, img1.getWidth(), img1.getHeight()); 
    img2.getDrawable().draw(batch, x, y+img1.getHeight(), img2.getWidth(), img2.getHeight()); 
    } 
} 

ImageButton принимает рисуем в своем конструкторе, так что вы можете передать этот объект прямо в кнопке, когда вы создаете его и как ваших изображений должны появиться в кнопке, и они будут рассматриваться как один.

Я сделал что-то подобное, чтобы создать фон для таблицы, используя несколько изображений, и этот метод отлично работает.

+0

Ваша идея очень хорошая. Вы могли бы только немного объяснить, как создать строителя этого класса? Я сделал то, что написал, но метод draw, появляется ошибка: метод draw (Batch, float) в типе изображения не применим для аргументов (Batch, float, float, float, float): О конструкторе: Открытый класс ImagesJoin расширяет BaseDrawable; public ImagesJoin (Изображение img1, изображение img2) Создание объекта: join = new ImagesJoin (img1, img2); – user3771516

+0

D'oh, извините за это! В моей программе я фактически использовал Drawables вместо изображений. Поэтому при использовании изображений вы должны получить выделение с изображения следующим образом: img1.getDrawable(). Draw (batch, x, y, img1.getWidth(), img1.getHeight()); – Tekkerue

+0

Я только что отредактировал свой первоначальный ответ и добавил метод getDrawable() на изображениях. – Tekkerue

0

Я написал собственный класс SpriteButton, в котором я реализую этот метод для масштабирования моих текстур.

private Dimension getScaledDimension(Dimension imgSize, Dimension boundary) { 

    int original_width = imgSize.width; 
    int original_height = imgSize.height; 
    int bound_width = boundary.width; 
    int bound_height = boundary.height; 
    int new_width = original_width; 
    int new_height = original_height; 

    // first check if we need to scale width 
    if (original_width > bound_width) { 
     //scale width to fit 
     new_width = bound_width; 
     //scale height to maintain aspect ratio 
     new_height = (new_width * original_height)/original_width; 
    } 

    // then check if we need to scale even with the new height 
    if (new_height > bound_height) { 
     //scale height to fit instead 
     new_height = bound_height; 
     //scale width to maintain aspect ratio 
     new_width = (new_height * original_width)/original_height; 
    } 

    return new Dimension(new_width, new_height); 
} 

Затем, наконец, вы рисуете текстуру с выходным размером как размер для рисования.

sb.begin(); 
    sb.draw(this.texture2, this.x, this.y, dim_size_new.width, dim_size_new.height); 
    sb.end(); 

Таким образом, вы могли бы технически сделать второе изображение к размеру первого изображения, если первый размер правильно.

Ваша реализация будет отличаться от моей, но вы должны быть в состоянии понять ее здесь.

Смежные вопросы