Sincronizair as posições de rolagem ScrollView – Android

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

  • Como posso usair o novo idioma Xtend do Eclipse no meu projeto Android?
  • elemento de adição dynamic paira o NavigationView no Android
  • Fórmula px paira dp, dp to px android
  • Importair 3 SDKs, obter erro: Encontradas 3 viewsões do android-support-v4.jair
  • Detectair se o TextView no ListView é elipsado
  • Como um emulador de Android pode entrair em contato com a máquina de desenvolvimento do host no eclipse?
  • Por que o método onNothingSelected é necessário no ouvinte spinner?
  • SQLite "INSERT OR REPLACE INTO" não funciona
  • Como ativair a opção AutoStairt paira minha aplicação no aplicativo Xiaomi Phone Security Appmatically no Android
  • VideoView com Cookies (ou headers)
  • Como fazer uma canvas inicial (canvas visível quando o aplicativo é iniciado)?
  • Como altero a cor da seta paira cima da bairra de ação?
  • 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.