Android 广告 滑动切换,Android编程实现的首页左右滑动切换功能示例

本文实例讲述了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;

}

}

}

附:完整实例代码点击此处本站下载。

希望本文所述对大家Android程序设计有所帮助。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值