SORU
26 NİSAN 2015, Pazar


Nasıl Android NestedScrolling uygulamak için?

Destek-v4 kütüphane 22.1.0 android ile iç içe kaydırma destekler (android 5.0 öncesi). Ne yazık ki, bu özellik gerçekten açıklanmamıştır. İki arabirim (NestedScrollingParent NestedScrollingChild) gibi iki temsilci Yardımcısı sınıfları (NestedScrollingChildHelper NestedScrollingParentHelper) vardır.

Herkes Android NestedScrolling ile çalıştı?

NestedScrollingParent NestedScrollingChild hem uygulayan NestedScrollView kullandığım küçük bir örnek, Kur, denedim.

Benim düzen bu gibi görünüyor:

<android.support.v4.widget.NestedScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@ id/parent"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

  <LinearLayout
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:orientation="vertical">

    <View
        android:id="@ id/header"
        android:layout_width="match_parent" android:layout_height="100dp"
        android:background="#AF1233"/>

    <android.support.v4.widget.NestedScrollView
        android:id="@ id/child"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        >

      <FrameLayout
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:orientation="vertical">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#12AF33"
            android:text="@string/long_text"/>

      </FrameLayout>
    </android.support.v4.widget.NestedScrollView>

  </LinearLayout>

</android.support.v4.widget.NestedScrollView>

header view ve NestedScrollView (ıd = üst) NestedScrollView (ıd = çocuk) başka bir ekran istiyorum.

Fikir, OnPredrawListener kullanarak çalışma zamanında alt kaydırma görünüm yüksekliği ayarlamak için:

public class MainActivity extends Activity {

  @Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    final NestedScrollView parentScroll = (NestedScrollView) findViewById(R.id.parent);
    final NestedScrollView nestedScroll = (NestedScrollView) findViewById(R.id.child);
    parentScroll.setNestedScrollingEnabled(false);
    final View header = findViewById(R.id.header);

    parentScroll.getViewTreeObserver()
        .addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
          @Override public boolean onPreDraw() {
            if (parentScroll.getHeight() > 0) {
              parentScroll.getViewTreeObserver().removeOnPreDrawListener(this);
              nestedScroll.getLayoutParams().height = parentScroll.getHeight() - 40;
              nestedScroll.setLayoutParams(nestedScroll.getLayoutParams());
              nestedScroll.invalidate();
              return false;
            }
            return true;
          }
        });

  }
}

Başlık görünümü kısmen, 40 kaydırılan uzakta olacak piksel parentScroll.getHeight() - 40iç içe alt kaydırma görünüm yüksekliği kurduğumdan beri görünür kalır. Tamam, ayarı yükseklikte çalışma zamanı ve kayan üst kaydırma görünümü çalışır gibi beklenen (başlık verilirse, 40 piksel kalır görünür ve sonra çocuk scrollview doldurur gerisini aşağıdaki ekran Başlığı).

Ben beklediğiniz o "NestedScrolling" anlamına gelen bir kaydırma hareketi ekranda herhangi bir yere (dokunma olayı tarafından yakalanan üst kaydırma görünümü) ve eğer üst kaydırma görünümü vardır ulaştı sonunda iç içe geçmiş alt kaydırma görünümü beginns ilerleyin. Ancak böyle bir durum ne kaçamak hareketleri için basit kaydırma hareketleri için de) değil gibi görünüyor.

Dokunma olayı her zaman eğer dokunma olayı kendi sınırları, aksi takdirde üst scrollview ile başlıyorsa, iç içe çocuk scrollview tarafından işlenir.

Beklenen davranış "ya da var olan davranışları değiştirmek için bir şansımız var mı? kaydırma" iç içe geçmiş olmasıdır

Ben de NestedRecyclerView ile iç içe çocuk kaydırma görünümünü değiştirmek için çalıştı. RecyclerView ben alt ve I NestedScrollingChildHelper: tüm yöntemler temsilci nerede NestedScrollingChild hayata geçirdi

public class NestedRecyclerView extends RecyclerView implements NestedScrollingChild {

  private final NestedScrollingChildHelper scrollingChildHelper =
      new NestedScrollingChildHelper(this);


  public void setNestedScrollingEnabled(boolean enabled) {
    scrollingChildHelper.setNestedScrollingEnabled(enabled);
  }

  public boolean isNestedScrollingEnabled() {
    return scrollingChildHelper.isNestedScrollingEnabled();
  }

  public boolean startNestedScroll(int axes) {
    return scrollingChildHelper.startNestedScroll(axes);
  }

  public void stopNestedScroll() {
    scrollingChildHelper.stopNestedScroll();
  }

  public boolean hasNestedScrollingParent() {
    return scrollingChildHelper.hasNestedScrollingParent();
  }

  public boolean dispatchNestedScroll(int dxConsumed, int dyConsumed, int dxUnconsumed,
      int dyUnconsumed, int[] offsetInWindow) {

    return scrollingChildHelper.dispatchNestedScroll(dxConsumed, dyConsumed, dxUnconsumed,
        dyUnconsumed, offsetInWindow);
  }

  public boolean dispatchNestedPreScroll(int dx, int dy, int[] consumed, int[] offsetInWindow) {
    return scrollingChildHelper.dispatchNestedPreScroll(dx, dy, consumed, offsetInWindow);
  }

  public boolean dispatchNestedFling(float velocityX, float velocityY, boolean consumed) {
    return scrollingChildHelper.dispatchNestedFling(velocityX, velocityY, consumed);
  }

  public boolean dispatchNestedPreFling(float velocityX, float velocityY) {
    return scrollingChildHelper.dispatchNestedPreFling(velocityX, velocityY);
  }
}

ama NestedRecyclerView hiç kaydırma yapmaz. Tüm dokunma olayları üst kaydırma görünümünü tarafından yakalandı.

CEVAP
14 Temmuz 2015, Salı


Bu konuda bir hayli zaman sadece android kod NestedScrollView neler olup bittiğini anlamaya geçirdim. Aşağıdaki çalışması gerekir.

public abstract class ParentOfNestedScrollView extends NestedScrollView{

    public ParentOfNestedScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    /* 
    Have this return the range you want to scroll to until the 
    footer starts scrolling I have it as headerCard.getHeight() 
    on most implementations
    */
    protected abstract int getScrollRange();

    /*
    This has the parent do all the scrolling that happens until 
    you are ready for the child to scroll.
    */
    @Override
    public void onNestedPreScroll(View target, int dx, int dy, int[] consumed){
        if (dy > 0 && getScrollY() < getScrollRange()) {
            int oldScrollY = getScrollY();
            scrollBy(0, dy);
            consumed[1] = getScrollY() - oldScrollY;
        }
    }

    /*
    Sometimes the parent scroll intercepts the event when you don't
    want it to.  This prevents this from ever happening.
    */
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        return false;
    }
}

Benim kod bazı question Bu ödünç oldu. Bu sadece gerektiği gibi bu sınıfı genişletir. Benim xml bir alt ve üst olarak bir NestedScrollView çocuğu vardır. Bu, bu devam eden bir çalışma gibi savurur ben gibi işlemez.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • AlaskanGrizzly

    AlaskanGrizz

    30 EKİM 2009
  • GoogleTechTalks

    GoogleTechTa

    15 AĞUSTOS 2007
  • hidetake takayama

    hidetake tak

    3 Mart 2009