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_edge和overscroll_glow drawables 复制到你自己的项目,因为它们是android的内部)或继续创建自己的版本.
祝好运.
(顺便说一句,这就是他们如何在ICS的启动器菜单中创建酷炫的边缘倾斜效果......所以你几乎可以像你想要的那样有创意;)
我试图获得与此问题中提到的完全相同的效果.我挣扎着,然后我读了@wnafee回答(我无法做到这一点).
但后来我很难从答案中实现听起来很简单的东西.我在实现它时遇到了很多麻烦,我可能没有正确理解答案,但由于我没有在兼容性库的相同软件包中工作,因此存在太多无法访问的API问题.
在我尝试了一些方法之后(它们都没有成功,而且它们非常复杂)我走向了一个稍微不同的方向,现在它就像一个魅力.我使用了一些反思,对于那些从未使用它的人,不要担心它实际上是反射的基础.
我不确定它是否是最好的解决方案,但它对我有用,所以如果你想使用它,欢迎你.请阅读Wnafee示例,因为它解释了我所做的一些事情.
为了完成这项任务,你应该按照我的三部分解决方案.(将在3-10分钟之间带你)
第一部分:
正如Wnafee说,我只是做了一份由我自己EdgeEffect类从粘贴的源代码在这里,
(只需确保将AOSP/res/drawable目录中的overscroll_edge和overscroll_glow drawable复制到您自己的项目中,因为它们是android内部的)
我只做了两个非常小的改动:
EdgeEffectForEarlyVersions
).public class EdgeEffectForEarlyVersions extends EdgeEffectCompat
.进行此更改的原因是mLeftEdge
和mRightEdge
类型EdgeEffectCompat
.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 中的示例。这是一个很好的来源。
归档时间: |
|
查看次数: |
7985 次 |
最近记录: |