Android实现View滑动的6种方式
发布时间 - 2026-01-11 01:19:06 点击率:次本文实例为大家分享了Android实现View滑动的具体方法,供大家参考,具体内容如下

1.View的滑动简介
View的滑动是Android实现自定义控件的基础,同时在开发中我们也难免会遇到View的滑动的处理。其实不管是那种滑动的方式基本思想都是类似的:当触摸事件传到View时,系统记下触摸点的坐标,手指移动时系统记下移动后的触摸的坐标并算出偏移量,并通过偏移量来修改View的坐标。
实现View滑动有很多种方法,这篇文章主要讲解六种滑动的方法,分别是:layout()、offsetLeftAndRight()与offsetTopAndBottom()、LayoutParams、动画、scollTo与scollBy和Scroller;在下一篇文章我们会详细介绍属性动画。
2.实现View滑动的六种方法
1.layout()
view进行绘制的时候会调用onLayout()方法来设置显示的位置,因此我们同样也可以通过修改View的left、top、right、bottom这四种属性来控制View的坐标。首先我们要自定义一个View,在onTouchEvent()方法中获取触摸点的坐标:
public boolean onTouchEvent(MotionEvent event) {
//获取到手指处的横坐标和纵坐标
int X = 0, newX = 0;
int Y = 0, newY = 0;
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Log.d("hahahhaha", "屏幕位置被按下");
X = (int) event.getX();
Y = (int) event.getY();
break;
接下来我们在ACTION_MOVE事件中计算偏移量,再调用layout()方法重新放置这个自定义View的位置就好了:
public boolean onTouchEvent(MotionEvent event) {
//获取到手指处的横坐标和纵坐标
int X = 0, newX = 0;
int Y = 0, newY = 0;
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Log.d("hahahhaha", "屏幕位置被按下");
X = (int) event.getX();
Y = (int) event.getY();
break;
case MotionEvent.ACTION_MOVE:
Log.d("hahahhaha", "屏幕位置在移動");
newX = (int) event.getX();
newY = (int) event.getY();
int offsetX = newX - X;
int offsetY = newY - Y;
Log.d("hahaha", "offsetX=" + offsetX + ",offsetY=" + offsetY);
//1.调用layout方法来重新放置它的位置
layout(getLeft()+offsetX, getTop()+offsetY,
getRight()+offsetX , getBottom()+offsetY);
当我们每次移动时都会调用layout()方法来对自己重新布局,从而达到移动View的效果。
2.offsetLeftAndRight()与offsetTopAndBottom()
这两种方法和layout()方法效果方法差不多,使用也差不多,我们将ACTION_MOVE中的代码替换成如下代码:
case MotionEvent.ACTION_MOVE:
//计算移动的距离
int offsetX = x - lastX;
int offsetY = y - lastY;
//对left和right进行偏移
offsetLeftAndRight(offsetX);
//对top和bottom进行偏移
offsetTopAndBottom(offsetY);
break;
3.LayoutParams(改变布局参数)
LayoutParams主要保存了一个View的布局参数,因此我们可以通过LayoutParams来改变View的布局的参数从而达到了改变View的位置的效果。同样的我们将ACTION_MOVE中的代码替换成如下代码:
LinearLayout.LayoutParams layoutParams= (LinearLayout.LayoutParams) getLayoutParams(); layoutParams.leftMargin = getLeft() + offsetX; layoutParams.topMargin = getTop() + offsetY; setLayoutParams(layoutParams);
因为父控件是LinearLayout,所以我们用了LinearLayout.LayoutParams,如果父控件是RelativeLayout则要使用RelativeLayout.LayoutParams。除了使用布局的LayoutParams外,我们还可以用ViewGroup.MarginLayoutParams来实现:
ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) getLayoutParams();
layoutParams.leftMargin = getLeft() + offsetX;
layoutParams.topMargin = getTop() + offsetY;
setLayoutParams(layoutParams);
4.scollTo与scollBy
scollTo(x,y)表示移动到一个具体的坐标点,而scollBy(dx,dy)则表示移动的增量为dx、dy。其中scollBy最终也是要调用scollTo的。scollTo、scollBy移动的是View的内容,如果在ViewGroup中使用则是移动他所有的子View。我们将ACTION_MOVE中的代码替换成如下代码:
((View)getParent()).scrollBy(-offsetX,-offsetY);
这里要实现CustomView随着我们手指移动的效果的话,我们就需要将偏移量设置为负值。
5.Scroller
我们用scollTo/scollBy方法来进行滑动时,这个过程是瞬间完成的,所以用户体验不大好。这里我们可以使用Scroller来实现有过度效果的滑动,这个过程不是瞬间完成的,而是在一定的时间间隔完成的。Scroller本身是不能实现View的滑动的,它需要配合View的computeScroll()方法才能弹性滑动的效果。
在这里我们实现CustomView平滑的向右移动。
首先我们要初始化Scroller:
public CustomView(Context context, AttributeSet attrs) {
super(context, attrs);
mScroller = new Scroller(context);
}
接下来重写computeScroll()方法,系统会在绘制View的时候在draw()方法中调用该方法,这个方法中我们调用父类的scrollTo()方法并通过Scroller来不断获取当前的滚动值,每滑动一小段距离我们就调用invalidate()方法不断的进行重绘,重绘就会调用computeScroll()方法,这样我们就通过不断的移动一个小的距离并连贯起来就实现了平滑移动的效果:
@Override
public void computeScroll() {
super.computeScroll();
if(mScroller.computeScrollOffset()){
((View) getParent()).scrollTo(mScroller.getCurrX(),mScroller.getCurrY());
//通过不断的重绘不断的调用computeScroll方法
invalidate();
}
}
调用Scroller.startScroll()方法。我们在CustomView中写一个smoothScrollTo()方法,调用Scroller.startScroll()方法,在2000毫秒内沿X轴平移delta像素:
public void smoothScrollTo(int destX,int destY){
int scrollX=getScrollX();
int delta=destX-scrollX;
//1000秒内滑向destX
mScroller.startScroll(scrollX,0,delta,0,2000);
invalidate();
}
最后我们在ViewSlideActivity.java中调用CustomView的smoothScrollTo()方法:
//使用Scroll来进行平滑移动
mCustomView.smoothScrollTo(-400,0);
这里我们是设定CustomView沿着X轴向右平移400像素。
6.动画
可以采用View动画来移动,在res目录新建anim文件夹并创建translate.xml:
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:fromXDelta="0" android:toXDelta="300" android:duration="1000"/> </set>
在Java代码中引用:
mCustomView.setAnimation(AnimationUtils.loadAnimation(this, R.anim.translate));
当然使用属性动画移动那就更简单了,我们让CustomView在1000毫秒内沿着X轴像右平移300像素:
ObjectAnimator.ofFloat(mCustomView,"translationX",0,300).setDuration(1000).start();
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# Android
# View
# 滑动
# Android中实现监听ScrollView滑动事件
# android 通过向viewpage中添加listview来完成滑动效果(类似于qq滑动界面)
# 解析Android中实现滑动翻页之ViewFlipper的使用详解
# Android中实现水平滑动(横向滑动)ListView示例
# Android利用ViewPager实现滑动广告板实例源码
# Android App中使用ViewPager+Fragment实现滑动切换效果
# Android中RecyclerView实现横向滑动代码
# android配合viewpager实现可滑动的标签栏示例分享
# Android编程中ViewPage判断左右滑动方向的方法
# Android App中ViewPager所带来的滑动冲突问题解决方法
# 方法来
# 自定义
# 偏移量
# 替换成
# 按下
# 来实现
# 六种
# 的是
# 都是
# 瞬间
# 就会
# 在这里
# 有很多
# 则是
# 可以用
# 会在
# 我们可以
# 可以通过
# 用了
# 达到了
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何使用Livewire构建动态组件?(入门代码)
Midjourney怎么调整光影效果_Midjourney光影调整方法【指南】
Laravel distinct去重查询_Laravel Eloquent去重方法
如何在建站之星网店版论坛获取技术支持?
通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】
BootStrap整体框架之基础布局组件
Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】
Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程
laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法
Laravel如何与Pusher实现实时通信?(WebSocket示例)
如何在服务器上三步完成建站并提升流量?
Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道
Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解
Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南
如何在七牛云存储上搭建网站并设置自定义域名?
瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口
JavaScript中的标签模板是什么_它如何扩展字符串功能
浅述节点的创建及常见功能的实现
广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?
Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程
Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID
微信小程序 闭包写法详细介绍
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
Laravel DB事务怎么使用_Laravel数据库事务回滚操作
如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
Java垃圾回收器的方法和原理总结
如何在 Pandas 中基于一列条件计算另一列的分组均值
laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法
Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】
韩国服务器如何优化跨境访问实现高效连接?
如何快速完成中国万网建站详细流程?
php做exe能调用系统命令吗_执行cmd指令实现方式【详解】
Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】
如何在橙子建站中快速调整背景颜色?
北京网页设计制作网站有哪些,继续教育自动播放怎么设置?
如何基于云服务器快速搭建个人网站?
Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优
公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?
香港服务器网站生成指南:免费资源整合与高速稳定配置方案
HTML透明颜色代码怎么让图片透明_给img元素加透明色的技巧【方法】
Android okhttputils现在进度显示实例代码
Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】
google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤
图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?
Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置
如何在阿里云ECS服务器部署织梦CMS网站?
百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭
微信小程序 canvas开发实例及注意事项
成都网站制作公司哪家好,四川省职工服务网是做什么用?

