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