編集:簡単な解決策については、私自身の答えを参照してください
[〜#〜] important [〜#〜]:ViewPagerを修正してシナリオを満たすための明確な方法のためのバウンティが提供されます。以下に概略を説明します。 HorizontalScrollViewを提供しないでください-完全なフラグメントライフサイクルシナリオが必要です
Fragments
ベースのビューの水平スクロールを実装する必要があります。このビューでは、1つのアイテムが中央にあり、右/左のアイテムが部分的または完全に表示されます。 ViewPager
は毎回1つのアイテムを表示することに焦点を合わせているため、タスクには適していません。
以下を理解しやすくするために、アイテム1、5、および6が表示可能領域の外側にある簡単なスケッチを示します。そして、この表示可能な数を構成可能にしたいので、例えば、縦表示では、2つ(または1つだけ)のアイテムのみを表示します。
中央のアイテムが表示されている限り、他のアイテムを切り抜くことができる限り、画面に3つのアイテムを収めようとはしていません。小さい画面では、中央のアイテムを1つ持つことができ、画面のサイズが大きくなるにつれて、複数のアイテム(トリミングは問題ありません)が表示されます。
これはギャラリーのように見えますが、アイテムは単純な画像ではなく、各フラグメントに垂直にスクロール可能なリストを持つFragments
であることを理解しています
追伸@Commonswareによるこのブログ投稿を見つけました つの異なるアプローチをリストしてください 。私のニーズのために私は#3が好き
これには驚くほど簡単な答えがあります。なぜすぐに投稿されなかったのかさえ分かりません。正確な効果を得るために必要なことは、PagerAdapter#getPageWidth
方法。デフォルトでは1を返しますが、0.5に設定すると2ページ、0.33で3などになります。ページャー項目間のセパレーターの幅に応じて、値を少し減らす必要があります。
次のスニペットを参照してください。
@Override
public float getPageWidth(final int position) {
// this will have 3 pages in a single view
return 0.32f;
}
テンプレートとして似たようなものを書いたら。私の例では、ボタンを上下左右にスクロールできます。要件を満たすために少し変更することができます。私の例では、次のように配置された4つのビューがあります。
1 2
4
こんな感じです。写真上で、ビュー1から右にスクロールしてビュー2に移動します。
コードは次の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>
そして、このJavaコード:
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;
// }
// });
}
}
すべての画面上の大きな数字は、それらの数字が描かれた黒い背景画像です。 (とにかくコードを変更する可能性があるため、ここには投稿しませんでした)。
Gallery
でFragments
を使用し、BaseAdapter
を拡張するギャラリーアダプターを使用して説明しているのとほぼ同じことを行っています。目標を達成するためにギャラリーに行くことをお勧めします(他のフラグメントを見る必要のないビューにはViewPager
も使用します)。
MrZanderの2番目の答えに加えて、これを見てください https://stackoverflow.com/a/2655740/935075
このブログ投稿をチェックしてください カスタムの水平スクロールビューを作成して同様のことを実現する方法について。この例では、一度に1つの画面しか表示されませんが、必要に応じて簡単に変更できるはずです。
これを実装する2つの方法を考えることができます。
ViewSwitcher によって。 YouTubeビデオ が onGestureListener でどのように機能するかを示しています。ただし、これが写真ショーのような複数のビューで機能するかどうかはわかりません。
別の方法として、 HorizontalScrollView を使用できます。ただし、1つのScrollViewを別のScrollViewの内側に持っている場合、これは多くの場合問題を引き起こしますが、一見の価値があるかもしれません!
それがどうなるか教えてください、幸運を!