ViewFlipper中放入两个ListView不能拖动的情况

来源:互联网 发布:许昌长葛淘宝招聘网 编辑:程序博客网 时间:2024/05/27 20:26

ViewFlipper可以帮助我们实现换屏的功能,如果我们在ViewFlipper中放入GridView或者ListView我们发现就无法实现了换屏操作,这个主要是因为GridView的onTouchEvent将事件全部拦截了,所以我们在ViewFlipper中无法监听到onTouchEvent,所以我们要根据用户的手势来判断是否要在ViewFlipper中去拦截onTouchEvent。拦截onTouchEvent的事件很简单就是在ViewFlipper的onInterrceptTouchEvent中返回true这样下面的事件都会经过ViewFlipper中onTouchEvent。

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >    <com.xqq.view.MyViewFlipper         android:layout_width="fill_parent"        android:layout_height="fill_parent"        android:id="@+id/fipper">        <FrameLayout              android:layout_width="fill_parent"             android:layout_height="fill_parent">             <com.xqq.view.MyGridView                   android:layout_width="fill_parent"                  android:layout_height="fill_parent"                  android:background="#ff2341"                  android:id="@+id/gv1"                  ></com.xqq.view.MyGridView>        </FrameLayout>        <FrameLayout              android:layout_width="fill_parent"             android:layout_height="fill_parent">             <com.xqq.view.MyGridView                  android:layout_width="fill_parent"                 android:layout_height="fill_parent"                 android:background="#cf2342"                 android:id="@+id/gv2"></com.xqq.view.MyGridView>        </FrameLayout>    </com.xqq.view.MyViewFlipper>    </LinearLayout>


MyViewFlipper.java

import com.xqq.DragActivity.GestureListenerAdapter;import com.xqq.DragActivity.R;import com.xqq.DragActivity.R.anim;import android.content.Context;import android.util.AttributeSet;import android.util.Log;import android.view.GestureDetector;import android.view.MotionEvent;import android.widget.ViewFlipper;public class MyViewFlipper extends ViewFlipper {    private static final String TAG="MyViewFlipper";private static final float SCROLL_CRISIS=1f;  //滑动的临界正选值private static final int TOUCH_STATE_REST=0;  //滑动重置private static final int TOUCH_STATE_SCROLLING=1; //正在滑动中private int mLastX;        private int mLastY;private int mFirstX,mFirstY;private int mTouchState=TOUCH_STATE_REST;                      //滑动的状态private boolean mIsFirst=false;private GestureDetector mGestureDetector;public MyViewFlipper(Context context, AttributeSet attrs) {super(context, attrs);mGestureDetector=new GestureDetector(new MyGestureListener());}public MyViewFlipper(Context context) {super(context);}@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) {/*if(ev.getAction()==MotionEvent.ACTION_MOVE && (mTouchState!=TOUCH_STATE_REST)){return true;}*/switch(ev.getAction()){case MotionEvent.ACTION_MOVE:Log.d(TAG, "xqq_move1");float distanceX=Math.abs((int)ev.getX()-mLastX);float distanceY=Math.abs((int)ev.getY()-mLastY);if(distanceY/distanceX<SCROLL_CRISIS){Log.d(TAG, "xqq_move2");mTouchState=TOUCH_STATE_SCROLLING;}break;case MotionEvent.ACTION_DOWN:mLastX=(int) ev.getX();mLastY=(int) ev.getY();mTouchState=TOUCH_STATE_REST;Log.d(TAG, "onInterceptTouchEvent_actiondown_x="+ev.getX());mFirstX=(int) ev.getX();mFirstY=(int) ev.getY();break;case MotionEvent.ACTION_UP:mTouchState=TOUCH_STATE_REST;break;}Log.d(TAG, "xqq_isTrue="+(mTouchState!=TOUCH_STATE_REST));return mTouchState!=TOUCH_STATE_REST;}private class MyGestureListener extends GestureListenerAdapter{@Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) {    if(e2.getX()>mFirstX){    Log.d(TAG, "showPervious()");    setInAnimation(getContext(),R.anim.slide_in_right);    setOutAnimation(getContext(),R.anim.slide_out_left);    showPrevious();    }else if(mFirstX>e2.getX()){    setInAnimation(getContext(),R.anim.slide_in_left);    setOutAnimation(getContext(),R.anim.slide_out_right);    Log.d(TAG, "showNext()");    showNext();    }return true;}}@Overridepublic boolean onTouchEvent(MotionEvent event) {switch(event.getAction()){case MotionEvent.ACTION_DOWN:Log.d(TAG, "xqq_ACTION_DOWN");break;case MotionEvent.ACTION_MOVE:Log.d(TAG, "onTouchEvent_move_e.x="+event.getX());break;}        return mGestureDetector.onTouchEvent(event);}}


FlipperActivity.java

import com.xqq.view.MyGridView;import com.xqq.view.MyViewFlipper;import android.app.Activity;import android.os.Bundle;import android.util.Log;import android.view.GestureDetector;import android.view.LayoutInflater;import android.view.MotionEvent;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.GridView;import android.widget.TextView;import android.widget.ViewFlipper;public class FlipperActivity extends Activity{private static final String TAG="FlipperActivity";private MyViewFlipper mViewFlipper;private String [] listStr1={"中国","日本","韩国","美国","加拿大"};private String [] listStr2={"北京","上海","江苏","浙江","山东"};private MyGridView mGridView1;private MyGridView mGridView2;    @Override    protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.layout_fillper);    mViewFlipper=(MyViewFlipper)findViewById(R.id.fipper);    mGridView1=(MyGridView) findViewById(R.id.gv1);    mGridView2=(MyGridView) findViewById(R.id.gv2);    MyAdapter adapter1=new MyAdapter(listStr1);    MyAdapter adapter2=new MyAdapter(listStr2);    mGridView1.setAdapter(adapter1);    mGridView2.setAdapter(adapter2);        }            private class MyAdapter extends BaseAdapter{            class Holder{    TextView tvBookName;    }        private String [] list;        public MyAdapter(String[] list) {super();this.list = list;}@Overridepublic int getCount() {return list.length;}@Overridepublic Object getItem(int position) {return list[position];}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {Holder holder=null;if(convertView==null){convertView=LayoutInflater.from(FlipperActivity.this).inflate(R.layout.gridview_item, null);holder=new Holder();holder.tvBookName=(TextView) convertView.findViewById(R.id.tv_bookName);convertView.setTag(holder);}else{    holder=(Holder) convertView.getTag();}holder.tvBookName.setText(list[position]);return convertView;}        }    }


 

原创粉丝点击