我有一个用于水平滚动的自定义库视图和几个子视图,它们都应该是可点击的。
设置childview.setOnClickListener()
不起作用,因为它总是消耗触摸事件。
因此,我使用childview.setOnTouchListener()
并让它的onTouch 方法返回false,这样Gallery 就可以滚动了。
这一切都很好。
现在的问题是,childView 的 onTouch 方法只触发ACTION_DOWN事件。除非我通过设置使 View 可点击,否则它不会传递MotionEvent ACTION_UPchildview.setClickable()
。但是,设置 View clickable 本身似乎会消耗 onTouch 事件,因此画廊 View 变得不可滚动。
好像我在这里转了一圈。我会很感激任何帮助。
这是我的代码
画廊视图:
public class myGallery extends Gallery {
public myGallery(Context ctx, AttributeSet attrSet) {
super(ctx, attrSet);
// TODO Auto-generated constructor stub
}
private boolean isScrollingLeft(MotionEvent e1, MotionEvent e2){
return e2.getX() > e1.getX();
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY){
int kEvent;
if(isScrollingLeft(e1, e2)){ //Check if scrolling left
kEvent = KeyEvent.KEYCODE_DPAD_LEFT;
}else{ //Otherwise scrolling right
kEvent = KeyEvent.KEYCODE_DPAD_RIGHT;
}
onKeyDown(kEvent, null);
return true;
}
}
在我的活动中:
gallery.setOnItemSelectedListener(new OnItemSelectedListener(){
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
// childView.setClickable(true); // can't use this
// click event would get consumed
// and gallery would not scroll
// therefore, I can only use the ACTION_DOWN event below:
childView.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
//doStuff();
}
return false;
}
});
}
public void onNothingSelected(AdapterView<?> arg0) {}
});
}