Paralel Task
As tasks paralelas foram construidas com a inteção de executar multiplos passos da sua animação simultaneamente. Internamente a task paralela tem uma lista de subtasks, e cada passo seu, é na verdade dar um passo em suas sub-taks. Existem alguns jeitos de construi-las como mostraremos a seguir:
Construtor com lista
Task t1 = //some task
Task t2 = //other task;
List<Task> taskList = new ArrayList<>();
taskList.add(t1);
taskList.add(t2);
Task paralelTask = new ParalelTask(taskList);
Construtor com var args
Task t1 = //some task
Task t2 = //other task;
Task paralelTask = new ParalelTask(t1,t2);
essa forma equivale a passar um vetor
Task[]
Utilizando os metodo parallel()
da interface Task
Essa forma pode vir bastante a calhar, reduzindo potencialmente a verbozidade do código, consiste em construir a task paralela a partir de outras tasks como no padrão builder, veja o exemplo:
Task t1 = //some task
Task t2 = //other task;
Task paralelTask = t1.parallel(t2);
Na maioria dos casos não queremos/precisamos armazenar referencias paras as partes da task paralela, escrevendo o código de maneira mais objetiva:
Task paralelTask = gobject.move(200,0).parallel(gobject.changeColor(Color.blue));
Voce pode chamar quantas vezes quiser o metodo parallel()
à partir de uma task (mesmo que seja um task paralela), isso vai ser equivalente ao metodo de contrução por lista ou varArgs com mais elementos, para ilustrar:
Task t1 = //some task
Task t2 = //other task;
Task t3 = //one more task;
//1
Task paralelTask = t1.parallel(t2).parallel(t3); // this can go on for ever
//2
Task equivalent = new ParalelTask(t1,t2,t3);
//3
List<Task> taskList = new ArrayList<>();
taskList.add(t1);
taskList.add(t2);
taskList.add(t3);
Task equivalent2 = new ParalelTask(taskList);
Exemplo prático
vamos mostrar um exemplo simples de duas tasks compostas em paralelo, o exemplo vai em dois circulos, um oscilando sua posição no eixo horizontal, e o outro na vertical. os dois movimentos vão acontecer em paralelo, dai o motivo do exemplo, veja o código:
@Override
protected void buildPresentation() {
Circle circle1 = CircleBuilder.aCircle()
.withCenter(100, 250)
.withColor(Color.red)
.build();
Circle circle2 = CircleBuilder.aCircle()
.withCenter(400, 100)
.withColor(Color.blue)
.build();
add(circle1);
add(circle2);
var task1 = circle1.move(300,0).andThen(circle1.move(-300,0)).repeat(5);
var task2 = circle2.move(0,300).andThen(circle2.move(0,-300)).repeat(5);
task1.parallel(task2).execute();
}