在android中过度滚动的视觉指示

ekr*_*mus 10 android android-compatibility android-overscoll android-viewpager

我试图添加一些视觉指示,在ViewPager中没有更多页面在所需的方向上.但是我很难找到一个地方,在哪里放置相关的代码.

我尝试使用以下代码扩展ViewPager类,但Toast未显示(ev.getOrientation()始终返回0).我也尝试了历史点,但ev.getHistorySize()也返回0.

我错过了什么?

类示例:

public class CustomViewPager extends ViewPager {

    public CustomViewPager(Context context) {
        super(context);
    }

    public CustomViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    /**
     * @see android.support.v4.view.ViewPager#onTouchEvent(android.view.MotionEvent)
     */
    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        boolean result = super.onTouchEvent(ev);

        switch (ev.getAction() & MotionEventCompat.ACTION_MASK) {
            case MotionEvent.ACTION_MOVE:
                if (ev.getOrientation() > 0) {
                    Toast.makeText(getContext(), "left", 0).show();
                }
        }

        return result;
    }
}
Run Code Online (Sandbox Code Playgroud)

wna*_*fee 19

如果查看v4支持库,您将看到ViewPager使用的一个名为EdgeEffectCompat的类(当您到达ICS +中的视图寻呼机的开头或结尾时,这会提供发光效果)如果您查看compat库中的实现,将看到它有一个if语句来查看构建版本是否为14+(ICS).如果是,则最终使用在ICS中生成的正常EdgeEffect类最终(如果您追踪足够长的时间)结束.否则它使用BaseEdgeEffectImpl,它基本上没有任何内容.

如果需要,您可以创建自己的自定义ViewPager,使用自己的EdgeEffect.您可以查看android源代码,看看他们如何在这里实现EdgeEffect ,你几乎可以复制(只需确保将AOSP/res/drawable目录中的overscroll_edgeoverscroll_glow drawables 复制到你自己的项目,因为它们是android的内部)或继续创建自己的版本.

祝好运.

(顺便说一句,这就是他们如何在ICS的启动器菜单中创建酷炫的边缘倾斜效果......所以你几乎可以像你想要的那样有创意;)


nhe*_*nn1 7

我试图获得与此问题中提到的完全相同的效果.我挣扎着,然后我读了@wna​​fee回答(我无法做到这一点).

但后来我很难从答案中实现听起来很简单的东西.我在实现它时遇到了很多麻烦,我可能没有正确理解答案,但由于我没有在兼容性库的相同软件包中工作,因此存在太多无法访问的API问题.

在我尝试了一些方法之后(它们都没有成功,而且它们非常复杂)我走向了一个稍微不同的方向,现在它就像一个魅力.我使用了一些反思,对于那些从未使用它的人,不要担心它实际上是反射的基础.

我不确定它是否是最好的解决方案,但它对我有用,所以如果你想使用它,欢迎你.请阅读Wnafee示例,因为它解释了我所做的一些事情.

为了完成这项任务,你应该按照我的三部分解决方案.(将在3-10分钟之间带你)

第一部分:

正如Wnafee说,我只是做了一份由我自己EdgeEffect类从粘贴的源代码在这里,

(只需确保将AOSP/res/drawable目录中的overscroll_edge和overscroll_glow drawable复制到您自己的项目中,因为它们是android内部的)

我只做了两个非常小的改动:

  1. 我声明该类扩展了EdgeEffectCompat(我称之为我的类EdgeEffectForEarlyVersions).public class EdgeEffectForEarlyVersions extends EdgeEffectCompat.进行此更改的原因是mLeftEdgemRightEdge类型EdgeEffectCompat.
  2. 在"我的"新类的构造函数的第一行,我添加了对父构造函数的调用super(context);.由于没有默认构造函数,EdgeEffectCompat因此必须显式调用构造函数.

第二部分

除此之外我写了另一个函数.该功能的目的是在早期版本(ICS之前)的情况下,我们想使用EdgeEffectForEarlyVersions我们刚刚复制的版本.为了达到这个目的,我使用了反射.

这是功能:

private static void changeEdgeEffectCompactOnEarlyVersions(ViewPager viewPager, Context context)
{
    /* In case that the version is earlier than 14 there is only empty implementation for the edge effect, therefore we change it.
     * for more information look on the following links:
     * 1. http://stackoverflow.com/questions/10773565/visual-indication-of-over-scroll-in-android
     * 2. http://grepcode.com/file/repo1.maven.org/maven2/com.google.android/support-v4/r7/android/support/v4/view/ViewPager.java#ViewPager.0mLeftEdge
     * 3. http://grepcode.com/file/repo1.maven.org/maven2/com.google.android/support-v4/r7/android/support/v4/widget/EdgeEffectCompat.java#EdgeEffectCompat
     */

    if (Build.VERSION.SDK_INT < 14)
    {
        try
        {
            Class<ViewPager> viewPagerClass = ViewPager.class;
            //Get the left edge field, since it is private we used getDeclaredField and not getDeclared 
            Field leftEdge = viewPagerClass.getDeclaredField("mLeftEdge");
            leftEdge.setAccessible(true);
            //Get the right edge field, since it is private we used getDeclaredField and not getDeclared
            Field rightEdge = viewPagerClass.getDeclaredField("mRightEdge");
            rightEdge.setAccessible(true);

            EdgeEffectForEarlyVersions leftEdgeEffect = new EdgeEffectForEarlyVersions(context);
            EdgeEffectForEarlyVersions rightEdgeEffect = new EdgeEffectForEarlyVersions(context);

            //Set the mLeftEdge memeber of viewPager not to be the default one, but to be "our" edgeEffect  
            leftEdge.set(viewPager, leftEdgeEffect);
            //Set the mRightEdge memeber of viewPager not to be the default one, but to be "our" edgeEffect
            rightEdge.set(viewPager, rightEdgeEffect);              
        }
        catch (Exception ex)
        {
            Log.e("refelection", ex.getMessage());
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

第三部分

现在剩下要做的就是在拥有ViewPager实例之后调用该函数,仅此而已.

我希望它会帮助某人.


Har*_*iya -1

通常使用 ViewPager,人们使用PagerAdapter诸如FragmentPagerAdapter或 之类FragmentStatePagerAdapter的命令来用内容淹没 ViewPager(您的内容将是视图)。

现在,当您使用 a 时PagerAdapter,您有一个名为http://developer.android.com/reference/android/support/v4/view/PagerAdapter.html#getCount%28%29getCount()的方法,它会给您的大小内容。

既然您现在知道了可以使用 if 控制语句轻松显示消息的大小。

试试这个代码:http://developer.android.com/reference/android/support/v4/view/ViewPager.html

注意:我认为您不需要自定义 ViewPager。您还需要了解 ViewPager 的 Fragments。查看 ApiDemos 中的示例。这是一个很好的来源。