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

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


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值