当前位置: 首页 > 知识库问答 >
问题:

Android-类似旋转木马的小部件,显示左右元素的一部分

阳长恨
2023-03-14

所以我到处寻找,但找不到我的问题的答案。我基本上需要的是Android的ViewFlipper或ViewPager提供的行为,但我想显示左右视图的一部分,以指示用户有要滚动的元素,而不是让选定的视图占据整个屏幕。

我还想给左视图和侧视图添加一些效果,比如调暗和缩放,然后再缩小一点。是否可以使用stock ViewFlipper或ViewPager,或者我必须推出自己的视图组,即封面流(http://www.inter-fuser.com/2010/01/android-coverflow-widget.html)?

(附言我不想使用图库小部件,该组件很糟糕)。

一旦选择了一个视图,这就是我们需要显示的内容(左视图和右视图仍然显示):

向左或向右移动会将主视图移出,变暗或缩小一点,对下一个或上一个视图做相反的操作。

共有3个答案

邬浩涆
2023-03-14

嗯,这里有一个潜在的答案,可能接近你正在寻找的,但不完全是你正在寻找的:有一个名为ViewFlow的项目,我认为它提供了通过屏幕上的指示器通知用户有更多视图的能力。它还提供了将视图缓冲到当前视图左侧和右侧的能力,因此您可以通过缩小它所认为的可用屏幕大小来查看代码以呈现其中的一小部分。

编辑:愚蠢的我;我应该在回答之前阅读最后一个问题。:)不幸的是,我不认为你可以用ViewFlipper或Viewpager做到这一点。

汝宏伯
2023-03-14

我用它玩了一些,我的解决方案很简单。我把它贴在这里,以防有人感兴趣。

首先,每个片段的布局应该允许两侧有一些间隙。我发现最简单的方法是使用权重:

<LinearLayout
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="0.1" />

<LinearLayout
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="0.8"
    android:orientation="vertical" >

    <!-- fragment contents go here -->

</LinearLayout>

<LinearLayout
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="0.1" />

这将在两侧留下10%的利润。确保不要设置这些内容的背景,因为它将覆盖相邻片段。现在对于寻呼机本身:正如AngraX所解释的那样,您需要使用负边距,但也要确保预先加载后续片段,因为它们在定期之前是可见的。我得到了很好的效果:

    mPager = (ViewPager) findViewById(R.id.pager);
    mPager.setAdapter(mAdapter);
    mPager.setPageMargin(getResources().getDisplayMetrics().widthPixels / -7);
    mPager.setOffscreenPageLimit(2);

-7值使下一个片段的边缘可见,使用您的特定构图。我还建议对每个片段进行分帧。

柯子琪
2023-03-14

我想向任何可能想要相同功能的人提供更新。到目前为止,在实现此功能方面已经取得了很大进展,现在视图完全按照我们需要的方式工作。

ViewPager有一个名为setPageMargin()的方法。此方法可以接收负值,这将使片段/视图相互重叠。为了获得所需的布局,我们首先通过屏幕的百分比动态计算左右边距。这也可以静态完成,但由于我们将针对一系列不同的屏幕尺寸,这似乎是最好的方法。

稍后,我们将ViewPager的页边距设置为侧边距的2倍。这会使视图重新对齐。但是,此时,ViewPager将显示多个视图。

您所要做的就是对左右视图应用转换(缩放)(Android 3.0),或者在它们周围添加更多边距以将其缩小到正确的大小(3.0之前)。

onpagechangelistener . onpagescrolled()可用于跟踪ViewPager的滚动。可以实现平滑的转换。代码如下所示:

private OnPageChangeListener onPageChangeListener = new OnPageChangeListener() {

    @Override
    public void onPageSelected(int position) {
    }

    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        // positionOffset varies from 0 to 1 and indicates how far the view is
        // from the center of the ViewPager. When a view is selected (centered), this
        // value is 0.

        // Fades the text in an out while the ViewPager scrolls from one view to another.
        // On our final design the text views are fixed to the center of the screen and
        // do not scroll along with the views.
        if (positionOffset < 0.5) {
            setTextViewAlpha(1 - positionOffset * 2);
        } else {
            setTextViewAlpha((positionOffset - 0.5f) * 2);
        }

        // It's surprisingly complicated to get the current object being displayed by
        // a ViewPager (there's no getCurrentObject method). ScaleableFragment is just
        // a custom class to allow an adapter to cache it internally and also correctly
        // manage a fragment's lifecycle and restore from a saved state.
        ScaleableFragment sampleFragment = (ScaleableFragment) ((ShowHeroShotImageFragmentPagerAdapter) pager
                .getAdapter()).getItem(position);

        // Calculates by how much the current view will be scaled down. The RATIO_SCALE
        // is 0.3 in our case, which makes the side views 70% of the size of the
        // center view. When centered, the scale will be 1. When
        // fully scrolled, the scale will be 0.7.
        float scale = 1 - (positionOffset * RATIO_SCALE);

        // Just a shortcut to findViewById(R.id.image).setScale(scale);
        sampleFragment.scaleImage(scale);


        // Now, if not in the last element, scale the next one up (in opposite direction).
        if (position + 1 < pager.getAdapter().getCount()) {
            sampleFragment = (ScaleableFragment) ((ShowHeroShotImageFragmentPagerAdapter) pager.getAdapter())
                    .getItem(position + 1);
            scale = positionOffset * RATIO_SCALE + (1 - RATIO_SCALE);
            sampleFragment.scaleImage(scale);
        }
    }

    // Once scrolling is done. Make sure the views are in the right scale (1 for center,
    // 0.7 for sides). Required as the onPageScrolled() method does not guarantee it
    // will interpolate to 1.0 precisely.
    @Override
    public void onPageScrollStateChanged(int state) {
        if (state == ViewPager.SCROLL_STATE_IDLE) {
            setTextViewAlpha(1);
            ScaleableFragment sampleFragment = (ScaleableFragment) ((ShowHeroShotImageFragmentPagerAdapter) pager
                    .getAdapter()).getItem(pager.getCurrentItem());
            sampleFragment.scaleImage(1);
            sampleFragment.enableClicks();

            if (pager.getCurrentItem() > 0) {
                sampleFragment = (ScaleableFragment) ((ShowHeroShotImageFragmentPagerAdapter) pager.getAdapter())
                        .getItem(pager.getCurrentItem() - 1);
                sampleFragment.scaleImage(1 - RATIO_SCALE);
                sampleFragment.disableClicks();
            }

            if (pager.getCurrentItem() + 1 < pager.getAdapter().getCount()) {
                sampleFragment = (ScaleableFragment) ((ShowHeroShotImageFragmentPagerAdapter) pager.getAdapter())
                        .getItem(pager.getCurrentItem() + 1);
                sampleFragment.scaleImage(1 - RATIO_SCALE);
                sampleFragment.disableClicks();
            }
        }
    }
};

就是这样。我没有发布完整的解决方案,但我希望这足以让其他人开始。

附言:在3.0上启用硬件加速。没有它,在三星Galaxy选项卡10.1上滚动看起来很不稳定。

 类似资料:
  • 在一个Codenameone应用程序中,我试图开发一个底部有缩略列表的旋转木马。我使用Tabs控件在窗体的中心以旋转木马样式显示文件(不同类型的图像、视频、文本、按钮等),并使用另一个Tabs控件在窗体的底部显示拇指图像(第一个旋转木马文件的)。当用户在底部的旋转木马中选择缩略图时,相应的组件应该显示在第一个旋转木马中。 但是组件没有显示在中心旋转木马中。此外,我试图捕获事件addPointerP

  • 所以基本上我想跟滑头做点这样的事...我想有正常的幻灯片,但事情是,是,我想有行动呼吁(按钮)在他们。这通常很容易将按钮与幻灯片一起放入,但有一个溢出:旋转式播放器上隐藏的样式无法取下,否则其他幻灯片会显示出来。我想知道如何才能做到这一点(按钮稍微往外走而不被切断)。 编辑:添加边框到旋转木马,这是真正的问题,我有...维护边框并使底部与边框重叠

  • 我想把velocity.js效果结合到Slick Carousel插件中。 slick:http://kenwheeler.github.io/slick/velocity:http://julian.com/research/velocity/ 这很管用,但有一个奇怪的副作用: 这是我现在得到的密码。所以我做了一个效果序列,它是用钩子beforeChange触发的。 当我转到下一张幻灯片时,它起

  • 本文向大家介绍js实现旋转木马效果,包括了js实现旋转木马效果的使用技巧和注意事项,需要的朋友参考一下 效果图: 代码如下: 以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持呐喊教程!

  • 我想让用户能够滑动轮播如果在一个ipad的肖像模式,而不是滑动如果在横向模式。 我遵循这个例子是为了改变基于肖像/风景的旋转木马的设置,但它只在某种程度上起作用: 下面的代码适用于页面加载,但不适用于方向更改。 我想我必须重新初始化旋转木马,但我不知道如何。我试着,并用新的设置重新初始化它,但似乎不起作用。

  • 本文向大家介绍JavaScript实现旋转木马轮播图,包括了JavaScript实现旋转木马轮播图的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了JavaScript实现旋转木马轮播图的具体代码,供大家参考,具体内容如下 html代码段 图片自己添加,或者使用本人的上传照片,拉到最下面即可看见 css代码段: 初始化 reset js代码段: 这个是封装好的的js代码,直接引用即可