android view的移动,Android -- View移动的六种方法

layout()

如果你将滑动后的目标位置的坐标传递给layout(),这样子就会把view的位置给重新布置了一下,在视觉上就是view的一个滑动的效果。

public class DragView extends View{

private int lastX;

private int lastY;

public DragView(Context context, AttributeSet attrs) {

super(context, attrs);

}

public boolean onTouchEvent(MotionEvent event) {

//获取到手指处的横坐标和纵坐标

int x = (int) event.getX();

int y = (int) event.getY();

switch(event.getAction()){

case MotionEvent.ACTION_DOWN:

lastX = x;

lastY = y;

break;

case MotionEvent.ACTION_MOVE:

//计算移动的距离

int offX = x - lastX;

int offY = y - lastY;

//调用layout方法来重新放置它的位置

layout(getLeft()+offX, getTop()+offY,

getRight()+offX , getBottom()+offY);

break;

}

return true;

}

}

0562afe75207a5995375626c122cf49a.gif

offsetLeftAndRight() offsetTopAndBottom()

其实这两个方法分别是对左右移动和上下移动的封装,传入的就是偏移量。

public boolean onTouchEvent(MotionEvent event) {

//获取到手指处的横坐标和纵坐标

int x = (int) event.getX();

int y = (int) event.getY();

switch(event.getAction()){

case MotionEvent.ACTION_DOWN:

lastX = x;

lastY = y;

break;

case MotionEvent.ACTION_MOVE:

//计算移动的距离

int offX = x - lastX;

int offY = y - lastY;

offsetLeftAndRight(offX);

offsetTopAndBottom(offY);

break;

}

return true;

}

LayoutParams

public boolean onTouchEvent(MotionEvent event) {

//获取到手指处的横坐标和纵坐标

int x = (int) event.getX();

int y = (int) event.getY();

switch(event.getAction()){

case MotionEvent.ACTION_DOWN:

lastX = x;

lastY = y;

break;

case MotionEvent.ACTION_MOVE:

//计算移动的距离

int offX = x - lastX;

int offY = y - lastY;

ViewGroup.MarginLayoutParams mlp =

(MarginLayoutParams) getLayoutParams();

mlp.leftMargin = getLeft()+offX;

mlp.topMargin = getTop()+offY;

setLayoutParams(mlp);

break;

}

return true;

}

scrollTo() scrollBy()

sceollTo(x,y)传入的应该是移动的终点坐标

scrollBy(dx,dy)传入的是移动的增量。

通过scrollBy传入的值应该是你需要的那个增量的相反数!

public boolean onTouchEvent(MotionEvent event) {

//获取到手指处的横坐标和纵坐标

int x = (int) event.getX();

int y = (int) event.getY();

switch(event.getAction()){

case MotionEvent.ACTION_DOWN:

lastX = x;

lastY = y;

break;

case MotionEvent.ACTION_MOVE:

//计算移动的距离

int offX = x - lastX;

int offY = y - lastY;

((View) getParent()).scrollBy(-offX,- offY);

break;

}

return true;

}

Scroller

步骤一:

​初始化Scroller对象,即mScroller = new Scroller(context)

步骤二:

​重写computeScroll()方法,实现模拟滑动。可以复制下面的末模板代码:

public void computeScroll() {

super.computeScroll();

if(mScroller.computeScrollOffset()){

((View)getParent()).scrollTo(mScroller.getCurrX(),mScroller.getCurrY());

}

invalidate();//必须要调用

}

步骤三:

开启模拟过程,在合适的地方(一般都在move中)startScroll方法。它有两个重载方法如下:

startScroll(int startX,int startY, int dx,int dy,int duration)

startScroll(int startX,int startY,int dx,int dy)

需要说明的是:

computeScrollOffset方法用来判断是否完成了整个滑动,返回为true,则说明没有完成,否则则完成滑动。

getCurrY()以及getCurrX()获得的是当前的滑动坐标。

最后必须要用invalidate方法来刷新。因为computeScroll方法不会自动调用,是在draw方法中被调用的。所以必须使用invalidate刷新,就会调用draw方法,自然就会调用computeScroll方法了。这样子就会实现循环调用。

在startScroll中,偏移量跟使用scrollBy方法中的偏移量用法是一样的,即也必须填写你实际想要移动距离的相反数。也就是你实际想让它偏移一个正值,这里就填写它相应的负值,如果想偏移一个负值,这里就填写相应的正值!

public class DragView extends View{

private int lastX;

private int lastY;

private Scroller mScroller;

public DragView(Context context, AttributeSet attrs) {

super(context, attrs);

mScroller = new Scroller(context);

}

public boolean onTouchEvent(MotionEvent event) {

//获取到手指处的横坐标和纵坐标

int x = (int) event.getX();

int y = (int) event.getY();

switch(event.getAction()){

case MotionEvent.ACTION_DOWN:

lastX = x;

lastY = y;

break;

case MotionEvent.ACTION_MOVE:

//计算移动的距离

int offX = x - lastX;

int offY = y - lastY;

View viewGroup = (View) getParent();

((View) getParent()).scrollBy(-offX,- offY);

break;

case MotionEvent.ACTION_UP:

View viewGroup = (View) getParent();

//开启滑动,让其回到原点

mScroller.startScroll(viewGroup.getScrollX(),

viewGroup.getScrollY(),

-viewGroup.getScrollX() ,-viewGroup.getScrollY());

break;

}

return true;

}

public void computeScroll() {

super.computeScroll();

if(mScroller.computeScrollOffset()) {

((View)getParent()).scrollTo(mScroller.getCurrX(),

mScroller.getCurrY());

}

invalidate();//必须要调用

}

}

1027bcc2b4931a2f0372286a23632b66.gif

ViewDragHelper

我是天王盖地虎的分割线

Android View体系(二)实现View滑动的六种方法

1.View的滑动简介 View的滑动是Android实现自定义控件的基础,同时在开发中我们也难免会遇到View的滑动的处理.其实不管是那种滑动的方式基本思想都是类似的:当触摸事件传到View时,系统 ...

android中实现view可以滑动的六种方法续篇(二)

承接上一篇,上一篇中讲解了实现滑动的第五种方法,如果你还没读过,可点击下面链接: http://www.cnblogs.com/fuly550871915/p/4985482.html 这篇文章现在来 ...

Android View体系(四)从源码解析Scroller

在Android View体系(二)实现View滑动的六种方法这篇文章中我们讲到了用Scroller来实现View的滑动,所以这篇文章我们就不介绍Scroller是如何使用的了,本篇就从源码来分析下S ...

Android View体系(三)属性动画

上一篇文章讲了View滑动的六种方法,其中一种是使用动画,这篇文章我们来讲一讲动画的其中一种:属性动画. 1.android视图动画和属性动画 视图动画我们都了解,它提供了AlphaAnimation ...

Android View体系(八)从源代码解析View的layout和draw流程

相关文章 Android View体系(一)视图坐标系 Android View体系(二)实现View滑动的六种方法 Android View体系(三)属性动画 Android View体系(四)从源 ...

Android View体系(十)自定义组合控件

相关文章 Android View体系(一)视图坐标系 Android View体系(二)实现View滑动的六种方法 Android View体系(三)属性动画 Android View体系(四)从源 ...

Android View体系(九)自定义View

相关文章 Android View体系(一)视图坐标系 Android View体系(二)实现View滑动的六种方法 Android View体系(三)属性动画 Android View体系(四)从源 ...

关于android.view.WindowLeaked(窗体泄露)的解决方案

虽然是小问题一个,但也困扰了我一段时间,现在记下来,给自己做个备忘,也可以给其他人一个参考 view plaincopy to clipboardprint? 01-08 01:49:27.874:  ...

android中实现view可以滑动的六种方法

在android开发中,经常会遇到一个view需要它能够支持滑动的需求.今天就来总结实现其滑动的六种方法.其实每一种方法的 思路都是一样的,即:监听手势触摸的坐标来实现view坐标的变化,从而实现vi ...

随机推荐

ECF R9(632E) & DP

Description: 给你$n$个数可以任取$k$个(可重复取),输出所有可能的和. $n \leq 1000,a_i \leq 1000$ Solution: 好神的DP,我们排序后把每个数都减 ...

【C语言入门教程】2.8 C 语言的预处理命令

预处理命令是在程序编译阶段进行执行的命令,用于编译与特定环境相关的可执行文件.预处理命令扩展了 C 语言,本节将选择其中一些常用的预处理命令进行讲解. 2.8.1 宏替换命令 宏替换命令的作用类似于对 ...

python学习笔记系列----(二)控制流

实际开始看这一章节的时候,觉得都不想看了,因为每种语言都会有控制流,感觉好像我不看就会了似的.快速预览的时候,发现了原来还包含了对函数定义的一些描述,重点讲了3种函数形参的定义方法,章节的最后讲述了P ...

下拉框QComboBox相关函数

QComboBox addItem (self, QString text, QVariant userData = QVariant())addItem (self, QIcon icon, QSt ...

Git Submodules are not SVN Externals

一直在寻找Git跟TFS里面类似SVN Externals的替代方案, 今天终于找到了GIT里面的替代方案,在此做个备注 http://alexking.org/blog/2012/03/05/git ...

String字符串的操作

字符串的常用操作 # Author:nadech name = "my name is nadech" print(name.count("a")) print ...

docker_weave

安装 curl -L git.io/weave -o /usr/local/bin/weave chmod a+x /usr/local/bin/weave 启动 weave weave launch ...

Leanote 蚂蚁笔记 云笔记

Leanote 蚂蚁笔记  1.Leanote 数据存储是使用mongo存放的,所以需要安装mongo包 1.MongoDB 数据存储 Leanote 依赖 MongoDB 作为数据存储,下面开始安装 ...

20155232《网络对抗》Exp5 MSF基础应用

20155232Exp5 MSF基础应用 基础问题回答 用自己的话解释什么是exploit,payload,encode. exploit:就是利用可能存在的漏洞对目标进行攻击 ...

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值