上一篇简单的讲解了安卓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等,这里不一一介绍。