onTouchListener在ViewPager [英] onTouchListener in ViewPager
本文介绍了onTouchListener在ViewPager的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个的ImageView
与 onTouchListener
在 ViewPager
。当然,的ImageView
秒Page的听众,当我试图改变 ViewPager
火灾关闭。有没有一种方法,以prevent它。我想我需要从刷卡识别触摸弄好了。
这是我的code的提取物:
公共类ServerDetailFragment扩展片段实现SimpleGestureListener {
GestureDetector检测器;
SimpleOnGestureListener手势=新SimpleOnGestureListener(){
公共布尔onFling(MotionEvent E1,E2 MotionEvent,浮velocityX,浮velocityY){
Log.e(TAG,onFling);
返回true;
};
};
....
@覆盖
公共无效的onCreate(捆绑savedInstanceState){
super.onCreate(savedInstanceState);
探测器=新GestureDetector(ServerDetailFragment.this.getActivity(),手势);}.... @覆盖
公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,捆绑savedInstanceState){
rootView = inflater.inflate(R.layout.fragment_server_detail,集装箱,FALSE);
MyPagerAdapter适配器=新MyPagerAdapter();
myPager =(ViewPager)rootView.findViewById(R.id.detail_pager);
myPager.setAdapter(适配器);
myPager.setCurrentItem(0);
myPager.setOffscreenPageLimit(4); ViewTreeObserver VTO = myPager.getViewTreeObserver();
vto.addOnGlobalLayoutListener(新OnGlobalLayoutListener(){
@覆盖
公共无效onGlobalLayout(){
pagerGraph =(ImageView的)myPager.findViewWithTag(myPager.getCurrentItem())findViewById(R.id.pagerView)。
pagerPb =(进度)myPager.findViewWithTag(myPager.getCurrentItem())findViewById(R.id.pagerPb)。
如果(INIT){ plotFakeData(); //以下问题的一部分,也是ViewPager的onPageChangeListener pagerGraph.setOnTouchListener(新OnTouchListener(){
@覆盖
公共布尔onTouch(视图V,MotionEvent事件){
如果(detector.onTouchEvent(事件)){ //一些code在这里 }
返回false;
} }); // myPager.setCurrentItem(0);
}
INIT = FALSE;
}
});
解决方案
我会去的东西是这样的:
公共类OnSwipeTouchListener实现OnTouchListener {私人最终GestureDetector gestureDetector =新GestureDetector(新GestureListener());公共布尔onTouch(最终视图V,最终MotionEvent事件){
返回gestureDetector.onTouchEvent(事件);
}私人final类GestureListener扩展SimpleOnGestureListener { 私有静态最终诠释SWIPE_THRESHOLD = 100;
私有静态最终诠释SWIPE_VELOCITY_THRESHOLD = 100; @覆盖
公共布尔onDown(MotionEvent五){
返回true;
}
@覆盖
公共布尔onSingleTapConfirmed(MotionEvent五){
onTouch(E);
返回true;
}
@覆盖
公共布尔onFling(MotionEvent E1,E2 MotionEvent,浮velocityX,浮velocityY){
布尔结果= FALSE;
尝试{
浮diffY = e2.getY() - e1.getY();
浮diffX = e2.getX() - e1.getX();
如果(Math.abs(diffX)GT; Math.abs(diffY)){
如果(Math.abs(diffX)GT; SWIPE_THRESHOLD和放大器;&安培; Math.abs(velocityX)GT; SWIPE_VELOCITY_THRESHOLD){
如果(diffX大于0){
}其他{
}
}
}其他{
// onTouch(E);
}
}赶上(例外的例外){
exception.printStackTrace();
}
返回结果;
}
}
公共无效onTouch(MotionEvent五){
}
}
和调用它们是这样的:
pagerGraph.setOnTouchListener(新OnSwipeTouchListener(){
公共无效onTouch(MotionEvent事件){
//你的code在这里
});
I have an ImageView
with onTouchListener
inside a ViewPager
. Of course the ImageView
's listener fires off when I try to change ViewPager
's page. Is there a way to prevent it. I guess I need to recognize touch from swipe somehow.
This is the extract of my code :
public class ServerDetailFragment extends Fragment implements SimpleGestureListener {
GestureDetector detector;
SimpleOnGestureListener gestures = new SimpleOnGestureListener() {
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
Log.e("TAG", "onFling");
return true;
};
};
....
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
detector = new GestureDetector(ServerDetailFragment.this.getActivity(), gestures);
}
....
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
rootView = inflater.inflate(R.layout.fragment_server_detail, container, false);
MyPagerAdapter adapter = new MyPagerAdapter();
myPager = (ViewPager) rootView.findViewById(R.id.detail_pager);
myPager.setAdapter(adapter);
myPager.setCurrentItem(0);
myPager.setOffscreenPageLimit(4);
ViewTreeObserver vto = myPager.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
pagerGraph = (ImageView) myPager.findViewWithTag(myPager.getCurrentItem()).findViewById(R.id.pagerView);
pagerPb = (ProgressBar) myPager.findViewWithTag(myPager.getCurrentItem()).findViewById(R.id.pagerPb);
if (init) {
plotFakeData();
// Following problematic part is also in ViewPager's onPageChangeListener
pagerGraph.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (detector.onTouchEvent(event)) {
// some more code here
}
return false;
}
});
// myPager.setCurrentItem(0);
}
init = false;
}
});
解决方案
I'd go with something like this:
public class OnSwipeTouchListener implements OnTouchListener {
private final GestureDetector gestureDetector = new GestureDetector(new GestureListener());
public boolean onTouch(final View v, final MotionEvent event) {
return gestureDetector.onTouchEvent(event);
}
private final class GestureListener extends SimpleOnGestureListener {
private static final int SWIPE_THRESHOLD = 100;
private static final int SWIPE_VELOCITY_THRESHOLD = 100;
@Override
public boolean onDown(MotionEvent e) {
return true;
}
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
onTouch(e);
return true;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
boolean result = false;
try {
float diffY = e2.getY() - e1.getY();
float diffX = e2.getX() - e1.getX();
if (Math.abs(diffX) > Math.abs(diffY)) {
if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
if (diffX > 0) {
} else {
}
}
} else {
// onTouch(e);
}
} catch (Exception exception) {
exception.printStackTrace();
}
return result;
}
}
public void onTouch(MotionEvent e) {
}
}
and call them this way:
pagerGraph.setOnTouchListener(new OnSwipeTouchListener() {
public void onTouch(MotionEvent event) {
// your code here
});
这篇关于onTouchListener在ViewPager的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文