using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.Support.V4.View;
using Android.Util;
namespace YourNameSpace.ViewPackage {
// Need to disable swiping for ViewPager, if user performs Pre DSA and the dsa is not completed yet
// http://stackoverflow.com/questions/9650265/how-do-disable-paging-by-swiping-with-finger-in-viewpager-but-still-be-able-to-s
public class CustomViewPager: ViewPager {
public bool ScrollEnabled;
public CustomViewPager(Context context, IAttributeSet attrs) : base(context, attrs) {
this.ScrollEnabled = true;
}
public override bool OnTouchEvent(MotionEvent e) {
if (this.ScrollEnabled) {
return base.OnTouchEvent(e);
}
return false;
}
public override bool OnInterceptTouchEvent(MotionEvent e) {
if (this.ScrollEnabled) {
return base.OnInterceptTouchEvent(e);
}
return false;
}
// For ViewPager inside another ViewPager
public override bool CanScrollHorizontally(int direction) {
return this.ScrollEnabled && base.CanScrollHorizontally(direction);
}
// Some devices like the Galaxy Tab 4 10' show swipe buttons where most devices never show them
// So, you could still swipe through the ViewPager with your keyboard keys
public override bool ExecuteKeyEvent(KeyEvent evt) {
return this.ScrollEnabled ? base.ExecuteKeyEvent(evt) : false;
}
}
}
/*
* This method JUST determines whether we want to intercept the motion.
* If we return true, onMotionEvent will be called and we do the actual
* scrolling there.
*/
这是一个完整的解决方案:
首先,将此类添加到您的src文件夹:
import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.animation.DecelerateInterpolator;
import android.widget.Scroller;
import java.lang.reflect.Field;
public class NonSwipeableViewPager extends ViewPager {
public NonSwipeableViewPager(Context context) {
super(context);
setMyScroller();
}
public NonSwipeableViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
setMyScroller();
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
// Never allow swiping to switch between pages
return false;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// Never allow swiping to switch between pages
return false;
}
//down one is added for smooth scrolling
private void setMyScroller() {
try {
Class<?> viewpager = ViewPager.class;
Field scroller = viewpager.getDeclaredField("mScroller");
scroller.setAccessible(true);
scroller.set(this, new MyScroller(getContext()));
} catch (Exception e) {
e.printStackTrace();
}
}
public class MyScroller extends Scroller {
public MyScroller(Context context) {
super(context, new DecelerateInterpolator());
}
@Override
public void startScroll(int startX, int startY, int dx, int dy, int duration) {
super.startScroll(startX, startY, dx, dy, 350 /*1 secs*/);
}
}
}
17 回答
我需要禁用在一个特定页面上的滑动,并给它一个很好的橡皮筋动画,这是如何:
如果在另一个ViewPager中有ViewPager本身,则仅覆盖
onTouchEvent
和onInterceptTouchEvent
是不够的 . 子ViewPager会从父ViewPager窃取水平滚动触摸事件,除非它位于其第一页/最后一页 .要使此设置正常工作,您还需要覆盖
canScrollHorizontally
方法 .请参阅下面的
LockableViewPager
实现 .如果你想在Xamarin中为Android实现相同的功能,这里是对C#的翻译
我选择将属性命名为“ScrollEnabled” . 因为iOS只使用excat相同的命名 . 因此,您在两个平台上具有相同的命名,使开发人员更容易 .
在.axml文件中:
以上代码都没有顺利运行 . 我试过这个
您需要继承ViewPager . onTouchEvent有很多好东西,你不想改变,比如允许子视图接触 . onInterceptTouchEvent是您想要更改的内容 . 如果你看一下ViewPager的代码,你会看到评论:
这是一个完整的解决方案:
首先,将此类添加到您的src文件夹:
接下来,请确保使用此类而不是常规的ViewPager,您可能将其指定为android.support.v4.view.ViewPager . 在您的布局文件中,您需要使用以下内容指定它:
这个特殊的例子在LinearLayout中,意味着占据整个屏幕,这就是layout_weight为1而layout_height为0dp的原因 .
并且 setMyScroller(); 方法用于平滑过渡
我知道发布这篇文章的时间太晚了,但这是一个很小的黑客来实现你的结果;)
只需添加一个虚拟视图 below 您的viewpager:
然后将
OnClickListener
添加到RelativeLayout
.通过布局,布局和行为获得一点创意,你将学会找到一种方法来完成你想象的任何事情:)
祝好运!
最好声明它是可设置的,因此您可以从xml更改其属性:
在您的values / attr.xml中:
这样你就可以在布局xml中使用它:
当然,您仍然可以拥有get / set属性 .
我用一个滑动控件写了
CustomViewPager
:如果将
canScroll
设置为true
,则可以用手指轻扫ViewPager
,而false
则相反 .我在我的项目中使用它,直到现在它都运行良好 .
我成功地使用了这门课程 . 需要覆盖 executeKeyEvent 以避免在某些设备中使用箭头滑动或访问:
在 xml 中调用它是这样的:
ViewPager
的更一般的扩展是创建SetPagingEnabled
方法,以便我们可以动态启用和禁用分页 . 要启用/禁用滑动,只需使用两种方法:onTouchEvent
和onInterceptTouchEvent
. 如果禁用了分页,则两者都将返回"false" .然后选择此项而不是XML中的内置viewpager
您只需要使用
false
调用setPagingEnabled
方法,用户将无法滑动到分页 .尝试覆盖并从onInterceptTouchEvent()和/或onTouchEvent()返回true,这将消耗寻呼机上的触摸事件 .
要禁用滑动
启用滑动
最简单的方法是
setOnTouchListener
并为ViewPager
返回true
.如果您从ViewPager扩展, you must also override executeKeyEvent ,如@araks先前所示
因为某些设备(如Galaxy Tab 4 10')显示这些按钮,大多数设备从不显示它们:
这里描述了一个简单的解决方案:Implementing a zoomable ImageView by Extending the Default ViewPager in Phimpme Android(和Github sample - PhotoView):
另一个在特定页面禁用滑动的简单解决方案(在本例中,第2页):