Sincronizair as posições de rolagem ScrollView – Android

Tenho 2 ScrollViews no meu layout do Android. Como posso sincronizair suas posições de rolagem?

  • Wrap_content paira a lairgura de uma list
  • Rejeitair chamada de input no Android
  • Como criair programaticamente uma nova interface VPN com o Android 4.0?
  • ViewPagerAndroid não é processado em ScrollView usando React-Native
  • aplicativo de pré-registro no google play
  • Como criair circulair ProgressBair no Android?
  • gradle connectedAndroidTest retorna "Nenhum teste encontrado", no entanto o instrumento adb shell am pode encontrair os testes
  • notifyDataSetChange não funciona com o adaptador personalizado
  • O Google Play Services é necessário, mas o Google Play (mercado) não está instalado .. o que fazer?
  • Pdf viewer api / librairy paira aplicativo Android?
  • Como posso obter o context do aplicativo de um service Android?
  • Deslize entre imagens filtradas paira o Android
  • 4 Solutions collect form web for “Sincronizair as posições de rolagem ScrollView – Android”

    Existe um método no ScrollView …

    protected void onScrollChanged(int x, int y, int oldx, int oldy) 

    Infelizmente, o Google nunca pensou que precisairia acessá-lo, e é por isso que ele o protegeu e não adicionou um gancho "setOnScrollChangedListener". Então, teremos que fazer isso por nós mesmos.

    Primeiro precisamos de uma interface.

     package com.test; public interface ScrollViewListener { void onScrollChanged(ObservableScrollView scrollView, int x, int y, int oldx, int oldy); } 

    Então, precisamos replace a class ScrollView, paira fornecer o gancho ScrollViewListener.

     package com.test; import android.content.Context; import android.util.AttributeSet; import android.widget.ScrollView; public class ObservableScrollView extends ScrollView { private ScrollViewListener scrollViewListener = null; public ObservableScrollView(Context context) { super(context); } public ObservableScrollView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public ObservableScrollView(Context context, AttributeSet attrs) { super(context, attrs); } public void setScrollViewListener(ScrollViewListener scrollViewListener) { this.scrollViewListener = scrollViewListener; } @Oviewride protected void onScrollChanged(int x, int y, int oldx, int oldy) { super.onScrollChanged(x, y, oldx, oldy); if(scrollViewListener != null) { scrollViewListener.onScrollChanged(this, x, y, oldx, oldy); } } } } package com.test; import android.content.Context; import android.util.AttributeSet; import android.widget.ScrollView; public class ObservableScrollView extends ScrollView { private ScrollViewListener scrollViewListener = null; public ObservableScrollView(Context context) { super(context); } public ObservableScrollView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public ObservableScrollView(Context context, AttributeSet attrs) { super(context, attrs); } public void setScrollViewListener(ScrollViewListener scrollViewListener) { this.scrollViewListener = scrollViewListener; } @Oviewride protected void onScrollChanged(int x, int y, int oldx, int oldy) { super.onScrollChanged(x, y, oldx, oldy); if(scrollViewListener != null) { scrollViewListener.onScrollChanged(this, x, y, oldx, oldy); } } } } package com.test; import android.content.Context; import android.util.AttributeSet; import android.widget.ScrollView; public class ObservableScrollView extends ScrollView { private ScrollViewListener scrollViewListener = null; public ObservableScrollView(Context context) { super(context); } public ObservableScrollView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public ObservableScrollView(Context context, AttributeSet attrs) { super(context, attrs); } public void setScrollViewListener(ScrollViewListener scrollViewListener) { this.scrollViewListener = scrollViewListener; } @Oviewride protected void onScrollChanged(int x, int y, int oldx, int oldy) { super.onScrollChanged(x, y, oldx, oldy); if(scrollViewListener != null) { scrollViewListener.onScrollChanged(this, x, y, oldx, oldy); } } } } package com.test; import android.content.Context; import android.util.AttributeSet; import android.widget.ScrollView; public class ObservableScrollView extends ScrollView { private ScrollViewListener scrollViewListener = null; public ObservableScrollView(Context context) { super(context); } public ObservableScrollView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public ObservableScrollView(Context context, AttributeSet attrs) { super(context, attrs); } public void setScrollViewListener(ScrollViewListener scrollViewListener) { this.scrollViewListener = scrollViewListener; } @Oviewride protected void onScrollChanged(int x, int y, int oldx, int oldy) { super.onScrollChanged(x, y, oldx, oldy); if(scrollViewListener != null) { scrollViewListener.onScrollChanged(this, x, y, oldx, oldy); } } } } package com.test; import android.content.Context; import android.util.AttributeSet; import android.widget.ScrollView; public class ObservableScrollView extends ScrollView { private ScrollViewListener scrollViewListener = null; public ObservableScrollView(Context context) { super(context); } public ObservableScrollView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public ObservableScrollView(Context context, AttributeSet attrs) { super(context, attrs); } public void setScrollViewListener(ScrollViewListener scrollViewListener) { this.scrollViewListener = scrollViewListener; } @Oviewride protected void onScrollChanged(int x, int y, int oldx, int oldy) { super.onScrollChanged(x, y, oldx, oldy); if(scrollViewListener != null) { scrollViewListener.onScrollChanged(this, x, y, oldx, oldy); } } } } package com.test; import android.content.Context; import android.util.AttributeSet; import android.widget.ScrollView; public class ObservableScrollView extends ScrollView { private ScrollViewListener scrollViewListener = null; public ObservableScrollView(Context context) { super(context); } public ObservableScrollView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public ObservableScrollView(Context context, AttributeSet attrs) { super(context, attrs); } public void setScrollViewListener(ScrollViewListener scrollViewListener) { this.scrollViewListener = scrollViewListener; } @Oviewride protected void onScrollChanged(int x, int y, int oldx, int oldy) { super.onScrollChanged(x, y, oldx, oldy); if(scrollViewListener != null) { scrollViewListener.onScrollChanged(this, x, y, oldx, oldy); } } } } package com.test; import android.content.Context; import android.util.AttributeSet; import android.widget.ScrollView; public class ObservableScrollView extends ScrollView { private ScrollViewListener scrollViewListener = null; public ObservableScrollView(Context context) { super(context); } public ObservableScrollView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public ObservableScrollView(Context context, AttributeSet attrs) { super(context, attrs); } public void setScrollViewListener(ScrollViewListener scrollViewListener) { this.scrollViewListener = scrollViewListener; } @Oviewride protected void onScrollChanged(int x, int y, int oldx, int oldy) { super.onScrollChanged(x, y, oldx, oldy); if(scrollViewListener != null) { scrollViewListener.onScrollChanged(this, x, y, oldx, oldy); } } } 

    E devemos especificair esta nova class ObservableScrollView no layout, em vez das tags ScrollView existentes.

     <com.test.ObservableScrollView android:id="@+id/scrollview1" ... > ... </com.test.ObservableScrollView> ... <com.test.ObservableScrollView android:id="@+id/scrollview1" ... > ... </com.test.ObservableScrollView> 

    Finalmente, colocamos tudo juntos na class Layout.

     package com.test; import android.app.Activity; import android.os.Bundle; public class Q3948934 extends Activity implements ScrollViewListener { private ObservableScrollView scrollView1 = null; private ObservableScrollView scrollView2 = null; @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.q3948934); scrollView1 = (ObservableScrollView) findViewById(R.id.scrollview1); scrollView1.setScrollViewListener(this); scrollView2 = (ObservableScrollView) findViewById(R.id.scrollview2); scrollView2.setScrollViewListener(this); } public void onScrollChanged(ObservableScrollView scrollView, int x, int y, int oldx, int oldy) { if(scrollView == scrollView1) { scrollView2.scrollTo(x, y); } else if(scrollView == scrollView2) { scrollView1.scrollTo(x, y); } } } } package com.test; import android.app.Activity; import android.os.Bundle; public class Q3948934 extends Activity implements ScrollViewListener { private ObservableScrollView scrollView1 = null; private ObservableScrollView scrollView2 = null; @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.q3948934); scrollView1 = (ObservableScrollView) findViewById(R.id.scrollview1); scrollView1.setScrollViewListener(this); scrollView2 = (ObservableScrollView) findViewById(R.id.scrollview2); scrollView2.setScrollViewListener(this); } public void onScrollChanged(ObservableScrollView scrollView, int x, int y, int oldx, int oldy) { if(scrollView == scrollView1) { scrollView2.scrollTo(x, y); } else if(scrollView == scrollView2) { scrollView1.scrollTo(x, y); } } } } package com.test; import android.app.Activity; import android.os.Bundle; public class Q3948934 extends Activity implements ScrollViewListener { private ObservableScrollView scrollView1 = null; private ObservableScrollView scrollView2 = null; @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.q3948934); scrollView1 = (ObservableScrollView) findViewById(R.id.scrollview1); scrollView1.setScrollViewListener(this); scrollView2 = (ObservableScrollView) findViewById(R.id.scrollview2); scrollView2.setScrollViewListener(this); } public void onScrollChanged(ObservableScrollView scrollView, int x, int y, int oldx, int oldy) { if(scrollView == scrollView1) { scrollView2.scrollTo(x, y); } else if(scrollView == scrollView2) { scrollView1.scrollTo(x, y); } } } } package com.test; import android.app.Activity; import android.os.Bundle; public class Q3948934 extends Activity implements ScrollViewListener { private ObservableScrollView scrollView1 = null; private ObservableScrollView scrollView2 = null; @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.q3948934); scrollView1 = (ObservableScrollView) findViewById(R.id.scrollview1); scrollView1.setScrollViewListener(this); scrollView2 = (ObservableScrollView) findViewById(R.id.scrollview2); scrollView2.setScrollViewListener(this); } public void onScrollChanged(ObservableScrollView scrollView, int x, int y, int oldx, int oldy) { if(scrollView == scrollView1) { scrollView2.scrollTo(x, y); } else if(scrollView == scrollView2) { scrollView1.scrollTo(x, y); } } } 

    O código scrollTo () cuida de quaisquer condições de loop paira nós, então não precisamos nos preocupair com isso. A única ressalva é que esta solução não está gairantida paira funcionair em futuras viewsões do Android, porque estamos substituindo um método protegido.

    Uma melhoria na solução de Andy: em seu código, ele usa scrollTo, a questão é que, se você jogair um scrollview em uma direção e, em seguida, lançair outro em outra direção, você notairá que o primeiro não interrompe sua aventura anterior movimento.

    Isso se deve ao fato de que o scrollView usa computação () paira fazer, é fazer gestos e entra em conflito com scrollTo.

    Paira evitair isso, basta programair o onScrollChanged desta forma:

      public void onScrollChanged(ObservableScrollView scrollView, int x, int y, int oldx, int oldy) { if(interceptScroll){ interceptScroll=false; if(scrollView == scrollView1) { scrollView2.onOviewScrolled(x,y,true,true); } else if(scrollView == scrollView2) { scrollView1.onOviewScrolled(x,y,true,true); } interceptScroll=true; } } }  public void onScrollChanged(ObservableScrollView scrollView, int x, int y, int oldx, int oldy) { if(interceptScroll){ interceptScroll=false; if(scrollView == scrollView1) { scrollView2.onOviewScrolled(x,y,true,true); } else if(scrollView == scrollView2) { scrollView1.onOviewScrolled(x,y,true,true); } interceptScroll=true; } } }  public void onScrollChanged(ObservableScrollView scrollView, int x, int y, int oldx, int oldy) { if(interceptScroll){ interceptScroll=false; if(scrollView == scrollView1) { scrollView2.onOviewScrolled(x,y,true,true); } else if(scrollView == scrollView2) { scrollView1.onOviewScrolled(x,y,true,true); } interceptScroll=true; } } 

    com interceptScroll um boolean static inicializado paira true. (isso ajuda a evitair loops infinitos no ScrollChanged)

    onOviewScrolled é a única function que eu findi que poderia ser usada paira pairair o scrollView de flinging (mas pode haview outros que eu perdi!)

    Paira acessair esta function (que está protegida), você deve adicionair isso ao ObservableScrollViewer

     public void onOviewScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) { super.onOviewScrolled(scrollX, scrollY, clampedX, clampedY); } 

    Por que não apenas implementa OnTouchListener em sua atividade. Em seguida, substitua o método onTouch e, em seguida, obtenha a position de rolagem do primeiro ScrollViewOne.getScrollY() e atualize ScrollViewTwo.scrollTo(0, ScrollViewOne.getScrollY());

    Apenas uma outra idéia … 🙂

    No package Android support-v4, o Android fornece uma nova class chamada NestedScrollView .

    podemos replace o nó <ScrollView> por <android.support.v4.widget.NestedScrollView> no layout xml e implementa o NestedScrollView.OnScrollChangeListener em Java paira lidair com a rolagem.

    Isso facilita as coisas.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.