2012-07-05 14 views
5

Me gustaría crear un bucle en algún lugar de mi código de Android que cambia el color de un rectángulo dibujable entre dos colores de forma continua a algún ritmo. Me gustaría comenzar y dejar de parpadear con dos botones. He investigado mucho, pero parece que no puedo entender cómo hacerlo. Soy nuevo en Android y no tengo experiencia con los métodos run(). Pero supongo que tengo que hacer algún tipo de clase rectangular con un método run() que lo animará a cambiar de color.Animación de color de forma en Android

Respuesta

1

También soy bastante nuevo en Android, pero le daré una oportunidad.

Como dices que quieres que parpadee, deberías poder cambiar la imagen real entre, digamos, azul y rojo, con un simple bucle 'for'. Cuando se presiona el botón, puede cambiar el estado de un booleano de falso a verdadero. Entonces, cuando la declaración 'para' ya no es cierta, salta al siguiente conjunto de código, que lo detiene. Esto es lo que haría.

Su XML para los dos botones:

<Button 
    android:id="@+id/start" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="Start" 
    android:Clickable="true" 
    android:onClick="start" 
    /> 

<Button 
    android:id="@+id/stop" <!-- Gives the button an ID to use in java code --> 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="Stop" <!-- sets the text on the button --> 
    android:Clickable="true" <!-- makes the button clickable --> 
    android:onClick="stop" <!-- The method it calls when it is clicked, removes the necessity of an OnClickListener --> 
    /> 

Ahora, usted tendría ImageViews 2: blue_rectangle y red_rectangle, tanto en el mismo lugar en el diseño. Aquí está el XML para las dos ImageViews

<ImageView 
android:id="@+id/blue_rectangle" 
android:layout_width="100dp" 
android:layout_height="75dp" 
android:layout_marginLeft="50dp" 
android:layout_marginTop="5dp" 
android:src="@drawable/blue_rectangle" /> 

<ImageView 
android:id="@+id/red_rectangle" 
android:layout_width="100dp" 
android:layout_height="75dp" 
android:layout_marginLeft="50dp" 
android:layout_marginTop="5dp" 
android:src="@drawable/red_rectangle" /> 

Esta parte siguiente es la parte difícil.

Aquí está el Java.

package your.package.name.thingy.here; 

//everything it tells you to import goes here 

public class BlinkingActivity extends Activity{ 

ImageView blueRectangle; 
ImageView redRectangle; 
Button start; 
Button stop; 

    @Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.yourLayout); 

    blueRectangle = (ImageView) findViewById(R.id.blue_rectangle); 
    redRectangle = (ImageView) findViewById(R.id.red_rectangle); 
    start = (Button) findViewById(R.id.start); 
    stop = (Button) findViewById(R.id.stop); 
    Boolean isBlinking = new Boolean(false); 

    blinkRectangle(whateverVariableThisNeeds); 

} 

public static void blinkRectangle(View view){ 

blueRectangle.setVisibility(View.INVISIBLE); 
redRectangle.setVisibility(View.INVISIBLE); 

for(initialization; isBlinking; update){ 

    blueRectangle.setVisibility(View.VISIBLE); 

    blueRectangle.postDelayed(new Runnable() { 
    @Override 
    public void run() { 
    blueRectangle.setVisibility(View.INVISIBLE); 
    } 
    }, 2000); //the 2000 is the number of milliseconds for how long blue is visible 
    redRectangle.setVisibility(View.VISIBLE); 

    redRectangle.postDelayed(new Runnable() { 
    @Override 
    public void run(){ 
    redRectangle.setVisibility(View.INVISIBLE); 
    } 
    }, 2000); 

    blueRectangle.setVisibility(View.VISIBLE); //This prevents a bug where if the user hits the stop button at just the right time, both rectangles will be invisible. 
} 


public static void start(View view){ //no need to call this anywhere, the XML onClick does it for you 

isBlinking = true; //I think this is how you set a boolean, if not, correct me. 

} 

public static void stop(View view){//same here 

isBlinking = false; //again, correct me if I'm wrong. 

} 

} 

Esto es lo que hace básicamente el código.

Tiene un valor booleano predeterminado en falso. Si bien es falso, el rectángulo no parpadea. Si bien es cierto, se ejecuta la instrucción for en blinkRectangle(). Ese lazo for hace visible el azul, espera 2 segundos, lo hace invisible, hace que el rojo sea visible, espera dos segundos y se repite. Los métodos start() y stop() cambian el booleano a verdadero y falso, respectivamente. Creo que este tipo de bucle for vuelve a verificar el booleano cuando vuelve a la cima. Nunca he trabajado con eso antes. Eso es lo que pude deducir del sitio web que miré.

Bueno, creo que eso es todo. Si no entiende qué es lo que hace el código, o si no funciona, o si la pregunta es incorrecta, o simplemente estoy completamente equivocado, o ALGO, simplemente haga un comentario sobre esta respuesta. ¡Espero que esto funcione!

¡Buena suerte!

P.S. Estos son los sitios web que he utilizado como referencia

http://www.tutorialspoint.com/java/java_loop_control.htm

http://www.java-examples.com/java-boolean-example

Wow ... Me he dado cuenta de esta pregunta es de 2 años de edad. Aún así, ¡espero que esto te ayude!

+0

No te preocupes, [obtén insignias para eso] (http://stackoverflow.com/questions/10874571/how-does-check-ajax-referer-really-work/18358174#comment27016156_18358174) ([Nigromante] (http://stackoverflow.com/help/badges/17/necromancer)) y upvotes demostrarán su utilidad;) – brasofilo