50

编辑:查看我自己的答案以获得简单的解决方案

重要提示赏金提供了一种明确的方式来修改 ViewPager 以满足下面概述的场景。请不要提供 Horizo​​ntalScrollView - 我需要涵盖完整的 Fragment 生命周期场景

我需要实现Fragments基于视图的水平滚动,其中一个项目位于中心,右侧/左侧的项目部分或完全可见。ViewPager不适合该任务,因为它每次都专注于显示一个项目。

为了更容易理解,下面是一个快速草图,其中项目 1、5 和 6 位于可视区域之外。并且想要使这个可查看的数字可配置,例如在纵向视图中,我将只显示 2 个(或可能只显示一个)项目。

我不想在屏幕上显示 3 个项目,只要显示中心项目就可以裁剪其他项目。在小屏幕上可以有 1 个中心项目,并且随着屏幕尺寸的增大,应该显示多个(裁剪是可以的)项目

我知道这看起来像一个画廊,但这些项目也不是简单的图像,而是Fragments每个片段中都有一个垂直滚动的列表

PS 发现@Commonsware 的这篇博文列出了 3 种不同的方法。为了我的需要,我喜欢#3

在此处输入图像描述

4

7 回答 7

24

这个答案出奇地简单,我什至不确定为什么没有立即发布。为了获得确切的效果,我需要做的就是覆盖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;
    }
于 2012-11-24T01:32:37.330 回答
2

有一次我写了类似模板的东西。在我的示例中,我可以上下左右滚动按钮。您可以对其进行一些修改以满足您的要求。在我的示例中,我有 4 个视图排列如下:

1 2
3 4

它看起来像这样。在图片上,我从视图 1 向右滚动到视图 2:

Android 视图滚动

代码由以下 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;
//          }
//      });
    }
}

每个屏幕上的大数字都是黑色背景图像,上面绘有这些数字。(我没有在这里发布它,因为你可能会修改代码)。

于 2011-12-28T18:57:09.690 回答
1

我们正在做的事情与您描述的使用GallerywithFragments和扩展BaseAdapter. 我建议您使用画廊来实现您的目标(我们还使用 aViewPager来查看我们不需要查看其他片段的视图)。

于 2012-04-19T17:48:15.480 回答
0

我可以想到两种可能实现这一点的方法。

  1. 通过ViewSwitcher。这是一个优秀的YouTube 视频,展示了它如何与onGestureListener 一起工作。但是,我不确定这是否适用于您的图片显示的多个视图。

  2. 作为替代方案,您可以使用Horizo​​ntalScrollView。但是,如果您将一个 ScrollView 放在另一个 ScrollView 中,这通常会导致问题,但这可能值得一试!

让我知道进展如何,祝你好运!

于 2011-12-08T00:32:31.737 回答
0

除了 MrZander 的第二个答案,看看这个https://stackoverflow.com/a/2655740/935075

于 2011-12-28T14:25:44.293 回答
0

查看这篇博客文章,了解如何编写自定义水平滚动视图以实现类似的效果。该示例一次只显示一个屏幕,但您应该能够根据需要轻松修改它。

于 2011-12-28T15:58:03.207 回答
0

如果你想扩展 ViewPager 只需覆盖 draw 方法,并 setOffscreenPageLimit(int limit)。FragmentPageAdapter但是,如果你的片段本身有点复杂,我建议使用。

您可以在此处查看源代码,或者如果您想查看支持包中的源代码,您可以在此处进行。

于 2011-12-29T01:31:30.077 回答