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的大小

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

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

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

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

时间: 2024-08-29 14:58:20

android:View随手指的移动而移动的相关文章

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

相关文章: Android View体系(一)视图坐标系 1.View的滑动简介 View的滑动是Android实现自定义控件的基础,同时在开发中我们也难免会遇到View的滑动的处理.其实不管是那种滑动的方式基本思想都是类似的:当触摸事件传到View时,系统记下触摸点的坐标,手指移动时系统记下移动后的触摸的坐标并算出偏移量,并通过偏移量来修改View的坐标. 实现View滑动有很多种方法,这篇文章主要讲解六种滑动的方法,分别是:layout().offsetLeftAndRight()与offs

Android View 触摸事件传递机制

PS:以现在的眼光看以前写的博客感觉写的很烂,或许或一段时间再看现在的博客会有同样的感觉.所以每时每刻都去学习,去发现和理解新的东西. 引言 由于之前写的一篇关于Android事件传递顺序的博客质量太差,可能是理解不到位的原因,故最近又花了许多时间再次去看Android源码,看完之后有了新的理解,所以打算重新整理这篇博客.理解Android触摸事件传递机制有助于日后的开发以及自定义一些手势效果等.注意:这篇博客是基于Android2.0源码来分析的,不管老版本还是新版本的Android,其内部触

Android View的事件分发机制

准备了一阵子,一直想写一篇事件分发的文章总结一下.这个知识点实在是太重要了. 一个应用的布局是丰富的,有TextView,ImageView,Button等.这些子View的外层还有ViewGroup.如RelativeLayout.LinearLayout.作为一个开发人员,我们会思考.当点击一个button,Android系统是如何确定我点的就是button而不是TextView的?然后还正确的响应了button的点击事件. 内部经过了一系列什么过程呢? 先铺垫一些知识能更加清晰的理解事件分

谈谈我对Android View事件分发的理解

写这篇博客的缘由.近期因为项目中用到相似一个LinearLayout中水平布局中,有一个TextView和Button,然后对该LinearLayout布局设置点击事件.点击TextView能够触发该点击事件.然而奇怪的是点击Button却不能触发. 然后google到了解决的方法(重写Button,然后重写当中的ontouchEvent方法,且返回值为false).可是不知道原因,这两天看了几位大神的博客,然后自己总结下. public class MyButton extends Butto

Android开发——跟随手指的小球实现

今天要实现的是一个跟随手指的小球,说白了就是让小球按着手指滑动的轨迹运动,实现起来还是比较容易的. 用到的类是drawView,我们先自定义一个DrawView组件. DrawView.java: package cn.csdn.android.view; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Pa

Android View体系(十一)自定义ViewGroup

相关文章 Android View体系(一)视图坐标系 Android View体系(二)实现View滑动的六种方法 Android View体系(三)属性动画 Android View体系(四)从源码解析Scroller Android View体系(五)从源码解析View的事件分发机制 Android View体系(六)从源码解析Activity的构成 Android View体系(七)从源码解析View的measure流程 Android View体系(八)从源码解析View的layout

Android View的事件分发机制探索

概述 Android事件传递机制也是Android系统中比较重要的一块,事件类型有很多种,这里主要讨论TouchEvent的事件在framework层的传递处理机制.因为对于App开发人员来说,理解framework层的事件传递机制,就差不多了. 带着问题来思考整个事件分发过程. 1.为什么要有事件分发过程? 当Android设备的屏幕,接收到触摸的动作时,屏幕驱动把压力信号(包括压力大小,压力位置等)传递给系统底层,然后操作系统经过一系列的处理,然后把触摸事件一层一层的向上传递,最终事件会被准

【Android - View】之自定义View实现“刮刮卡”效果

首先来介绍一下这个自定义View: (1)这个自定义View的名字叫做 GuaguakaView ,继承自View类: (2)这个View实现了很多电商项目中的"刮刮卡"的效果,即用户可以刮开覆盖层,查看自己是否中奖: (3)用户可以设置覆盖层的图片以及显示的文本内容和字体大小等参数: (4)用户可以设置一个阈值,当刮开的面积大于这个阈值时,就会自动清除所有覆盖物. 接下来简单介绍一下在这个自定义View中用到的技术点: (1)自定义属性:在 /res/values/attr.xml 

Android View视图系统分析和Scroller和OverScroller分析

Android  View视图系统分析和Scroller和OverScroller分析 View  视图分析 首先,我们知道.在Android中全部的视图资源(无论是Layout还是View),终于的父类都是View类.各式各样的Layout仅仅是对ViewGroup的一中特别的实现.各种View也仅仅是View的特别实现. 而ViewGroup也是对于View的一种实现.所以说全部的View元素在根本上都是一样的.当然这并不等于说View == ViewGroup,就好比仅仅有ViewGrou