Geralmente usamos uma combinação semelhante de ViewPager+Fragment+TabLayout.
Depois, há várias demandas.
Às vezes, é necessário que o viewpager não deslize para a esquerda e para a direita, mas a animação de rolagem ao alternar é mantida.
Às vezes, é necessário que o viewpager não deslize para a esquerda e para a direita e a animação de rolagem não apareça ao alternar.
[Solução]
Para atingir os requisitos acima, precisamos reescrever o ViewPager.
Para proibir o ViewPager de deslizar para a esquerda e para a direita:
Substitua o método onInterceptTouchEvent(MotionEvent arg0)
e o método onTouchEvent(MotionEvent arg0) do ViewPager.
Os valores de retorno desses dois métodos são ambos tipos booleanos. Você só precisa alterar o valor de retorno para false
para esse ViewPager não será consumido O evento de deslizamento do dedo é passado para a View superior para processamento ou o evento é encerrado diretamente.
Para animação de troca de viewpager estático:
você precisa reescrever o método setCurrentItem() de viewpager
A classe NoScrollViewPager personalizada é a seguinte, que pode ser copiada e colada diretamente para uso.
/** * Usado para proteger o viewpager de deslizar para a esquerda e para a direita e rolar a animação ao alternar * Proibir o ViewPager de deslizar para a esquerda e para a direita: * ViewPager precisa ser reescrito para substituir o método onInterceptTouchEvent(MotionEvent arg0) do ViewPager * e o método onTouchEvent(MotionEvent arg0) * esses dois O valor de retorno do método é do tipo booleano, você só precisa alterar o valor de retorno para false * para que o ViewPager não consuma o evento de deslizamento do dedo e passe para o View superior para processamento ou o evento será encerrado diretamente. * * Animação estática de troca de viewpager: * Você precisa reescrever o método setCurrentItem() do viewpager */ public class NoScrollViewPager extends ViewPager { private boolean isCanScroll = true; private boolean isHasScrollAnim=true; public NoScrollViewPager(Context context) { super( context); } public NoScrollViewPager(contexto de contexto, AttributeSet attrs) { super(contexto, atributos); } /** * Define se pode deslizar * @param isCanScroll false proíbe deslizamento, true permite deslizamento */ public void setCanScroll(boolean isCanScroll) { this.isCanScroll = isCanScroll; } /** * Define se deseja remover efeito deslizante * @param isHasScrollAnim false para remover o efeito de rolagem, true para não removê-lo */ public void setHasScrollAnim(boolean isHasScrollAnim){ this.isHasScrollAnim=isHasScrollAnim; } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { return isCanScroll & & super .onInterceptTouchEvent(ev); } @Override public boolean onTouchEvent( MotionEvent ev) { return isCanScroll && super.onTouchEvent(ev); } @Override public void setCurrentItem(int item, boolean smoothScroll) { super.setCurrentItem(item, smoothScroll); } /** * Define se deseja buscar a animação de rolagem ao alternar *isHasScrollAnim Quando falso , o efeito de rolagem será removido */ @Override public void setCurrentItem(int item) { super.setCurrentItem(item,isHasScrollAnim); } }
Entre eles, setHasScrollAnim(boolean isHasScrollAnim) é usado para definir se o efeito deslizante deve ser removido,
setCanScroll(boolean isCanScroll) é usado para definir se deve deslizar