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() - 40
iç 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
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.
Nasıl Android üzerinde çok kendi URİ p...
Nasıl Android genişletilebilir panelle...
Nasıl bir android:'t germek değil...
Nasıl Android ActionBar Geri düğmesini...
Nasıl bir hizmet Android üzerinde çalı...