Android 是否可以长按水平滚动视图的子项?

Android 是否可以长按水平滚动视图的子项?,android,horizontalscrollview,Android,Horizontalscrollview,基于水平滚动视图,我在自定义视图中实现长按时遇到问题 水平滚动视图有一个子线性布局,该子视图又有一个子视图。视图通过OnDraw()将位图绘制到画布 我想让水平滚动视图正常滚动,可以快速滚动,也可以慢速滚动。但是,如果用户在其中一个图像上按住手指(即使滚动),它将立即取消滚动,并允许用户对所选图像执行功能。(在这种特殊情况下,他们会在屏幕上移动图像,但实际上可能有很多功能。) 我在每一层(HorizontalScrollView和View)中尝试了许多处理事件的组合(true、false、sup

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

水平滚动视图
有一个子
线性布局
,该子视图又有一个子视图。视图通过
OnDraw()
将位图绘制到画布

我想让
水平滚动视图
正常滚动,可以快速滚动,也可以慢速滚动。但是,如果用户在其中一个图像上按住手指(即使滚动),它将立即取消滚动,并允许用户对所选图像执行功能。(在这种特殊情况下,他们会在屏幕上移动图像,但实际上可能有很多功能。)

我在每一层(
HorizontalScrollView
View
)中尝试了许多处理事件的组合(true、false、super),但似乎没有一个是100%有效的。有些组合在大多数情况下都能实现,有些组合则是其中的一部分,但它们似乎总是缺少一个或另一个功能(滚动、点击测试等)

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

如果我在视图的
onTouch()
事件中返回true,命中测试将注册,并且我能够检查用户是否在
操作\u MOVE
中长时间按下图像。但是,
水平滚动视图
不会滚动

我是否遗漏了一些非常明显的东西,或者我只是选择了两种观点,它们不能很好地结合在一起?任何见解都值得赞赏。

不知道你是否已经整理好了,我已经把一些碎片拼凑在一起,我想按照你的要求去做,如果没有,那么嘿嘿

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

HolderActivity类(在HorizontalScrollView类中加载的类)我有:

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

public void setFeatureItems(ArrayList<MyListEntity> items){}
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;
        }
}
类MyGestureDetector扩展了SimpleGestureListener{
@凌驾
public void onLongPress(运动事件arg0){
parentActivity.onLongClick(MyScroller.this,mActiveFeature);
};
@凌驾
公共布尔onSingleTapUp(运动事件arg0){
parentActivity.onItemClick(mActiveFeature);
返回true;
};
@凌驾
公共布尔onFling(MotionEvent e1、MotionEvent e2、float-velocityX、float-velocityY){
试一试{
//从右向左
if(e1.getX()-e2.getX()>滑动最小距离和&Math.abs(速度x)>滑动阈值速度){
int featureWidth=getMeasuredWidth();
mActiveFeature=(mActiveFeature<(mItems.size()-1))?mActiveFeature+1:mItems.size()-1;
smoothScrollTo(mActiveFeature*featureWidth,0);
返回true;
}
//从左到右
else if(e2.getX()-e1.getX()>swip\u MIN\u DISTANCE&&Math.abs(velocityX)>swip\u THRESHOLD\u VELOCITY){
int featureWidth=getMeasuredWidth();
mActiveFeature=(mActiveFeature>0)?mActiveFeature-1:0;
smoothScrollTo(mActiveFeature*featureWidth,0);
返回true;
}
}捕获(例外e){
Log.e(“Fling”,“处理Fling事件时出错:”+e.getMessage());
}
返回false;
}
}
我已经从一个现有的项目中删减了这个,所以可能会有一些我没有使它足够通用的地方,我希望这是有意义的或有帮助的,如果我可以添加更多的细节,请告诉我

public void setFeatureItems(ArrayList<MyListEntity> items){}
mGestureDetector = new GestureDetector(context, new 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;
        }
}