Android 判断ListView滑动方向

代码很简单,给mListView监听onScrollListener事件,然后在onScroll进行判断

//listView中第一项的索引
	private int mListViewFirstItem = 0;
	//listView中第一项的在屏幕中的位置
	private int mScreenY = 0;
	//是否向上滚动
	private boolean mIsScrollToUp = false;
	
	@Override
	public void onScroll(AbsListView absListView, int firstVisibleItem,int visibleItemCount, int totalItemCount) {
	
		if(mListView.getChildCount()>0)
		{
			boolean isScrollToUp = false;
			View childAt = mListView.getChildAt(firstVisibleItem);
			int[] location = new int[2];
			childAt.getLocationOnScreen(location);
			Log.d("onScroll", "firstVisibleItem= "+firstVisibleItem+" , y="+location[1]);
			
			if(firstVisibleItem!=mListViewFirstItem)
			{
				if(firstVisibleItem>mListViewFirstItem)
				{
					Log.e("--->", "向上滑动");
					isScrollToUp = true;
				}else{
					Log.e("--->", "向下滑动");
					isScrollToUp = false;
				}
				mListViewFirstItem = firstVisibleItem;
				mScreenY = location[1];
			}else{
				if(mScreenY>location[1])
				{
					Log.i("--->", "->向上滑动");
					isScrollToUp = true;
				}
				else if(mScreenY<location[1])
				{
					Log.i("--->", "->向下滑动");
					isScrollToUp = false;
				}
				mScreenY = location[1];
			}
			
			if(mIsScrollToUp!=isScrollToUp)
			{
				onScrollDirectionChanged(mIsScrollToUp);
			}
			
		}
	}
	private void onScrollDirectionChanged(boolean isScrollToUp) 
	{
		
	}

-------使用ListView构建垂直滚动的View-------------

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AbsListView.LayoutParams;
import android.widget.AbsListView.OnScrollListener;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
import android.widget.ListView;

public class CardListActivity extends ActionBarActivity implements OnScrollListener {
	
	private ListView mListView = null;
	
	private Activity activity = null;
	
	private DisplayMetrics screenMetrics = null;
	
	private CardListAdapter mCardListAdapter = null;
	
	//listView中第一项的索引
    private int mListViewFirstItem = -1;
    //listView中第一项的在屏幕中的位置
    private int mScreenY = 0;
	
	private int screenHeight = 0;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.simple_listview);
		
		activity  = this;
	
		mListView = (ListView) findViewById(R.id.app_listView);
		
		screenMetrics = getResources().getDisplayMetrics();
		screenHeight = screenMetrics.heightPixels-getStatusBarHeight();
		
		initDataAndView();
	}
	
	private void initDataAndView() 
	{
		mCardListAdapter = new CardListAdapter();
		List<View> viewItems = mCardListAdapter.getViewItems();
		
		for (int i = 0; i <= 3; i++)
		{
			int resId = activity.getResources().getIdentifier("slide_img_"+i, "drawable", getPackageName());
			viewItems.add(createImageView(resId));
		}
		mListView.setAdapter(mCardListAdapter);
		mCardListAdapter.notifyDataSetChanged();
		mListView.setOnScrollListener(this);
	}
	
	public class CardListAdapter extends BaseAdapter{

		private final List<View> viewItems = new ArrayList<View>();
		
		public List<View> getViewItems() 
		{
			return viewItems;
		}
		
		@Override
		public int getCount() {
			return viewItems.size();
		}

		@Override
		public Object getItem(int position) {
			return viewItems.get(position);
		}

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

		@Override
		public View getView(int position, View convertView, ViewGroup parent) 
		{
			return viewItems.get(position);
		}
		
	}
	
	/**
	 * 图片二次采样
	 * @param resId
	 * @return
	 */
	private Bitmap sampleSizeBitmap(int resId)
	{
		BitmapFactory.Options opts = new BitmapFactory.Options();
		opts.inJustDecodeBounds = true;
		Bitmap bitmap = BitmapFactory.decodeResource(getResources(), resId, opts);
		opts.inSampleSize = calculateInSampleSize(opts, screenMetrics.widthPixels, screenMetrics.heightPixels);
		opts.inJustDecodeBounds = false;
		if(bitmap!=null)
		{
			bitmap.recycle();
		}
		
		return BitmapFactory.decodeResource(getResources(), resId, opts);
	}
	
	public  static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) 
	{
	    final int height = options.outHeight;
	    final int width = options.outWidth;
	    int inSampleSize = 1;
	
	    if (height > reqHeight || width > reqWidth) {
	
	        final int heightRatio = Math.round((float) height / (float) reqHeight);
	        final int widthRatio = Math.round((float) width / (float) reqWidth);
	
	        inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
	    }
	
	    return inSampleSize;
	}
	
	/**
	 * 创建图片视图
	 * @param resId
	 * @return
	 */
	private ImageView createImageView(int resId) 
	{
		ImageView iv = new ImageView(this);
		LayoutParams lp = (LayoutParams) iv.getLayoutParams();
		
		if(lp==null)
		{
			lp = new LayoutParams(LayoutParams.MATCH_PARENT,screenHeight);
		}else{
			lp.width = LayoutParams.MATCH_PARENT;
			lp.height = screenHeight;
		}
		iv.setLayoutParams(lp);
		iv.setScaleType(ScaleType.CENTER);
		iv.setImageBitmap(sampleSizeBitmap(resId));
		return iv;
	}
	
	private int getStatusBarHeight() 
	{
        int result = 0;
        int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
        if (resourceId > 0) {
            result =  getResources().getDimensionPixelSize(resourceId);
        }
        return result;
    }

    
	@Override
	public void onScrollStateChanged(AbsListView view, int scrollState) 
	{
		if(mListViewFirstItem==-1)
		{
			return;
		}
		if (SCROLL_STATE_IDLE==scrollState || SCROLL_STATE_FLING==scrollState)
		{
			if(Math.abs(mScreenY)-(screenHeight*3)/5>0)
			{
				mListView.smoothScrollToPosition(mListViewFirstItem+1);
				
			}else{
				mListView.smoothScrollToPosition(mListViewFirstItem);
			}
			
		}
	}

	@Override
	public void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) 
	{
			if(mListView.getAdapter()==null || mListView.getChildCount()==0)
	        {
				return;
	        }
		   View visibleFirstChild = (View) mListView.getAdapter().getItem(firstVisibleItem);
           if(visibleFirstChild==null)
           {
        	   return;
           }
            int[] location = new int[2];
            visibleFirstChild.getLocationOnScreen(location);
            Log.d("onScroll", "first="+firstVisibleItem+" , screenY="+location[1]+",deltY="+(Math.abs(mScreenY)-(screenHeight*3)/5));
             
            if(firstVisibleItem!=mListViewFirstItem)
            {
                if(firstVisibleItem>mListViewFirstItem)
                {
                    Log.i("=======>", "向上滑动");
                }else{
                    Log.e("--->", "向下滑动");
                }
            }else{
                if(mScreenY>location[1])
                {
                    Log.i("=======>", "->向上滑动");
                }
                else if(mScreenY<location[1])
                {
                    Log.e("--->", "->向下滑动");
                }
            }
            mListViewFirstItem = firstVisibleItem;
            mScreenY = location[1];
            
	}
}


你可能感兴趣的:(Android 判断ListView滑动方向)