我有一个ViewFlipper,我想设置一个touchListener。它在ScrollView内部(在ViewFlipper下方有更多UI元素),我希望如果用户进行垂直移动,则滚动视图起作用,而当用户进行水平移动时,ViewFlipper起作用。 (这些组件是在ViewFlipper中动态添加的。)
为澄清起见,这是布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/parentrl">
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content">
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ViewFlipper
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/vflipper"
android:layout_marginStart="20dp"
android:layout_marginEnd="20dp"
android:layout_marginTop="20dp"
android:background="@drawable/flightcomponentborder">
</ViewFlipper>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/inforecogida"
android:layout_marginStart="10dp"
android:layout_marginTop="10dp"
android:text="@string/inforecogida"
android:textColor="@color/actionbardefaultcolor"
android:layout_below="@+id/vflipper"/>
<ImageView
android:layout_width="match_parent"
android:layout_height="2dp"
android:layout_below="@+id/inforecogida"
android:id="@+id/separador"
android:background="@color/gris"
android:layout_marginTop="10dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/personaheader"
android:layout_below="@+id/separador"
android:layout_marginTop="10dp"
android:layout_alignStart="@+id/inforecogida"
android:text="@string/persona"
android:textColor="@color/actionbardefaultcolor"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/persona"
android:layout_below="@+id/personaheader"
android:layout_alignStart="@+id/inforecogida"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/infotext"
android:layout_alignStart="@+id/inforecogida"
android:layout_below="@+id/persona"
android:text="@string/infotext"
android:textStyle="italic"/>
</RelativeLayout>
</ScrollView>
</RelativeLayout>
这是我要添加到ViewFlipper的TouchListener:
parentListener = new View.OnTouchListener(){
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getActionMasked();
switch (action) {
case MotionEvent.ACTION_DOWN:
startX = event.getX();
startY = event.getRawY();
break;
case MotionEvent.ACTION_UP:
endX = event.getX();
endY = event.getRawY();
int movX;//0=swipe izq 1=swipe right
int movY;
if(startX-endX < 0){
movX=0;
Log.i("David", "Swipe left action up");
float totalPixelsX=Math.abs(startX-endX);
float totalPixelsY=event.getRawY() - startY;
Log.i("David", "totalPixelsx: "+totalPixelsX);
Log.i("David", "totalPixelsY: "+totalPixelsY);
if(totalPixelsY<0){
Log.i("David", "scroll down");
totalPixelsY=event.getRawY() - startY;
Log.i("David", "We moved "+totalPixelsY+" pixels");
}else{
Log.i("David", "scroll up");
Log.i("David", "We moved "+totalPixelsY+" pixels");
}
}else{
movX=1;
Log.i("David", "Swipe right action up");
float totalPixelsX=Math.abs(startX-endX);
float totalPixelsY=event.getRawY() - startY;
Log.i("David", "totalPixelsx: "+totalPixelsX);
Log.i("David", "totalPixelsY: "+totalPixelsY);
if(totalPixelsY<0){
Log.i("David", "scroll down");
totalPixelsY=event.getRawY() - startY;
Log.i("David", "We moved "+totalPixelsY+" pixels");
}else{
Log.i("David", "scroll up");
Log.i("David", "We moved "+totalPixelsY+" pixels");
}
}
Log.i("David", "haveFlipped false");
haveFlipped=false;
break;
case MotionEvent.ACTION_CANCEL:
endX = event.getX();
endY = event.getRawY();
if(startX-endX < 0){
movX=0;
Log.i("David", "Swipe left action cancel");
float totalPixelsX=Math.abs(startX-endX);
float totalPixelsY=event.getRawY() - startY;
Log.i("David", "totalPixelsx: "+totalPixelsX);
Log.i("David", "totalPixelsY: "+totalPixelsY);
if(totalPixelsY<0){
Log.i("David", "scroll down");
totalPixelsY=event.getRawY() - startY;
Log.i("David", "We moved "+totalPixelsY+" pixels");
}else{
Log.i("David", "scroll up");
Log.i("David", "We moved "+totalPixelsY+" pixels");
}
}else{
movX=1;
Log.i("David", "Swipe right action cancel");
float totalPixelsX=Math.abs(startX-endX);
float totalPixelsY=event.getRawY() - startY;
Log.i("David", "totalPixelsx: "+totalPixelsX);
Log.i("David", "totalPixelsY: "+totalPixelsY);
if(totalPixelsY<0){
Log.i("David", "scroll down");
totalPixelsY=event.getRawY() - startY;
Log.i("David", "We moved "+totalPixelsY+" pixels");
}else{
Log.i("David", "scroll up");
}
}
Log.i("David", "haveFlipped false");
haveFlipped=false;
break;
}
return true;
}
};
我的问题是,在手指从手机屏幕上抬起之前,action_cancel或action_up被称为,因此Y轴上的移动量始终小于手指的实际移动量。
我打算实现的目标是,当X的数量> y的数量时,使用ViewFlipper,当X的数量 我不知道我的方法是否正确。谁能告诉我为什么在举起手指之前要调用action_up和action_cancel?以及如何实现我的目标? 谢谢。
答案 0 :(得分:0)
如果ViewFlipper在其onTouch()方法上返回TRUE,则唯一的方法是创建一个扩展RelativeLayout的新类并实现其onInterceptTouchEvent()方法。
public class MyRelativeLayout extends RelativeLayout {
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return super.onInterceptTouchEvent(ev);
}
}
然后使用此MyRelativeLayout作为XML布局文件的根。
答案 1 :(得分:0)
我通过从MotionEvent.ACTION_CANCEL和MotionEvent.ACTION_UP中删除以下行来设法使其正常工作:
endX = event.getX();
endY = event.getRawY();
然后,将其添加到交换机上:
case MotionEvent.ACTION_MOVE:
endX = event.getX();
endY = event.getRawY();
break;
这样,ScrollView和ViewFlipper都可以发挥应有的作用。