本文实例为大家分享了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所带来的滑动冲突问题解决方法
# 方法来
# 自定义
# 偏移量
# 替换成
# 按下
# 来实现
# 六种
# 的是
# 都是
# 瞬间
# 就会
# 在这里
# 有很多
# 则是
# 可以用
# 会在
# 我们可以
# 可以通过
# 用了
# 达到了
相关文章:
Python多线程使用规范_线程安全解析【教程】
如何通过云梦建站系统实现SEO快速优化?
网站制作软件有哪些,制图软件有哪些?
如何通过网站建站时间优化SEO与用户体验?
宁波免费建站如何选择可靠模板与平台?
如何通过远程VPS快速搭建个人网站?
如何通过商城自助建站源码实现零基础高效建站?
微信小程序 input输入框控件详解及实例(多种示例)
如何设置并定期更换建站之星安全管理员密码?
油猴 教程,油猴搜脚本为什么会网页无法显示?
盘锦网站制作公司,盘锦大洼有多少5G网站?
如何快速搭建高效WAP手机网站吸引移动用户?
西安制作网站公司有哪些,西安货运司机用的最多的app或者网站是什么?
,怎么在广州志愿者网站注册?
婚礼视频制作网站,学习*后期制作的网站有哪些?
成都响应式网站开发,dw怎么把手机适应页面变成网页?
,石家庄四十八中学官网?
实例解析Array和String方法
东莞专业制作网站的公司,东莞大学生网的网址是什么?
linux top下的 minerd 木马清除方法
如何获取开源自助建站系统免费下载链接?
定制建站是什么?如何实现个性化需求?
制作网站怎么制作,*游戏网站怎么搭建?
建站之星伪静态规则如何正确配置?
相册网站制作软件,图片上的网址怎么复制?
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
定制建站哪家更专业可靠?推荐榜单揭晓
如何在阿里云完成域名注册与建站?
ppt制作免费网站有哪些,ppt模板免费下载网站?
如何用搬瓦工VPS快速搭建个人网站?
详解jQuery停止动画——stop()方法的使用
北京专业网站制作设计师招聘,北京白云观官方网站?
北京营销型网站制作公司,可以用python做一个营销推广网站吗?
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
昆明高端网站制作公司,昆明公租房申请网上登录入口?
建站主机类型有哪些?如何正确选型
赚钱网站制作软件,建一个网站怎样才能赚钱?是如何盈利的?
在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?
在线制作视频的网站有哪些,电脑如何制作视频短片?
广州美橙建站如何快速搭建多端合一网站?
如何快速搭建虚拟主机网站?新手必看指南
浅谈Javascript中的Label语句
深圳网站制作平台,深圳市做网站好的公司有哪些?
b2c电商网站制作流程,b2c水平综合的电商平台?
网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?
网站代码制作软件有哪些,如何生成自己网站的代码?
教程网站设计制作软件,怎么创建自己的一个网站?
如何基于云服务器快速搭建个人网站?
建站之星如何实现五合一智能建站与营销推广?
C++如何将C风格字符串(char*)转换为std::string?(代码示例)
*请认真填写需求信息,我们会在24小时内与您取得联系。