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

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);
	}
	
	@Override
	public 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{
		@Override
		public 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;
		}
	}
	
	@Override
	public 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;
		}

		@Override
		public int getCount() {
			return list.length;
		}

		@Override
		public Object getItem(int position) {
			return list[position];
		}

		@Override
		public long getItemId(int position) {
			return position;
		}

		@Override
		public 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;
		}
    	
    }
    
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值