- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 ViewPager,有 4 个页面,页面将使用 runable 和 handler 不断滑动......每个页面包含一个 ImageView,ImageView onClickListener 事件在 Adapter 中设置
ViewPager 在初始化时设置了 OnTouchListener 事件
我将 ViewPager OnTouchListener 事件设置为在用户触摸 viewpager 时停止滑动,并在用户释放手指时继续滑动
这是我设置 ViewPager OnTouchListener 事件的方法:
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
正在窃取 MotionEvent
来自您的回调ViewPager
是因为OnTouchListener.onTouch()
你的方法ViewPager
总是返回false
。这意味着它不会捕获任何新的 MotionEvent
接连回调View
(您的 ImageView
)返回 true
在 onTouchEvent()
方法。任何View
“可点击”返回 true
对于任何 MotionEvent
,并设置OnClickListener
对于View
使其可点击。
现在,第一 react 可能是创建 OnTouchListener.onTouch()
方法返回true
对于部分或全部case
声明。但这要么使ViewPager
拦截全部 MotionEvent
回调,或者不提供您想要的功能。
正确的实现是子类 ViewPager
并覆盖 onInterceptTouchEvent
和onTouchEvent
方法。关键是不返回true
在 MotionEvent.ACTION_DOWN
的情况下在onTouchEvent
,因为这会将每个手势委托(delegate)给 ViewPager
。相反,您应该拦截 MotionEvent
MotionEvent.ACTION_MOVE
情况下的回调在"slop"之后已超过阈值。这将发送所有连续的 MotionEvent
回调至ViewPager.onTouchEvent()
方法,而不是任何 subview 。
Android 文档包含关于 managing touch events 的最佳实践。我也强烈推荐观看Mastering the Android Touch System如果您想更好地了解Android框架如何处理触摸事件。
关于java - 如何将 ViewPager OnTouchListener 与 ImageView 一起使用,其中也有 OnClickListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39487614/
我是一名优秀的程序员,十分优秀!