【问题标题】:Long press possible on child item of HorizontalScrollView?可以长按Horizo​​ntalScrollView的子项吗?
【发布时间】:2011-12-08 13:40:22
【问题描述】:

我在自定义视图中实现长按时遇到问题,基于 HorizontalScrollView

HorizontalScrollView 有一个子 LinearLayout,而 LinearLayout 又具有一个子 View。 View 通过OnDraw() 将位图绘制到画布上。

我想让HorizontalScrollView 正常滚动,无论是快还是慢。但是,如果用户在其中一个图像上握住手指(即使滚动),它将立即取消滚动并允许用户使用所选图像执行功能。 (在这种特殊情况下,他们会在屏幕上移动图像,但实际上可以是任意数量的函数。)

我尝试了很多组合来处理每一层(HorizontalScrollViewView)中的事件(真、假、超级),但似乎没有一个能 100% 有效。一些组合在大部分情况下都可以到达那里,而另一些组合在其中一部分,但它们似乎总是缺少一个或另一个功能(滚动、命中测试等)。

我得到的最接近的是在 HorizontalScrollView's onInterceptTouchEvent() 中返回 false 并在 View 的 onTouch() 事件中返回 true。这允许滚动并在图像上注册命中测试。但是,它会立即将控制权交还给HorizontalScrollView 的onTouch() 事件。这使得无法检查图像是否已按下数秒(长按)。

如果我在 View 的 onTouch() 事件中返回 true,则命中测试注册,并且我能够检查用户是否长按了 ACTION_MOVE 中的图像。但是,HorizontalScrollView 不会滚动。

我是否遗漏了一些非常明显的东西,或者我只是选择了两个不能很好地配合使用的视图?任何见解都值得赞赏。

【问题讨论】:

    标签: android horizontalscrollview


    【解决方案1】:

    对,

    不知道你有没有整理过这个,我把一些东西捣碎在一起,我想按照你的要求去做,如果没有,那么嘿嘿。

    我有一个在水平滚动条中加载的活动,这可能不是最好的方式,但它对我有用:

    HolderActivity 类(在 Horizo​​ntalScrollView 类中加载的)我有:

    int selectedItem;
    public boolean onLongClick(View v, int position) {
        selectedItem = position;
        openContextMenu(v);
        return true;
    }
    
    public boolean onItemClick(int position) {)//do what you want here on click (press)
    
    
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v,
        ContextMenuInfo menuInfo) {
    
         String[] menuItems = {"Menu item 1 text", "Cancel"};
         for (int i = 0; i<menuItems.length; i++) {
           menu.add(Menu.NONE, i, i, menuItemsRemove[i]);
        }
         menu.setHeaderTitle("My menu title");
    }
    

    在您的 Horizo​​ntalScrollView 类的构造函数中,我通过其中的上下文,如下所示:

    public MyScroller(Context context) {
        super(context);
        this.context = context;
    }
    

    我有一种方法可以从名为 setFeatureItems 的 ArrayList 创建项目,如下所示:

    public void setFeatureItems(ArrayList<MyListEntity> items){}
    

    在此方法中,我添加了一个 GestureDetector,将上下文传递给每个项目,如下所示:

    mGestureDetector = new GestureDetector(context, new MyGestureDetector());
    

    MyGestureDetector 嵌套类引用了所有重要的 parentActivity,如下所示:

    class MyGestureDetector extends SimpleOnGestureListener {
    
            @Override
            public void onLongPress(MotionEvent arg0) {
                parentActivity.onLongClick(MyScroller.this, mActiveFeature);
            };
    
            @Override
            public boolean onSingleTapUp(MotionEvent arg0) {
                parentActivity.onItemClick(mActiveFeature);
                return true;
            };
    
            @Override
            public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
                try {
                    //right to left
                    if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                        int featureWidth = getMeasuredWidth();
                        mActiveFeature = (mActiveFeature < (mItems.size() - 1))? mActiveFeature + 1:mItems.size() -1;
                        smoothScrollTo(mActiveFeature*featureWidth, 0);
                        return true;
                    }
                    //left to right
                    else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                        int featureWidth = getMeasuredWidth();
                        mActiveFeature = (mActiveFeature > 0)? mActiveFeature - 1:0;
                        smoothScrollTo(mActiveFeature*featureWidth, 0);
                        return true;
                    }
                } catch (Exception e) {
                        Log.e("Fling", "There was an error processing the Fling event:" + e.getMessage());
                }
                return false;
            }
    }
    

    我已经从现有项目中删除了这个,所以可能存在我没有让它足够通用的残余,我希望这有意义或有帮助,如果我可以添加更多细节,请告诉我

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多