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;
}
}
}