gpt4 book ai didi

java - 如何将 ViewPager OnTouchListener 与 ImageView 一起使用,其中也有 OnClickListener

转载 作者:行者123 更新时间:2023-12-02 03:21:56 27 4
gpt4 key购买 nike

我有一个 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 )返回 trueonTouchEvent()方法。任何View “可点击”返回 true对于任何 MotionEvent ,并设置OnClickListener对于View使其可点击。

现在,第一 react 可能是创建 OnTouchListener.onTouch()方法返回true对于部分或全部case声明。但这要么使ViewPager拦截全部 MotionEvent回调,或者不提供您想要的功能。

正确的实现是子类 ViewPager并覆盖 onInterceptTouchEventonTouchEvent方法。关键是不返回trueMotionEvent.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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com