在我的应用程序中,我有一个listView。我有一个ViewFlipper,它是ListView的标题。
我希望ViewFlipper在用户触摸并滑动时切换视图。此外,ViewFlipper的项目是可点击的。 我的问题是我的ListView也可以滚动,但是垂直,可点击。
这是一个架构:
首先,我尝试使用OnTouchEvent。它不起作用,因为即使用户触摸ViewFlipper的屏幕OUT,也会调用该方法。
现在,如果我使用OuTouchListener,我无法拦截用户的手势,我无法理解。
以下是listView标题的XML代码示例:
<ViewFlipper
android:id="@+id/flipune"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="3" >
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<ImageButton
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/itemviewflipper1"
android:layout_width="wrap_content"
android:layout_height="150dp"
android:background="@android:color/transparent"
android:contentDescription="@string/stritemviewflipper" />
<TextView
android:id="@+id/titreviewflipper1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/itemviewflipper1"
android:background="#AA000000"
android:paddingTop="10dip"
android:textColor="#ffffffff"
android:textSize="12dip"
android:textStyle="bold" >
</TextView>
</RelativeLayout>
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<ImageButton
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/itemviewflipper2"
android:layout_width="wrap_content"
android:layout_height="150dp"
android:background="@android:color/transparent"
android:contentDescription="@string/stritemviewflipper" />
<TextView
android:id="@+id/titreviewflipper2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/itemviewflipper2"
android:background="#AA000000"
android:paddingTop="10dip"
android:textColor="#ffffffff"
android:textStyle="bold" >
</TextView>
</RelativeLayout>
[...]
</ViewFlipper>
我在活动中定义了OnTouchListener:
viewFlipper.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent touchevent) {
switch (touchevent.getAction()) {
case MotionEvent.ACTION_DOWN: {
oldTouchValue = touchevent.getX();
break;
}
case MotionEvent.ACTION_UP: {
float currentX = touchevent.getX();
if (touchevent.getY() < metrics.heightPixels / 3) {
if (!viewFlipper.isPressed() && oldTouchValue == currentX) {
openDescriptionArticle(index);
} else {
if (oldTouchValue < currentX) {
viewFlipper.setInAnimation(AnimationHelper
.inFromLeftAnimation());
viewFlipper.setOutAnimation(AnimationHelper
.outToRightAnimation());
viewFlipper.showPrevious();
if (index > 0) {
index--;
} else {
index= 4;
}
}
if (oldTouchValue > currentX) {
viewFlipper.setInAnimation(AnimationHelper
.inFromRightAnimation());
viewFlipper.setOutAnimation(AnimationHelper
.outToLeftAnimation());
viewFlipper.showNext();
if (index < 4) {
index++;
} else {
index = 0;
}
}
}
}
break;
}
}
return false;
}
});
答案 0 :(得分:0)
在我的情况下,HorizontalPager
标题内有一个ListView
。 ListView抓取触摸事件和寻呼机冻结。
我通过使用ListView
选项实施自定义scrollingEnabled
来解决了这个问题。
public class StoppableListView extends ListView {
public boolean scrollingEnabled = true;
YourActivity parent;
public StoppableListView(Context context) { super(context); parent = (CalendarActivity)context; }
public StoppableListView(Context context, AttributeSet attrs) { super(context, attrs); parent = (CalendarActivity)context; }
public StoppableListView(Context context, AttributeSet attrs, int defStyle) { super(context,attrs); parent = (CalendarActivity)context; }
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (scrollingEnabled) return super.dispatchTouchEvent(ev);
// dispatch touch event to your view
else return parent.yourView.dispatchTouchEvent(ev);
}
}
当寻呼机处于活动状态时,我设置listView.scrollingEnabled = false
并将事件正确分派到寻呼机。