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

 更新时间:2017年07月17日 10:30:29   作者:luck_apple  
这篇文章主要介绍了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相关内容感兴趣的读者可查看本站专题:《Android布局layout技巧总结》、《Android视图View技巧总结》、《Android开发入门与进阶教程》、《Android调试技巧与常见问题解决方法汇总》、《Android多媒体操作技巧汇总(音频,视频,录音等)》、《Android基本组件用法总结》及《Android控件用法总结

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

相关文章

  • Android仿淘宝首页头条View垂直滚动效果

    Android仿淘宝首页头条View垂直滚动效果

    这篇文章主要为大家详细介绍了Android仿淘宝首页头条View垂直滚动效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • Android自定义覆盖层控件 悬浮窗控件

    Android自定义覆盖层控件 悬浮窗控件

    这篇文章主要为大家详细介绍了Android自定义覆盖层控件和悬浮窗控件的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • Android轻松画出触摸轨迹

    Android轻松画出触摸轨迹

    这篇文章主要为大家详细介绍了Android轻松画出触摸轨迹的实现方法,为大家分享了一个触摸轨迹类,感兴趣的小伙伴们可以参考一下
    2016-03-03
  • android系统拍照结合android-crop裁剪图片

    android系统拍照结合android-crop裁剪图片

    这篇文章主要为大家详细介绍android系统拍照结合android-crop裁剪图片,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • Android Socket 线程连接openwrt与arduino单片机串口双向通信的实例解析

    Android Socket 线程连接openwrt与arduino单片机串口双向通信的实例解析

    这篇文章主要介绍了Android Socket 线程连接openwrt与arduino单片机串口双向通信的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-11-11
  • 利用Flutter制作一个会飞的菜单

    利用Flutter制作一个会飞的菜单

    flutter中自带了drawer组件,可以实现通用的菜单功能,所以本文将尝试一下通过自定义动画来实现一个会飞的菜单,感兴趣的可以了解一下
    2023-06-06
  • ViewPager+Fragment实现侧滑导航栏

    ViewPager+Fragment实现侧滑导航栏

    这篇文章主要为大家详细介绍了ViewPager+Fragment实现侧滑导航栏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • Android Jetpack Compose实现列表吸顶效果

    Android Jetpack Compose实现列表吸顶效果

    安卓传统的Recyclerview打造悬浮头部StickyHeader的吸顶效果,十分麻烦,而在Compose中就简单多了。因此,本文将采用Jetpack Compose实现列表吸顶效果,需要的可以参考一下
    2022-02-02
  • 基于Android studio3.6的JNI教程之ncnn之语义分割ENet

    基于Android studio3.6的JNI教程之ncnn之语义分割ENet

    这篇文章主要介绍了基于Android studio3.6的JNI教程之ncnn之语义分割ENet的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2020-03-03
  • android图片类型之间相互转换实现代码

    android图片类型之间相互转换实现代码

    这篇文章主要介绍了android图片类型之间相互转换的方法,涉及Android实现各种常用图片类型及字节类型的转换技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-10-10

最新评论