您的位置:首页 > 产品设计 > UI/UE

安卓UI控件拖拽的几种方法

2016-05-10 16:27 429 查看
上一篇简单的讲解了安卓listview控件的一些简单的用法,这一次我们按照群英传的思路看一看安卓UI控件拖拽的实现方法。

安卓控件的拖拽(这里用词可能不太专业)可归纳为一下几个动作:1.普通拖拽,改变控件位置;2.放大缩小;3.滑动。下面我们来仔细的看

1.知识准备

滑动效果的产生:

移动界面上的一个view,从本上上来说就是改变该view在当前窗口中的位置。这一过程包括了两个步骤:

1)监听用户的触摸事件

2)根据事件传入的坐标重绘view

触控事件:

在安卓中用MotionEvent类来处理用户的触控事件,主要有以下几类事件:



以上常量对应的值分别为:3、0、9、10、7、255、2、4。

还有其他用的很多的常量,在下面列出:

int ACTION_UP = 1 ;  //单点触摸离开动作
int ACTION_POINTER_DOWN = 5; //多点按下动作
int ACTION_POINTER_UP = 6; //多点离开动作


对触控事件的处理:

通常在onTouchEvent(MontionEvent.event)方法中通过event.getAction()来获取事件类型并用switch-case进行处理。

安卓坐标:



在安卓中,将屏幕的左上角作为坐标原点,x轴向右y轴向下。在系统中提供了getLocationOnScreen(intlocation[])方法获取屏幕中点的位置。

如何获取控件在屏幕中的位置呢?主要有以下两类方法:

1)在View中的方法:

getTop():获取自身View的顶边到其父布局顶边的距离;

getLeft():获取自身View的左边到其父布局左边的距离;

getRight():获取自身View的右边到其父布局右边的距离;

getButton():获取自身View的底边到其父布局底边的距离;

2)MontionEvent中的方法:

getX():获取点击事件距离控件左边的距离,即视图坐标;

getY():获取点击事件距离控件顶边的距离,即视图坐标;

getRawX():获取点击事件距离整个屏幕左边的距离,即绝对坐标;

getRawY():获取点击事件距离整个屏幕顶边的距离,即绝对坐标;

有了以上的知识,现在我们再来看实现滑动的七种方法。

2.滑动的七种方法

1)layout()方法

View在进行绘制的时候都会调用onLayout()方法设置显示的位置。 我们可以通过修改View的left、right、top、button属性来控制view 的坐标。

在回调onTouchEvent()时获取触摸点的坐标。让后在ACTION_DOWN的case事件中记录触摸点的坐标

最后在ACTION_MOVE中设置偏移量从而移动view。

按照步骤,相应代码如下

int x = (int) event.getX();
int y = (int) event.getY();
//获取触摸点坐标
case MotionEvent.ACTION_DOWN:
lastX = x;
lastY = y;
break;
//记录触摸点坐标

case MotionEvent.ACTION_MOVE:
int offsetX = x-lastX;
int offsetY = y-lastY;
//计算偏移
layout(getLeft()+offsetX,
getTop()+offsetY,
getRight()+offsetX,
getBottom()+offsetY);
//加上偏移量
<span style="white-space:pre">			</span>lastX = rawX;
<span style="white-space:pre">			</span>lastY = rawY;
<span style="white-space:pre">			</span>//抽空新设置初始坐标


也可以使用绝对坐标来计算偏移量。

2)offsetLeftAndRight()与offsetTopAndBottom()

这两个方法直接将偏移量当作参数传递进去就能实现view的新布局。

offsetLeftAndRight(offsetX)

offsetTopAndBottom(offsetY)

3)LayoutParams

LayoutParams保存了一个View的布局参数。在程序中可以通过getLayoutParams()方法获取view的LayoutParams,再计算view位置的偏移量,通过setLayoutParams()方法重新设置LayoutParams就可以了。

LinearLayout.LayoutParams lp =
(LinearLayout.LayoutParams)getLayoutParams();
lp.leftMargin = getLeft()+offsetX;
lp.topMargin = getTop()+offsetY;
setLayoutParams(lp);
这里需要注意,通过getLayoutParams()获取LayoutParams时,需要根据View的父布局的不同设置不同的类型。

除使用LayoutParams外,还可使用ViewGroup.MarginLayoutParams来实现这一功能。

ViewGroup.MarginLayoutParams lp =
(ViewGroup.MarginLayoutParams) getLayoutParams();
lp.leftMargin = getLeft()+offsetX;
lp.topMargin = getTop()+offsetY;
setLayoutParams(lp);


使用这种方法时不用考虑父布局的类型,更加简单。

其他方法还有:

使用scrollTo与ScrollBy,Scroller等,这里不一一介绍。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: