android:View随手指的移动而移动

我们经常要做一些效果,比如,点击之后的动画,随着手指的移动而移动。那么它们如何实现的呢?我们直到,view的自动移动,我们可以设置动画,比如之前写的Fragment的进入与弹出动画:https://github.com/nuptboyzhb/FragmentAnimationDemo 那么,我们如何是一个View随着手指的移动而移动呢?


1.onTouch事件


我们为view添加onTouch事件,获取移动过程中,手指相对屏幕的位置信息:[code]

@Override
	public boolean onTouch(View v, MotionEvent event) {
		switch (event.getAction()) {
		case MotionEvent.ACTION_DOWN:
			break;
		case MotionEvent.ACTION_MOVE:
			moveViewWithFinger(view, event.getRawX(), event.getRawY());
			break;
		case MotionEvent.ACTION_UP:
			break;
		}
		return true;
	}

2.方法1:setLayoutParams


获得手指的位置之后,就可以通过动态设置View的布局,达到“移动”view的目的。[code]

/**
	 * 设置View的布局属性,使得view随着手指移动 注意:view所在的布局必须使用RelativeLayout 而且不得设置居中等样式
	 * 
	 * @param view
	 * @param rawX
	 * @param rawY
	 */
	private void moveViewWithFinger(View view, float rawX, float rawY) {
		RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) view
				.getLayoutParams();
		params.leftMargin = (int) rawX - ivMove.getWidth() / 2;
		params.topMargin = (int) rawY - topTitleHeight - ivMove.getHeight() / 2;
		view.setLayoutParams(params);
	}

3.方法2:view.layout(l,t,r,b)
方法二的局限,主要是对view所在的布局有较高的要求,而layout则没有太多要求,既可以是RelativeLayout,也可以是LinearLayout。

/**
	 * 通过layout方法,移动view 
	 * 优点:对view所在的布局,要求不苛刻,不要是RelativeLayout,而且可以修改view的大小
	 * 
	 * @param view
	 * @param rawX
	 * @param rawY
	 */
	private void moveViewByLayout(View view, int rawX, int rawY) {
		int left = rawX - ivMove.getWidth() / 2;
		int top = rawY - topTitleHeight - ivMove.getHeight() / 2;
		int width = left + view.getWidth();
		int height = top + view.getHeight();
		view.layout(left, top, width, height);
	}

另外,在移动的过程中,还可以动态改变view的大小

注意:部分手机(比如华为,小米等),设置leftMargin无效,会出现View不跟手的现象。此时,我们可以使用view.setX()和view.setY()这两个属性替代。


4.Surfaceview中的对象
在SurfaceView中,我们更容易移动一个view,可以参见“新版飞机大战”源代码[ https://github.com/nuptboyzhb/newplanegame]中,主飞机的移动,随着手指的移动而移动。


5.方法1和2的源代码: https://github.com/nuptboyzhb/MoveViewWithFinger


-------------------------------------------------------------------

更多交流,Android开发联盟QQ群:272209595


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值