Eu gostaria de fazer um controle simples: um contêiner com vista para dentro. Se eu tocar no recipiente e mover o dedo, quero mover a exibição para seguir o meu dedo.
Que tipo de contêiner (layout) devo usar? Como fazer isso?
Não preciso usar uma superfície, mas um layout simples.
Respostas:
Algo assim:
Em
main.xml
apenasRelativeLayout
com@+id/root
fonte
layoutPrarms.rightMargin = -250
o mesmo combottomMargin
!! Você pode explicar isso? De qualquer forma, muito obrigado!!Eu encontrei uma abordagem fácil de fazer isso com o ViewPropertyAnimator:
fonte
setX
esetY
diretamente, em vez de aplicar uma animação de duração 0.Seguindo a abordagem @Andrey, se você deseja mover a vista do centro, você só precisa subtrair a meia altura e largura da vista ao movimento.
fonte
Mesma implementação no Kotlin
fonte
Toque no recipiente e a visualização seguirá seu dedo.
código xml
Código Java
fonte
Eu recomendo usar view.translationX e view.translationY para mover suas visualizações.
Snippet Kotlin:
fonte
Crie uma classe de ouvinte de toque personalizada (no Kotlin):
(Este código impede sua visualização de arrastar para fora da visualização principal)
Como usá-lo?
parentView
é o pai da sua opinião.fonte
No código abaixo, criei algo chamado
RegionView
( git ), que é um contêiner reutilizável responsável pelo gerenciamento de operações de arrastar e aplicar zoom para cada um de seus filhos aninhados.Aqui, nós manipular o
top
eleft
coeficientes de uma criançaView
éLayoutParams
ao movimento de simulação sobre o diagrama. Ao dissociar a interpretação de lidar com o que é entendido como uma operação de arrastar e o que é determinado como uma operação de escala, podemos fornecer manipulação confiável de uma criançaView
.Aqui eu mostro um exemplo de caso de uso:
fonte
Mudou um pouco a solução fornecida por @Vyacheslav Shylkin para remover dependências de quaisquer números inseridos manualmente.
fonte
Neste exemplo, você pode mover a visualização dentro dos limites pai, independentemente do tamanho, animação impecável e capturar cliques.
A razão pela qual essa solução é superior a outros comentários é que essa abordagem usa um direcional que se calcula e não retransmitirá as posições de exibição, que são a fonte de muitos bugs.
Se você tiver o contêiner dentro de um ScrollView ou ScrollView de dupla dimensão, adicione essa linha ao onTouch
fonte
O mesmo que a resposta de Alex Karshin , mudo um pouco.
fonte