Android-poziome przewijanie wielu widocznych elementów
EDIT: zobacz moją własną odpowiedź na łatwe rozwiązanie
Ważne: Bounty jest oferowany dla jasnego sposobu modyfikacji Viewpagera, aby spełnić scenariusz przedstawiony poniżej. Proszę nie oferować HorizontalScrollView - potrzebuję pełnego scenariusza cyklu życia fragmentu
Muszę zaimplementować poziome przewijanie widoków opartych na Fragments
, w których jeden element znajduje się na środku, a elementy po prawej/lewej są częściowo lub w pełni widoczne. ViewPager
źle nadaje się do zadania ponieważ koncentruje się na wyświetlaniu jednego elementu za każdym razem.
Aby ułatwić zrozumienie poniżej znajduje się szybki szkic, w którym elementy 1, 5 i 6 znajdują się poza obszarem widocznym. I i chcę, aby ta liczba wyświetlana była konfigurowalna, więc na przykład w widoku portretowym pokażę tylko 2 (lub ewentualnie tylko jedną) pozycje.
Nie staram się dopasować powiedzieć 3 elementy na ekranie, tak długo, jak centralny element jest wyświetlany inne mogą być przycięte. Na małym ekranie jest OK, aby mieć 1 centralny element i jako ekran rośnie w rozmiarze wiele (przycięte jest OK) elementy powinny być wyświetlane
Rozumiem, że wygląda to jak Galeria, ale ponownie elementy nie są prostymi obrazkami, ale Fragments
z pionowo przewijaną listą w każdym fragmencie
P. S. znalazłem ten wpis na blogu @Commonsware, który wymienia 3 różne podejścia. For my need I like # 3
7 answers
Ten ma zaskakująco łatwą odpowiedź, nie jestem nawet pewien, dlaczego nie został opublikowany od razu. Wszystko, co musiałem zrobić, aby uzyskać dokładny efekt, to obejść metodę PagerAdapter#getPageWidth
. Domyślnie zwraca 1, ale jeśli ustawisz na 0.5 otrzymasz 2 strony, 0.33 da ci 3, itd. W zależności od szerokości separatora pomiędzy pozycjami pagera może być konieczne nieznaczne zmniejszenie wartości.
Zobacz następujący fragment:
@Override
public float getPageWidth(final int position) {
// this will have 3 pages in a single view
return 0.32f;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-24 01:32:37
Kiedyś napisałem coś podobnego jak szablon. W moim przykładzie mogę przewijać przyciskami w górę iw dół oraz w bok. Możesz zmodyfikować go trochę, aby spełnić swoje wymagania. W moim przykładzie mam 4 widoki ułożone tak:
1 2
3 4
Kod składa się z tego xml:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<LinearLayout
android:layout_height="350sp"
android:layout_width="320sp">
<LinearLayout
android:id="@+id/viewContainer"
android:background="#CCCCCC"
android:layout_width="640sp"
android:layout_height="700sp">
</LinearLayout>
</LinearLayout>
<TableLayout
android:id="@+id/tableLayout"
android:layout_width="320sp"
android:layout_height="fill_parent"
android:stretchColumns="1"
android:gravity="bottom"
android:layout_alignParentBottom="true">
<TableRow
android:background="#333333"
android:gravity="bottom">
<Button
android:id="@+id/btnUp"
android:layout_width="60sp"
android:layout_height="50sp"
android:text="Lift U"
/>
<Button
android:layout_width="60sp"
android:layout_height="50sp"
android:visibility="invisible"
/>
<Button
android:layout_width="60sp"
android:layout_height="50sp"
android:visibility="invisible"
/>
<Button
android:id="@+id/btnScreenUp"
android:layout_width="60sp"
android:layout_height="50sp"
android:layout_gravity="right"
android:text="Scrn U"
/>
</TableRow>
<TableRow
android:background="#444444"
android:layout_gravity="right">
<Button
android:id="@+id/btnDown"
android:layout_width="60sp"
android:layout_height="50sp"
android:text="Lift D"
/>
<Button
android:id="@+id/btnEnter"
android:layout_width="60sp"
android:layout_height="50sp"
android:text="Enter"
/>
<Button
android:id="@+id/btnScreenLeft"
android:layout_width="60sp"
android:layout_height="50sp"
android:layout_gravity="right"
android:text="Scrn L"
/>
<Button
android:id="@+id/btnScreenDown"
android:layout_width="60sp"
android:layout_height="50sp"
android:layout_gravity="right"
android:text="Scrn D"
/>
<Button
android:id="@+id/btnScreenRight"
android:layout_width="60sp"
android:layout_height="50sp"
android:layout_gravity="right"
android:text="Scrn R"
/>
</TableRow>
</TableLayout>
</FrameLayout>
I ten kod Javy:
import android.app.Activity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
public class ViewSwitcherTest extends Activity {
private TextView view1, view2, view3, view4;
private Button btnUp, btnEnter, btnDown, btnScreenDown, btnScreenUp, btnScreenLeft, btnScreenRight;
private LinearLayout viewContainer;
// private TableLayout tableLayout;
private LinearLayout.LayoutParams layoutParams;
private DisplayMetrics metrics = new DisplayMetrics();
private int top = 0, left = 0;
private float density = 1.0f;
// private ViewSwitcher switcher;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindowManager().getDefaultDisplay().getMetrics(metrics);
density = metrics.density;
setContentView(R.layout.main);
// Buttons
btnEnter = (Button)findViewById(R.id.btnEnter);
btnUp = (Button)findViewById(R.id.btnUp);
btnDown = (Button)findViewById(R.id.btnDown);
btnScreenDown = (Button)findViewById(R.id.btnScreenDown);
btnScreenUp = (Button)findViewById(R.id.btnScreenUp);
btnScreenLeft = (Button)findViewById(R.id.btnScreenLeft);
btnScreenRight = (Button)findViewById(R.id.btnScreenRight);
// --------
// tableLayout = (TableLayout)findViewById(R.id.tableLayout);
view1 = new TextView(this);
view1.setBackgroundResource(R.drawable.view1);
view1.setHeight((int)(350*density));
view1.setWidth((int)(320*density));
view1.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL);
layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
layoutParams.setMargins(left, top, 0, 0);
viewContainer = (LinearLayout)findViewById(R.id.viewContainer);
viewContainer.addView(view1, layoutParams);
//Add 2nd view
view2 = new TextView(this);
view2.setBackgroundResource(R.drawable.view2);
view2.setHeight((int)(350*density));
view2.setWidth((int)(320*density));
view2.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL);
layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
layoutParams.setMargins(left, top, 0, 0);
viewContainer.addView(view2, layoutParams);
//Add 3rd view
view3 = new TextView(this);
view3.setBackgroundResource(R.drawable.view3);
view3.setHeight((int)(350*density));
view3.setWidth((int)(320*density));
view3.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL);
top += 350*density;
left += 640*density*(-1);
layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
layoutParams.setMargins(left, top, 0, 0);
viewContainer.addView(view3, layoutParams);
//add 4th view
view4 = new TextView(this);
view4.setBackgroundResource(R.drawable.view4);
view4.setHeight((int)(350*density));
view4.setWidth((int)(320*density));
view4.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL);
top += 0;
left += 640*density;
layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
layoutParams.setMargins(left, top, 0, 0);
viewContainer.addView(view4, layoutParams);
btnEnter.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// Quit the application for now
finish();
}
});
btnScreenLeft.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
viewContainer.scrollBy(-10,0);
}
});
btnScreenRight.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
viewContainer.scrollBy(10,0);
}
});
btnScreenUp.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
viewContainer.scrollBy(0,-10);
}
});
btnScreenDown.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
viewContainer.scrollBy(0,10);
}
});
// view1.setOnKeyListener(new OnKeyListener() {
// @Override
// public boolean onKey(View v, int keyCode, KeyEvent event) {
// if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN)
// viewContainer.scrollBy(0,10);
// return true;
// }
// });
}
}
The big numery na każdym ekranie to czarne obrazy tła z tymi liczbami namalowanymi na nim. (Nie zamieszczałem go tutaj, bo pewnie i tak zmodyfikujesz kod).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-28 18:57:09
Robimy coś dokładnie takiego, jak opisujesz, używając Gallery
z Fragments
i adaptera galerii rozszerzającego BaseAdapter
. Polecam pójść z galerią, aby osiągnąć swój cel (używamy również ViewPager
do widoku, w którym nie musimy oglądać innych fragmentów).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-20 12:44:09
Mogę wymyślić dwa sposoby, aby to zaimplementować.
By a ViewSwitcher . Oto doskonały film na YouTube pokazujący, jak to działa z onGestureListener . Nie jestem jednak pewien, czy będzie to działać z wieloma widokami, takimi jak twoje zdjęcie.
Jako alternatywę możesz użyć HorizontalScrollView . Jednak często powoduje to problemy, jeśli masz jeden widok przewijania wewnątrz innego, ale może to być warte strzał!
Let me know how it goes, Powodzenia!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-08 00:32:31
Oprócz drugiej odpowiedzi MrZander spójrz na to https://stackoverflow.com/a/2655740/935075
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:30:43
Sprawdź ten wpis na blogu na temat tego, jak napisać niestandardowy poziomy widok przewijania, aby osiągnąć coś podobnego. Przykład ma tylko jeden ekran widoczny na raz, ale powinieneś być w stanie łatwo zmodyfikować go do swoich potrzeb.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-28 15:58:03
Jeśli chcesz rozszerzyć ViewPager wystarczy nadpisać metodę draw i setOffscreenPageLimit (int limit). Ale zalecam użycie FragmentPageAdapter
, jeśli Twoje fragmenty są trochę złożone.
Możesz sprawdzić kod źródłowy Proszę. lub jeśli chcesz sprawdzić ten w pakiecie wsparcia, możesz to zrobić proszę..
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-01 18:53:22