android中的过卷视觉指示
我试图添加一些视觉指示,即在ViewPager中所需的投掷方向上没有更多的页面。然而,我正在努力寻找一个地方,在那里放置相关的代码 我尝试用以下代码扩展ViewPager类,但Toast没有显示(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
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
的默认构造函数,因此必须显式调用该构造函数
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());
}
}
}
私有静态