android首页滑动切换

很多软件会选择左右滑动的主界面,实现方式也很多,这里的仅供参考,勿喷。

不多说什么了,相信大家看看代码就明白,自己也不善言辞,望大家谅解。


自定义接口,监听滑动翻页事件:

/** 滑动后翻页事件 */
public interface OnViewChangedListener {
	public void OnViewChanged(int viewId);
}

滑动翻页view(滑动翻页不是很灵敏):

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.PointF;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
import android.widget.FrameLayout;
import android.widget.Scroller;

public class ScrollerView extends FrameLayout {
	private Scroller scroller;
	private Drawable drawable;

	private OnViewChangedListener listener;

	public ScrollerView(Context context) {
		this(context, null, 0);
	}

	public ScrollerView(Context context, AttributeSet attrs) {
		this(context, attrs, 0);
	}

	public ScrollerView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		scroller = new Scroller(context);
	}

	private PointF last = new PointF();
	private final int TOUCH_SLOP = ViewConfiguration.get(getContext())
			.getScaledTouchSlop();

	@Override
	public boolean onInterceptTouchEvent(MotionEvent event) {
		final int x = (int) event.getX();
		boolean flag = false;

		switch (event.getAction()) {
		case MotionEvent.ACTION_DOWN:
			last.x = x;
			break;
		case MotionEvent.ACTION_MOVE:
			final int deltaX = (int) (last.x - x);
			if (Math.abs(deltaX) > TOUCH_SLOP) {
				flag = true;
			}
			break;
		case MotionEvent.ACTION_UP:
			break;
		}
		return flag;
	}

	public boolean onTouchEvent(MotionEvent event) {
		final int x = (int) event.getX();
		final int width = getWidth();

		switch (event.getAction()) {
		case MotionEvent.ACTION_DOWN:
			if (!scroller.isFinished()) {
				scroller.abortAnimation();
			}

			break;
		case MotionEvent.ACTION_MOVE:
			final int deltaX = (int) (last.x - x);
			if (Math.abs(deltaX) < TOUCH_SLOP) {
				break;
			}
			last.x = x;
			if (deltaX < 0) {
				if (getScrollX() > 0) {
					scrollBy(Math.max(-getScrollX(), deltaX), 0);
				}
			} else if (deltaX > 0) {
				final int availableToScroll = getChildAt(getChildCount() - 1)
						.getRight() - getScrollX() - getWidth();
				if (availableToScroll > 0) {
					scrollBy(Math.min(availableToScroll, deltaX), 0);
				}
			}

			break;
		case MotionEvent.ACTION_UP:
		case MotionEvent.ACTION_CANCEL:
			final OnViewChangedListener changedListener = listener;
			int dx = (getScrollX() + width / 2) / width;
			if (dx < 0) {
				dx = 0;
			}
			if (dx > getChildCount() - 1) {
				dx = getChildCount() - 1;
			}
			changedListener.OnViewChanged(dx);
			dx *= width;
			dx -= getScrollX();
			scroller.startScroll(getScrollX(), 0, dx, 0, Math.abs(dx) * 3);
			break;
		}
		invalidate();
		return true;
	}

	@Override
	protected void onLayout(boolean changed, int l, int t, int r, int b) {
		final int width = getWidth();
		final int count = getChildCount();
		int height = getHeight();
		int childLeft = 0;
		for (int i = 0; i < count; i++) {
			final View child = getChildAt(i);
			child.layout(childLeft, 0, childLeft + width, height);
			childLeft += width;
		}
	}

	@Override
	public void setBackgroundDrawable(Drawable d) {
		super.setBackgroundDrawable(drawable);
		drawable = d;
		super.setBackgroundDrawable(null);
	}

	@Override
	protected void dispatchDraw(Canvas canvas) {
		if (null != drawable) {
			drawable.setBounds(0, 0, getChildCount() * getWidth(), getHeight());
			drawable.draw(canvas);
		}
		super.dispatchDraw(canvas);
	}

	@Override
	public void computeScroll() {
		if (scroller.computeScrollOffset()) {
			scrollTo(scroller.getCurrX(), scroller.getCurrY());
			invalidate();
		}
	}

	/** 设置滑动后翻页事件监听 */
	public void setOnViewChangedListener(OnViewChangedListener listener) {
		this.listener = listener;
	}

}

主Activity:

import android.app.Activity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Window;
import android.widget.ImageView;

public class MainActivity extends Activity implements OnViewChangedListener {
	private ScrollerView container;
	private View view_1, view_2;
	private ImageView imgLeft, imgRight;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.main);
		initView();
	}

	private void initView() {
		LayoutInflater inflater = LayoutInflater.from(this);
		container = (ScrollerView) findViewById(R.id.main_container);
		container.setOnViewChangedListener(this);

		imgLeft = (ImageView) findViewById(R.id.img_left);
		imgRight = (ImageView) findViewById(R.id.img_right);

		view_1 = inflater.inflate(R.layout.layout_view_1, null);
		view_2 = inflater.inflate(R.layout.layout_view_2, null);

		container.addView(view_1);
		container.addView(view_2);
	}

	@Override
	public void OnViewChanged(int viewId) {
		switch (viewId) {
		case 0:
			imgLeft.setImageResource(R.drawable.main_icon_check);
			imgRight.setImageResource(R.drawable.main_icon_normal);
			break;
		case 1:
			imgLeft.setImageResource(R.drawable.main_icon_normal);
			imgRight.setImageResource(R.drawable.main_icon_check);
			break;
		}
	}

}

代码下载: http://download.csdn.net/detail/luck_apple/4210615



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值