码迷,mamicode.com
首页 > 移动开发 > 详细

android 自定义ViewPager

时间:2015-07-31 09:11:46      阅读:118      评论:0      收藏:0      [点我收藏+]

标签:

package com.rong.activity;

import android.content.Context;
import android.graphics.Color;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.Scroller;

public class CustomViewPager extends ViewGroup {
	private Context mContext;
	private int screenWidth;
	private int screenHight;
	private int lastMoveX = 0;
	private VelocityTracker velocityTracker;
	private int MAX_VELOCITY=600;
	private int curScreen=0;
	private Scroller scroller;

	public CustomViewPager(Context context) {
		super(context);
		mContext = context;
		initView();
	}

	public CustomViewPager(Context context, AttributeSet attrs) {
		super(context, attrs);
		mContext = context;
		initView();
	}

	public CustomViewPager(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		mContext = context;
		initView();
	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		if (velocityTracker == null) {
			velocityTracker = VelocityTracker.obtain();
		}
		velocityTracker.addMovement(event);

		int x = (int) event.getX();
		switch (event.getAction()) {
		case MotionEvent.ACTION_DOWN:
			lastMoveX = x;
			break;
		case MotionEvent.ACTION_MOVE:
			int dis = lastMoveX - x;
			scrollBy(dis, 0);
			lastMoveX = x;
			break;
		case MotionEvent.ACTION_UP:
			velocityTracker.computeCurrentVelocity(1000);
			int velocityX=(int)velocityTracker.getXVelocity();
			if(velocityX>MAX_VELOCITY&&curScreen>0){
				jump2Screen(curScreen-1);
			}else if(velocityX<-MAX_VELOCITY&&curScreen<getChildCount()-1){
				jump2Screen(curScreen+1);
			}else{
				int screen=(getScrollX()+screenWidth/2)/screenWidth;
				jump2Screen(screen);
			}
			
			if (velocityTracker != null) {
				velocityTracker.recycle();
				velocityTracker = null;
			}
			break;
		}
		return true;
	}

	/**
	 * 跳转到指定Screen
	 * @param screen
	 */
	public void jump2Screen(int screen){
		curScreen=screen;
		if(curScreen>getChildCount()-1){
			curScreen=getChildCount()-1;
		}
		int dis=curScreen*screenWidth-getScrollX();
		scroller.startScroll(getScrollX(), 0, dis, 0);
		invalidate();
	}
	
	@Override
	public void computeScroll() {
		if(scroller.computeScrollOffset()){
			scrollTo(scroller.getCurrX(), 0);
			postInvalidate();
		}
	}

	public void initView() {
		scroller=new Scroller(mContext);
		LinearLayout layout1 = new LinearLayout(getContext());
		layout1.setBackgroundColor(Color.RED);
		addView(layout1);
		LinearLayout layout2 = new LinearLayout(getContext());
		layout2.setBackgroundColor(Color.GREEN);
		addView(layout2);
		LinearLayout layout3 = new LinearLayout(getContext());
		layout3.setBackgroundColor(Color.BLUE);
		addView(layout3);
	}

	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		super.onMeasure(widthMeasureSpec, heightMeasureSpec);
		screenWidth = MeasureSpec.getSize(widthMeasureSpec);
		screenHight = MeasureSpec.getSize(heightMeasureSpec);
		setMeasuredDimension(screenWidth, screenHight);
		for (int i = 0; i < getChildCount(); i++) {
			View view = getChildAt(i);
			view.measure(screenWidth, screenHight);
		}
	}

	@Override
	protected void onLayout(boolean changed, int l, int t, int r, int b) {
		int leftWidth = 0;
		for (int i = 0; i < getChildCount(); i++) {
			View view = getChildAt(i);
			view.layout(leftWidth, 0, leftWidth + screenWidth, screenHight);
			leftWidth = leftWidth + screenWidth;
		}
	}

}


android 自定义ViewPager

标签:

原文地址:http://my.oschina.net/547217475/blog/485917

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!