Java 如何使用ViewPager OnTouchListener,其中包含ImageView,它还具有OnClickListener

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

我有一个ViewPager,它有4个页面,页面将使用runable和handler保持滑动…每个页面都包含一个ImageView,ImageView onClickListener事件在适配器中设置

初始化时,ViewPager已设置OnTouchListener事件

我将ViewPager OnTouchListener事件设置为当用户触摸ViewPager时停止滑动,当用户松开手指时继续滑动

以下是如何将ViewPager设置为TouchListener事件:

    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框架如何处理触摸事件,我还强烈建议您观看