Java 如何使用ViewPager OnTouchListener,其中包含ImageView,它还具有OnClickListener
我有一个ViewPager,它有4个页面,页面将使用runable和handler保持滑动…每个页面都包含一个ImageView,ImageView onClickListener事件在适配器中设置 初始化时,ViewPager已设置OnTouchListener事件 我将ViewPager OnTouchListener事件设置为当用户触摸ViewPager时停止滑动,当用户松开手指时继续滑动 以下是如何将ViewPager设置为TouchListener事件:Java 如何使用ViewPager OnTouchListener,其中包含ImageView,它还具有OnClickListener,java,android,android-viewpager,onclicklistener,ontouchlistener,Java,Android,Android Viewpager,Onclicklistener,Ontouchlistener,我有一个ViewPager,它有4个页面,页面将使用runable和handler保持滑动…每个页面都包含一个ImageView,ImageView onClickListener事件在适配器中设置 初始化时,ViewPager已设置OnTouchListener事件 我将ViewPager OnTouchListener事件设置为当用户触摸ViewPager时停止滑动,当用户松开手指时继续滑动 以下是如何将ViewPager设置为TouchListener事件: BandsViewPa
BandsViewPager.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
stopSliding = true;
bandsHandler.removeCallbacks(animateBandsViewPager);
break;
case MotionEvent.ACTION_CANCEL:
break;
case MotionEvent.ACTION_UP:
// calls when touch release on ViewPager
if (bands != null && bands.size() != 0) {
stopSliding = false;
bandsRunnable(bands.size());
bandsHandler.postDelayed(animateBandsViewPager, ANIM_VIEWPAGER_DELAY);
}
break;
case MotionEvent.ACTION_MOVE:
// calls when ViewPager touch
if (bandsHandler != null && stopSliding == false) {
stopSliding = true;
}
break;
}
return false;
}
});
下面是我如何在ViewPager适配器类中设置ImageView OnClickListener的:
mImageView.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
switch(ClickActionType){
case BAND_CLICK_ACTION_BRAND:
Categories_Fragment categoriesFrag= new Categories_Fragment();
Bundle categoriesArgs = new Bundle();
categoriesArgs.putInt("BrandId", ClickActionTypeId);
categoriesArgs.putInt("TabId", TabId);
if (UI.getAppLanguage() == 0)
categoriesArgs.putString("BrandName", TitleAr);
else
categoriesArgs.putString("BrandName", TitleEn);
categoriesFrag.setArguments(categoriesArgs);
FManager.beginTransaction()
.replace(R.id.main_content, categoriesFrag, Categories_Fragment.ARG_ITEM_ID)
.addToBackStack(Categories_Fragment.ARG_ITEM_ID)
.commit();
break;
case BAND_CLICK_ACTION_ITEM:
Item_Details_Fragment itemDetailsFrag= new Item_Details_Fragment();
Bundle itemDetailsArgs = new Bundle();
itemDetailsArgs.putInt("ItemId", ClickActionTypeId);
itemDetailsFrag.setArguments(itemDetailsArgs);
FManager.beginTransaction()
.replace(R.id.main_content, itemDetailsFrag, Item_Details_Fragment.ARG_ITEM_ID)
.addToBackStack(Item_Details_Fragment.ARG_ITEM_ID)
.commit();
break;
case BAND_CLICK_ACTION_CATEGORY:
Items_Fragment itemsFrag= new Items_Fragment();
Bundle itemsArgs = new Bundle();
itemsArgs.putInt("CategoryId", ClickActionTypeId);
if (UI.getAppLanguage() == 0)
itemsArgs.putString("CategoryName", TitleAr);
else
itemsArgs.putString("CategoryName", TitleEn);
itemsArgs.putInt("BrandId", 0);
itemsArgs.putInt("TabId", TabId);
itemsFrag.setArguments(itemsArgs);
FManager.beginTransaction()
.replace(R.id.main_content, itemsFrag, Items_Fragment.ARG_ITEM_ID)
.addToBackStack(Items_Fragment.ARG_ITEM_ID)
.commit();
break;
default:
}
}
});
如果我删除ImageView OnClickListener,则ViewPager将接收触摸事件。您的
ImageView
从ViewPager
中窃取MotionEvent
回调的原因是OnTouchListener.onTouch()
方法总是返回false
。这意味着在另一个View
(您的ImageView
)在onTouchEvent()方法中返回true
后,它不会捕获任何新的MotionEvent
回调。对于任何运动事件
,任何“可点击”的视图
都会返回true
,而对于视图
设置OnClickListener
则使其可点击
现在,直接的反应可能是让OnTouchListener.onTouch()
方法为部分或全部case
语句返回true
。但这会使ViewPager
截取所有MotionEvent
回调,或者不提供所需的功能
正确的实现将是子类化ViewPager
,并重写onInterceptTouchEvent
和onTouchEvent
方法。关键是在MotionEvent.ACTION\u DOWN
中的onTouchEvent
的情况下不返回true
,因为这会将每个手势委托给查看页面
。相反,您应该在MotionEvent.ACTION\u MOVE
超过阈值后拦截MotionEvent
回调。这会将所有连续的MotionEvent
回调发送到ViewPager.onTouchEvent()
方法,而不是任何子视图
Android文档中包含了有关的最佳实践。如果您想更好地了解Android框架如何处理触摸事件,我还强烈建议您观看。您的ImageView
从ViewPager
中窃取MotionEvent
回调的原因是OnTouchListener.onTouch()ViewPager的方法始终返回false
。这意味着在另一个View
(您的ImageView
)在onTouchEvent()方法中返回true
后,它不会捕获任何新的MotionEvent
回调。对于任何运动事件
,任何“可点击”的视图
都会返回true
,而对于视图
设置OnClickListener
则使其可点击
现在,直接的反应可能是让OnTouchListener.onTouch()
方法为部分或全部case
语句返回true
。但这会使ViewPager
截取所有MotionEvent
回调,或者不提供所需的功能
正确的实现将是子类化ViewPager
,并重写onInterceptTouchEvent
和onTouchEvent
方法。关键是在MotionEvent.ACTION\u DOWN
中的onTouchEvent
的情况下不返回true
,因为这会将每个手势委托给查看页面
。相反,您应该在MotionEvent.ACTION\u MOVE
超过阈值后拦截MotionEvent
回调。这会将所有连续的MotionEvent
回调发送到ViewPager.onTouchEvent()
方法,而不是任何子视图
Android文档中包含了有关的最佳实践。如果您想更好地了解Android框架如何处理触摸事件,我还强烈建议您观看