Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Neste artigo, mostramos como usar o InteractionTracker para criar experiências de manipulação personalizadas.
Pré-requisitos
Aqui, assumimos que está familiarizado com os conceitos discutidos nestes artigos:
Porque criar experiências de manipulação personalizadas?
Na maioria dos casos, utilizar os controlos de manipulação pré-construídos é suficiente para criar experiências de interface. Mas e se quisesses diferenciar dos controlos comuns? E se quisesses criar uma experiência específica guiada por input ou ter uma interface onde um movimento tradicional de manipulação não seja suficiente? É aqui que entra a criação de experiências personalizadas. Permitem que desenvolvedores e designers de aplicações sejam mais criativos – trazendo à vida experiências de movimento que exemplifiquem melhor a sua marca e linguagem de design personalizada. Desde o início, tens acesso ao conjunto certo de blocos de construção para personalizar completamente a experiência de manipulação – desde a forma como o movimento deve responder com o dedo a entrar e sair do ecrã até aos snap points e encadeamento de entradas.
Abaixo estão alguns exemplos comuns de quando criaria uma experiência de manipulação personalizada:
- Adicionar um comportamento personalizado de deslizamento, eliminação/descarte
- Efeitos impulsionados pela entrada (deslocamento desfoca o conteúdo)
- Controlos personalizados com movimentos de manipulação personalizados (ListView personalizado, ScrollViewer, etc.)
Por que usar o InteractionTracker?
O InteractionTracker está disponível no espaço de nomes Microsoft.UI.Composition.Interactions para aplicações WinUI e Windows App SDK. O InteractionTracker permite:
- Flexibilidade Completa – queremos que seja capaz de personalizar e adaptar todos os aspetos de uma experiência de manipulação; especificamente, os movimentos exatos que ocorrem durante ou em resposta à entrada. Ao criar uma experiência de manipulação personalizada com o InteractionTracker, todos os botões de que precisa estão ao seu dispor.
- Desempenho Fluido – um dos desafios das experiências de manipulação é que o seu desempenho depende do thread da interface. Isto pode afetar negativamente qualquer experiência de manipulação quando a interface está ocupada. O InteractionTracker foi desenvolvido para utilizar o novo motor de animação que opera num thread independente a 60 FPS, resultando em movimento suave.
Visão geral: InteractionTracker
Ao criar experiências de manipulação personalizadas, há dois componentes principais com que interage. Vamos discutir estes primeiro:
- InteractionTracker – o objeto central que mantém uma máquina de estados cujas propriedades são impulsionadas por entrada ativa do utilizador ou atualizações e animações diretas. O objetivo é depois ligar a um CompositionAnimation para criar o movimento de manipulação personalizado.
- VisualInteractionSource – um objeto complementar que define quando e em que condições a entrada é enviada para o InteractionTracker. Define tanto o CompositionVisual usado para testes de acerto como outras propriedades de configuração de entrada.
Como máquina de estados, as propriedades do InteractionTracker podem ser controladas por qualquer um dos seguintes dispositivos:
- Interação Direta com o Utilizador – o utilizador final está a manipular diretamente dentro da região de teste de colisão do VisualInteractionSource.
- Inércia – seja por velocidade programática ou por um gesto do utilizador, as propriedades do InteractionTracker animam-se sob uma curva de inércia
- CustomAnimation – uma animação personalizada direcionada diretamente a uma propriedade do InteractionTracker
Máquina de Estado do InteractionTracker
Como mencionado anteriormente, o InteractionTracker é uma máquina de estados com 4 estados – cada um dos quais pode transitar para qualquer um dos outros quatro estados. (Para mais informações sobre como o InteractionTracker transita entre estes estados, consulte a documentação da classe InteractionTracker .)
| Estado | Descrição |
|---|---|
| Idle | Sem entradas ou animações ativas, de condução |
| Interagindo | Entrada ativa do utilizador detetada |
| Inércia | Movimento ativo resultante de entrada ativa ou velocidade programática |
| AnimaçãoPersonalizada | Movimento ativo resultante de uma animação personalizada |
Em cada um dos casos em que o estado do InteractionTracker muda, é gerado um evento (ou callback) que pode escutar. Para que possa ouvir estes eventos, eles devem implementar a interface IInteractionTrackerOwner e criar o seu objeto InteractionTracker com o método CreateWithOwner. O diagrama seguinte também descreve quando os diferentes eventos são desencadeados.
Usando o VisualInteractionSource
Para que o InteractionTracker seja controlado por Input, é necessário ligar uma VisualInteractionSource (VIS) a ele. O VIS é criado como um objeto complementar usando um CompositionVisual para definir:
- A região do teste de acerto que a entrada será rastreada, e os gestos do espaço de coordenadas são detetados em
- As configurações de entrada que serão detetadas e encaminhadas, algumas incluem:
- Gestos detetáveis: Posição X e Y (panorâmica horizontal e vertical), Escala (beliscão)
- Inércia
- Carris e Encadeamento
- Modos de redirecionamento: que dados de entrada são redirecionados automaticamente para o InteractionTracker
Observação
Como o VisualInteractionSource é criado com base na posição do teste de colisão e no espaço de coordenadas de um Visual, recomenda-se não usar um Visual que esteja em movimento ou mudando de posição.
Observação
Pode usar múltiplas instâncias do VisualInteractionSource com o mesmo InteractionTracker se houver várias regiões de teste de colisão. No entanto, o caso mais comum é usar apenas um VIS.
O VisualInteractionSource é também responsável por gerir quando os dados de entrada de diferentes modalidades (toque, PTP, caneta) são encaminhados para o InteractionTracker. Este comportamento é definido pela propriedade ManipulationRedirectionMode. Por defeito, toda a entrada do Pointer é enviada para o thread da interface e a entrada do Precision Touchpad vai para o VisualInteractionSource e para o InteractionTracker.
Assim, se quiser que o Touch e o Pen (Creators Update) conduzam uma manipulação através de um VisualInteractionSource e de um InteractionTracker, deve invocar o método VisualInteractionSource.TryRedirectForManipulation. No pequeno excerto abaixo de uma aplicação XAML, o método é chamado quando ocorre um evento pressionado por toque na grelha UIElement mais alta:
private void root_PointerPressed(object sender, PointerRoutedEventArgs e)
{
if (e.Pointer.PointerDeviceType == Windows.Devices.Input.PointerDeviceType.Touch)
{
_source.TryRedirectForManipulation(e.GetCurrentPoint(root));
}
}
Integração com o "ExpressionAnimations"
Ao utilizar o InteractionTracker para gerar uma experiência de manipulação, interage principalmente com as propriedades de Escala e Posição. Tal como outras propriedades do CompositionObject, estas propriedades podem ser tanto o alvo como referenciadas numa CompositionAnimation, sendo mais frequentemente expressas através de ExpressionAnimations.
Para usar o InteractionTracker dentro de uma Expressão, consulte a propriedade Posição (ou Escala) do rastreador, como no exemplo abaixo. À medida que a propriedade do InteractionTracker é modificada devido a qualquer uma das condições descritas anteriormente, a saída da Expressão também muda.
// With Strings
var opacityExp = _compositor.CreateExpressionAnimation("-tracker.Position");
opacityExp.SetReferenceParameter("tracker", _tracker);
// With ExpressionBuilder
var opacityExp = -_tracker.GetReference().Position;
Observação
Ao referenciar a posição do InteractionTracker numa Expressão, deve negar o valor para que a Expressão resultante se mova na direção correta. Isto porque a progressão do InteractionTracker desde a origem num gráfico permite pensar na progressão do InteractionTracker em coordenadas do "mundo real", como a distância à sua origem.
Começar
Para começar a usar o InteractionTracker para criar experiências de manipulação personalizadas:
- Crie o seu objeto InteractionTracker usando InteractionTracker.Create ou InteractionTracker.CreateWithOwner.
- (Se utilizar o CreateWithOwner, certifique-se de implementar a interface IInteractionTrackerOwner.)
- Defina a posição Min e Max do seu recém-criado InteractionTracker.
- Crie o seu VisualInteractionSource com um CompositionVisual.
- Certifica-te de que o elemento visual que estás a passar tem um tamanho diferente de zero. Caso contrário, não será corretamente avaliado no processo de hit-test.
- Defina as propriedades do VisualInteractionSource.
- Fonte de Redirecionamento de Interação Visual
- PositionXSourceMode, PositionYSourceMode, ScaleSourceMode
- Carris e Encadeamento
- Adicione o VisualInteractionSource ao InteractionTracker usando InteractionTracker.InteractionSources.Add.
- Configurar o TryRedirectForManipulation para quando é detetada entrada de Toque e Caneta.
- Para XAML, isto é normalmente feito no evento PointerPressed do UIElement.
- Crie uma ExpressionAnimation que se refira à posição do InteractionTracker e tenha como alvo a propriedade de um CompositionObject.
Aqui está um pequeno excerto de código que mostra os pontos #1 – 5 em ação:
private void InteractionTrackerSetup(Compositor compositor, Visual hitTestRoot)
{
// #1 Create InteractionTracker object
var tracker = InteractionTracker.Create(compositor);
// #2 Set Min and Max positions
tracker.MinPosition = new Vector3(-1000f);
tracker.MaxPosition = new Vector3(1000f);
// #3 Setup the VisualInteractionSource
var source = VisualInteractionSource.Create(hitTestRoot);
// #4 Set the properties for the VisualInteractionSource
source.ManipulationRedirectionMode =
VisualInteractionSourceRedirectionMode.CapableTouchpadOnly;
source.PositionXSourceMode = InteractionSourceMode.EnabledWithInertia;
source.PositionYSourceMode = InteractionSourceMode.EnabledWithInertia;
// #5 Add the VisualInteractionSource to InteractionTracker
tracker.InteractionSources.Add(source);
}
Para usos mais avançados do InteractionTracker, consulte os seguintes artigos:
Windows developer