android中的过卷视觉指示

android中的过卷视觉指示,android,android-viewpager,android-compatibility,android-overscoll,Android,Android Viewpager,Android Compatibility,Android Overscoll,我试图添加一些视觉指示,即在ViewPager中所需的投掷方向上没有更多的页面。然而,我正在努力寻找一个地方,在那里放置相关的代码 我尝试用以下代码扩展ViewPager类,但Toast没有显示(ev.getOrientation()始终返回0)。我也对历史点进行了同样的尝试,但是ev.getHistorySize()也返回0 我错过了什么 课堂示例: 公共类CustomViewPager扩展了ViewPager{ 公共CustomViewPager(上下文){ 超级(上下文); } 公共Cus

我试图添加一些视觉指示,即在ViewPager中所需的投掷方向上没有更多的页面。然而,我正在努力寻找一个地方,在那里放置相关的代码

我尝试用以下代码扩展ViewPager类,但Toast没有显示(
ev.getOrientation()
始终返回0)。我也对历史点进行了同样的尝试,但是
ev.getHistorySize()
也返回0

我错过了什么

课堂示例:

公共类CustomViewPager扩展了ViewPager{
公共CustomViewPager(上下文){
超级(上下文);
}
公共CustomViewPager(上下文、属性集属性){
超级(上下文,attrs);
}
/**
*@see android.support.v4.view.ViewPager#onTouchEvent(android.view.MotionEvent)
*/
@凌驾
公共事件(MotionEvent ev){
布尔结果=super.onTouchEvent(ev);
开关(ev.getAction()&MotionEventCompat.ACTION\u掩码){
case MotionEvent.ACTION\u移动:
如果(ev.getOrientation()>0){
Toast.makeText(getContext(),“left”,0.show();
}
}
返回结果;
}
}

通常在使用ViewPager时,使用
PagerAdapter
FragmentPagerAdapter
FragmentStatePagerAdapter
PagerAdapter来向ViewPager注入内容(您的内容将是视图)

现在,当您使用
PagerAdapter
时,您有一个名为
getCount()
,将为您提供内容大小的方法

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

请尝试以下代码:


注意:我认为您不需要自定义的ViewPager。您还需要了解ViewPager的片段。看看ApiDemos中的样本。这是一个很好的来源。

您有很多选项,可以显示祝酒词、显示对话框、在UI上显示文本视图或图像等,或者因为您知道ViewPager中的查看项目数量,您可以在消息的位置0和/或n+1添加不同的视图,并使其跳转到实际包含数据的最后一个视图

您可以实施:

viewPager.setOnPageChangeListener(new OnPageChangeListener() {
    public void onPageSelected(int position) {
        //TODO If position is the 0 or n item, add a view at 0 or at n+1 to indicate there is no more pages with data.
    }

    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        // TODO Show a Toast, View or do anything you want when position = your first/last  item;
    }

    public void onPageScrollStateChanged(int state) {
    }
});

您可以在片段中重载setUserVisibleHint(布尔)函数。伪代码:

    void setUserVisibleHint(boolean isVisibleToUser) {
        // If this fragment is becoming visible
        if (isVisibleToUser == true) {
             // Check if it is the last fragment in the viewpager
             if (indexOfThis == getActivity().indexOfLast) {
                // Display right limit reached
                Toast(..., "No more Frags to right",...)
                }
             // Check if it is the first fragment in the viewpager
             else if (indexOfThis == getActivity().indexOfFirst) {
                // Display Left Limit reached
                Toast(..., "No more Frags to left",...)
             }
        }
    }

我没有为此目的使用此函数,但出于其他原因使用了它,它确实可以正常启动。希望这有帮助…

如果您查看v4支持库,您将看到ViewPager使用了一个名为的类(当您在ICS中到达视图页面的开头或结尾时,它会提供发光效果。)如果您查看compat库中的实现,您将看到它有一个If语句,以查看构建版本是否为14+(ICS)或者不是。如果是,那么它最终(如果跟踪足够长的话)会使用ICS中引入的普通类。否则它使用BaseEdgeEffectImpl,它基本上没有任何内容

如果需要,您可以使用自己的EdgeEffect制作自己的自定义ViewPager。您可以查看android源代码,了解它们是如何实现EdgeEffect的,您可以将其复制(只需确保将AOSP/res/drawable目录中的和drawable复制到您自己的项目中,因为它们是android内部的),或者继续创建您自己的版本

祝你好运


(顺便说一句,这就是他们如何在ICS上的launcher菜单中创建酷炫的边缘倾斜效果…所以你可以用它来创造你想要的一切;)

我正试图获得与这个问题中所问的完全相同的效果。我与之斗争,然后我读了@wnafee答案(没有它我做不到)

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

在我尝试了一些方法(没有一种成功,而且它们都很复杂)之后,我转向了一个稍微不同的方向,现在它就像一个符咒一样工作。我使用了一些反射,对于那些从未使用过它的人,不用担心,这是反射的基础

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

为了完成这项任务,你应该遵循我的三部分解决方案。(需要3-10分钟)

第一部分:

正如Wnafee所说,我只是通过复制粘贴源代码创建了自己的EdgeEffect类

(只需确保复制过卷边和过卷光晕 将AOSP/res/drawable目录中的drawables添加到您自己的项目中 因为它们是android内部的)

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

  • 我声明该类扩展了EdgeEffectCompat(我调用了我的类
    EdgeEffectForEarlyVersions
    )<代码>公共类EdgeEffectForEarlyVersions扩展了EdgeEffectCompat
  • 。进行此更改的原因是
    mlefEdge
    mRightEdge
    属于
    EdgeEffectCompat
    类型
  • 在“我的”新类的构造函数的第一行,我添加了对父构造函数
    super(上下文)的调用。由于没有
    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());
            }
    
        }
    }
    
    私有静态