Eu tenho um ScrollView
que contém uma série de Views
. Eu gostaria de poder determinar se uma visualização está atualmente visível (se alguma parte dela é exibida no momento ScrollView
). Eu esperaria que o código abaixo faça isso, surpreendentemente não:
Rect bounds = new Rect();
view.getDrawingRect(bounds);
Rect scrollBounds = new Rect(scroll.getScrollX(), scroll.getScrollY(),
scroll.getScrollX() + scroll.getWidth(), scroll.getScrollY() + scroll.getHeight());
if(Rect.intersects(scrollBounds, bounds))
{
//is visible
}
android
scrollview
visible
ab11
fonte
fonte
Respostas:
Use em
View#getHitRect
vez deView#getDrawingRect
na exibição que você está testando. Você pode usar oView#getDrawingRect
emScrollView
vez de calcular explicitamente.Código de
View#getDrawingRect
:Código de
View#getHitRect
:fonte
Isso funciona:
fonte
GridView
/ListView
/GridViewWithHeader
trabalharSwipeRefreshLayout
.getHitRect
retorna um reto nas coordenadas pai, masgetLocalVisibleRect
retorna um reto nas coordenadas locais da visualização de rolagem, não é?Se você deseja detectar que a visualização é totalmente visível:
fonte
Minha solução é usar o
NestedScrollView
elemento Scroll:fonte
Para expandir um pouco a resposta de Bill Mote usando getLocalVisibleRect, convém verificar se a exibição é apenas parcialmente visível:
fonte
Esta extensão ajuda a detectar a vista totalmente visível.
Também funciona se você
View
é filho de filho de ... deScrollView
(por exemplo:ScrollView
->LinearLayout
->ContraintLayout
-> ... ->YourView
).Nota
1)
view.getY()
eview.getX()
retorne o valor x, y para PRIMEIRO PAI .2) Aqui está um exemplo sobre como
getDrawingRect
retornará o Linkfonte
fonte
Eu enfrentei o mesmo problema hoje. Ao pesquisar no Google e ler a referência do Android, encontrei este post e um método que acabei usando;
Agradável não apenas fornecer Rect, mas também booleano, indicando se o View está visível. No lado negativo, este método não está documentado :(
fonte
Se você deseja detectar se o seu
View
está totalmentevisible
, tente com este método:A rigor, você pode obter a visibilidade de uma visualização com:
Os valores constantes possíveis da visibilidade em uma Visualização são:
VISÍVEL Esta visão é visível. Use com setVisibility (int) e android: visibilidade.
INVISÍVEL Essa visualização é invisível, mas ainda ocupa espaço para fins de layout. Use com setVisibility (int) e android: visibilidade.
IDO Esta visão é invisível, e não tomar qualquer espaço para fins de layout. Use com setVisibility (int) e android: visibilidade.
fonte
Você pode usar o
FocusAwareScrollView
que notifica quando a visualização se torna visível:Aqui está a classe:
fonte
Caminho Kotlin;
Uma extensão para listar a rolagem da exibição de rolagem e executar uma ação se a exibição infantil estiver visível na tela.
Use esta função de extensão para qualquer exibição rolável
fonte
Eu sei que é muito tarde. Mas eu tenho uma boa solução. Abaixo está o snippet de código para obter a porcentagem de visibilidade da visualização na visualização por rolagem.
Antes de tudo, configure o ouvinte de toque na exibição de rolagem para obter retorno de chamada para parada de rolagem.
No snippet de código acima, estamos recebendo retornos de chamada para eventos de toque de exibição de rolagem e publicamos uma executável após 150 milis (não obrigatório) após a interrupção do retorno de chamada para rolagem. Nesse executável, obteremos a localização da visualização de rolagem na tela e a altura da visualização de rolagem. Em seguida, obtenha a instância direta do grupo de exibição filho da exibição de rolagem e faça a contagem de filhos. No meu caso, o filho direto da exibição de rolagem é LinearLayout chamado scrollViewRootChild . Em seguida, itere todas as visualizações filho de scrollViewRootChild . No trecho de código acima, você pode ver que estou obtendo a localização do filho na tela em uma matriz inteira chamada viewLocation , obtendo a altura de exibição no nome da variável viewHeight . Então eu chamei um método privado getViewVisibilityOnScrollStopped. Você pode entender o funcionamento interno desse método lendo a documentação.
Se você sentir alguma melhoria neste código, contribua.
fonte
Acabei implementando uma combinação de duas respostas Java (@ bill-mote https://stackoverflow.com/a/12428154/3686125 e @ denys-vasylenko https://stackoverflow.com/a/25528434/3686125 ) em meu projeto como um conjunto de extensões Kotlin, que oferecem suporte aos controles ScrollView vertical Vertical ou HorizontalScrollView.
Acabei de jogá-los em um arquivo Kotlin chamado Extensions.kt, sem classe, apenas métodos.
Usei-os para determinar a qual item ajustar quando um usuário parar de rolar em várias visualizações de rolagem no meu projeto:
Exemplo de uso, iterando através dos filhos LinearLayout do scrollview e saídas de log:
fonte
var
e suprimindo a dica ide?Usando a resposta @Qberticus, que foi ao ponto, mas ótima, compilei um monte de códigos para verificar se sempre que uma visualização de rolagem é chamada e rolada, ela aciona a resposta @Qberticus e você pode fazer o que quiser, no meu caso, tenho um rede social contendo vídeos, então, quando a visualização é desenhada na tela, reproduzo o mesmo vídeo do facebook e do instagram. Aqui está o código:
fonte