Android编程实现的首页左右滑动切换功能示例
发布时间 - 2026-01-11 02:22:31 点击率:次本文实例讲述了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
# 首页
# 左右滑动
# 切换
# Android App中使用ViewPager+Fragment实现滑动切换效果
# Android开发之使用ViewPager实现图片左右滑动切换效果
# Android编程实现ViewPager多页面滑动切换及动画效果的方法
# Android实现界面左右滑动切换功能
# Android启动屏实现左右滑动切换查看功能
# Android实现微信首页左右滑动切换效果
# Android应用中利用ViewPager实现多页面滑动切换效果示例
# Android Listview上下拉动刷新tab滑动切换功能
# Android编程实现左右滑动切换背景的方法
# Android中的ViewPager视图滑动切换类的入门实例教程
# Android使用TabLayou+fragment+viewpager实现滑动切换页面效果
# Android ViewPager撤消左右滑动切换功能实现代码
# 翻页
# 进阶
# 相关内容
# 不多
# 不是很
# 感兴趣
# 给大家
# 自定义
# 点击此处
# 更多关于
# 解决方法
# 所述
# 程序设计
# 仅供参考
# 操作技巧
# 讲述了
# 说什么了
# defStyle
# attrs
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Linux后台任务运行方法_nohup与&使用技巧【技巧】
Swift中swift中的switch 语句
js实现获取鼠标当前的位置
最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?
Laravel怎么判断请求类型_Laravel Request isMethod用法
阿里云高弹*务器配置方案|支持分布式架构与多节点部署
Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)
Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全
Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】
Laravel如何实现事件和监听器?(Event & Listener实战)
Laravel怎么实现微信登录_Laravel Socialite第三方登录集成
javascript如何操作浏览器历史记录_怎样实现无刷新导航
消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工
Python自动化办公教程_ExcelWordPDF批量处理案例
Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程
java获取注册ip实例
无锡营销型网站制作公司,无锡网选车牌流程?
Laravel路由怎么定义_Laravel核心路由系统完全入门指南
Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程
Laravel如何从数据库删除数据_Laravel destroy和delete方法区别
Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优
Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】
在Oracle关闭情况下如何修改spfile的参数
Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】
如何获取PHP WAP自助建站系统源码?
Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】
Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】
Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】
黑客如何通过漏洞一步步攻陷网站服务器?
php静态变量怎么调试_php静态变量作用域调试技巧【解答】
Laravel如何实现模型的全局作用域?(Global Scope示例)
Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】
html如何与html链接_实现多个HTML页面互相链接【互相】
如何在宝塔面板中修改默认建站目录?
如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】
html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】
弹幕视频网站制作教程下载,弹幕视频网站是什么意思?
详解jQuery中基本的动画方法
Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比
免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?
Java解压缩zip - 解压缩多个文件或文件夹实例
简历没回改:利用AI润色让你的文字更专业
Laravel怎么在Blade中安全地输出原始HTML内容
如何打造高效商业网站?建站目的决定转化率
javascript中对象的定义、使用以及对象和原型链操作小结
JavaScript实现Fly Bird小游戏
详解MySQL数据库的安装与密码配置
北京网站制作公司哪家好一点,北京租房网站有哪些?
phpredis提高消息队列的实时性方法(推荐)
Laravel如何使用Telescope进行调试?(安装和使用教程)

