0

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

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

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

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

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

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

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

4

1 回答 1

0

正确的,

不知道您是否对此进行了分类,我已经将一些东西捣碎在一起,我想按您的要求做,如果没有,那么嘿嘿。

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

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());

并且引用了所有重要的 parentActivity 的 MyGestureDetector 嵌套类是这样的:

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;
        }
}

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

于 2011-12-08T05:40:22.273 回答