Ciao mi piacerebbe creare un ImageButton e l'immagine disabilitata dovrebbe essere colorata di grigio. Io uso una skin e un file .json per definirlo. C'è un modo migliore per ottenere un'immagine grigia che duplicare tutte le immagini e aggiungerle a texturepacker?LibGDX: immagini di tinta per un ImageButton che utilizza una skin
risposta
Penso che il modo migliore (o anche l'unico modo) per realizzare questo è utilizzando shaders. Notare che shaders
è un argomento intero a sé stante, ma una volta acquisito padronanza, o persino conoscenza, può dare al tuo gioco molte funzionalità interessanti, come l'ingrigimento delle immagini.
Come per la tua domanda: le prime cose che sono necessarie sono shader che influenzeranno le tue immagini (o, nel nostro caso, ImageButton
) in un modo che le tingerà di grigio. Fortunatamente, questi shader sono stati implementati da qualcun altro, come risposta a uno similar question. Quindi, se si estrae gli shaders richiesti da quanto sopra, abbiamo la seguente:
grey.vsh:
attribute vec4 a_position;
attribute vec4 a_color;
attribute vec2 a_texCoord0;
uniform mat4 u_projTrans;
varying vec4 vColor;
varying vec2 vTexCoord;
void main() {
vColor = a_color;
vTexCoord = a_texCoord0;
gl_Position = u_projTrans * a_position;
}
grey.fsh:
#ifdef GL_ES
#define LOWP lowp
precision mediump float;
#else
#define LOWP
#endif
varying LOWP vec4 vColor;
varying vec2 vTexCoord;
uniform sampler2D u_texture;
uniform float grayscale;
void main() {
vec4 texColor = texture2D(u_texture, vTexCoord);
float gray = dot(texColor.rgb, vec3(0.96, 0.96, 0.96));
texColor.rgb = mix(vec3(gray), texColor.rgb, grayscale);
gl_FragColor = texColor * vColor;
}
Assumendo questi file sono nella tua cartella assets
, possiamo creare un ShaderProgram che compilerà e userà questi shader:
ShaderProgram shader = new ShaderProgram(Gdx.files.internal("grey.vsh"), Gdx.files.internal("grey.fsh"));
Ora possiamo estendere ImageButton
in modo che utilizzi shader
quando vogliamo che sia grigio. In questo esempio, ImageButton
è grigio (o colorato in), quando viene cliccato:
public class GreyedOutImageBtn extends ImageButton {
private boolean isGreyedOut; // A flag that determines whther or not this should be greyed out
public GreyedOutImageBtn(ImageButtonStyle style) {
super(style);
addListener(new ClickListener() {
@Override
public void clicked(InputEvent event, float x, float y) {
// When clicked, toggle the grey effect
Gdx.app.log("ClickListener", "Click");
setIsGreyedOut(!getIsGreyedOut());
}
});
isGreyedOut = false;
}
public boolean getIsGreyedOut() {
return isGreyedOut;
}
public void setIsGreyedOut(boolean isGreyedOut) {
this.isGreyedOut = isGreyedOut;
}
@Override
public void draw(Batch batch, float parentAlpha) {
if (getIsGreyedOut()) {
batch.end();
batch.setShader(shader); // Set our grey-out shader to the batch
batch.begin();
super.draw(batch, parentAlpha); // Draw the image with the greyed out affect
batch.setShader(null); // Remove shader from batch so that other images using the same batch won't be affected
}
else {
// If not required to be grey-out, do normal drawing
super.draw(batch, parentAlpha);
}
}
}
Questo danno i seguenti risultati. Prima:
Dopo:
Dopo aver capito meglio shaders
, si può costruire il proprio per essere specifici per le vostre esigenze.
È possibile impostare il colore della tinta sui pulsanti disabilitati, utilizzando un oggetto ImageButtonStyle e utilizzare il metodo newDrawable(Drawable drawable, Color tint) dalla classe Skin.
Nel codice potrebbe sembrare qualcosa di simile. Notare che abbiamo inizializzato l'oggetto Skin con un Atlas Texture, che contiene le nostre Textures UI. Vedere the wiki per ulteriori informazioni.
// Create the tint color. Notice we use LibGDX Color class
Color tintColor = new Color(0.5f, 0.5f, 0.5f, 1f);
ImageButton.ImageButtonStyle btnStyle = new ImageButton.ImageButtonStyle();
btnStyle.up = skin.getDrawable("my_button");
btnStyle.disabled = skin.newDrawable("my_button", tintColor);
ImageButton myButton = new ImageButton(btnStyle);
- 1. Default Skin LibGDX?
- 2. ImageButton Android messa a fuoco bagliore/colore tinta
- 3. ImageButton che utilizza le transizioni in Android
- 4. Come posso modificare le immagini su un ImageButton in Android quando si utilizza un OnTouchListener?
- 5. Aggiunta di una tinta a un'immagine
- 6. ImageButton con diversi stati dimensione immagini
- 7. Libgdx ricarica lo skin scene2d dopo l'applicazione nascosta
- 8. LIBGDX: Che cos'è un "viewport"?
- 9. LibGDX c'è un attore che è animato?
- 10. LibGDX che ripete TextureRegion
- 11. disabilitare un ImageButton?
- 12. Che cos'è un tempo Delta in LIBGDX
- 13. Skin/Temi per Soundmanager 2
- 14. Libgdx non utilizza Opengl ES 2.0
- 15. ridimensionamento pulsante scene2d con libgdx
- 16. Come cambiare skin (o temi di progettazione) nell'app per iOS?
- 17. Android ImageButton con UI disabilitato
- 18. Come creare più temi/skin per le app per iphone?
- 19. Button ClickListener non funziona nel gioco LibGDX
- 20. Android che utilizza l'intento per aprire un frammento da un'attività
- 21. ImageButton onClick cambiamento di colore
- 22. Usa Libgdx e TexturePacker con immagini xxxdpi distorti
- 23. Richfaces Skin Overriding Styleclass
- 24. Skin personalizzato per pulsante come Facebook
- 25. Change soltanto un colore specifico UITabBarItem tinta
- 26. Applicazione per Android con skin/tema modificabile
- 27. libgdx - come ottenere un etichetta con testo avvolto
- 28. Tinta pulsante Android Pulsante
- 29. LibGDX: filtraggio di una texture in scala
- 30. Come impostare UISegmentedControl Tinta per singolo segmento
Credo di aver capito male la domanda. Stai cercando una specie di grayshader giusto? (non una sovrapposizione o simili) – BennX
scusa non so che cosa è un grayshader il mio obiettivo è che le icone disabilitate sono grigie (le mie icone sono bianche) .. E ho voluto sapere qual è il modo migliore (più veloce per l'elaborazione). Come esempio: AndroidStudio. –