Touch事件学习与总结

ContentProvider(内容提供者)

概念:

Android为常见的一些数据提供了默认的ContentProvider(包括音频,视频图片和通讯录等)所以我们可以在其他应用程序通过那些contentProvider获取这些数据。

 

当我们想允许自己的应用的数据允许别的应用进行读取操作,我们可以让我们的APP实现ContentProvider类,同时注册一个URL,然后其他应用只要使用ContentResolver根据URL就可以操作我们APP中的数据了,而数据不一定是数据库,也可能是文件,xml或者其他,但是SharePreferernce使用基于数据库模型的简单表格来提供其中的数据。

1.简单的读取收件箱的信息:


其中:
ContentResolver resolver = getContentResolver();
//对ContentProvider中的数据进行添加,删除,修改和查询操作
Uri uri = Uri.parse();//将字符串转换成URI
Cursor cursor = resolver.query();//获取信息

ContentProvider的规定数据形式的URI组成,主要包括三部分:

  1.scheme:contentProvider的scheme已经由Android所规定,scheme为Content://
   2.Authority(主机名):用于唯一标识这个ContentProvider,比如www.baidu.wmw ,外部调用者可以根据这个标识来找到他
   3.path(路径):路径可以用来表示我们要操作的数据,路径的构建应根据业务而定

 

Touch事件处理详解

1.简介

当我们手指按下时,Android采用层层传递-冒泡的方式处理点击事件。也就是说:消息从上到下依次传递,如果在传递的过程中被拦截了就停止下传。如果没有被拦截,就一直传递到底部,如果底部不能够消耗该消息,那么就又一层层的返回来,返给上层,直到被消耗或者是到达最顶层。在页面,touch事件的传递过程从外层到内层依次是:Activity>ViewGroup>View,Activity实际上是以ViewGroup的身份在处理事件,在此过程中,存在三个重要的方法:

首先我们知道touch事件,主要是在三个方法中传递和处理的,分别是:

1).dispathTouchEvent:负责事件分发,它的返回值就是表示是否消耗了当前事件

2).onInterceptTouchEvent:只存在于ViewGroup中,用于判断是否拦截该消息,如果当前View拦截了某个事件,那么在同一事件序列中,此方法不会被再次调用,返回结果表示是否拦截当前事件

3).onTouchEvent :事件处理。返回结果表示是否消耗当前事件,如果不消耗,则在同一事件序列中,当前view无法再次接收到事件

 

事件处理概述:

 

1.基于监听的事件处理:

事件处理流程:

 

2.基于回调的事件处理:

1).重写Android组件的回调方法

2).重写Activity的回调方法

通用性事件用回调事件处理,某些特定的事件用监听事件处理

 

物理按键事件处理:

指的是:音量键、电源键、菜单键、主屏键、菜单键等

onKeyDown():按下事件

onKeyup():抬起事件

onKeyLongPress():长按事件

 

触摸屏事件处理:

单击事件:setOnclickLister等

长按事件(长按两秒之后才会触发):setOnLongClickListener()

1.在ActivityMain中重写onCreateContentMenu()方法,为菜单添加选项值

menu.add("收藏");

<span style="color:#a9b7c6">    menu.add(<span style="color:#6a8759">"</span><span style="color:#6a8759">举报</span><span style="color:#6a8759">"</span>)<span style="color:#cc7832">;</span></span>

2.在Activity的onCreate()方法中为目标增加长按监听,将长按事件注册到菜单中

ImageView iv = (ImageView) findViewById(R.id.imageView);

   iv.setOnLongClickListener(new View.OnLongClickListener() {
    @Override
 public boolean onLongClick(View v) {
        registerForContextMenu(v);
 openContextMenu(v);
        return false;
 }
    @Override
 public boolean onLongClick(View v) {
        registerForContextMenu(v);
 openContextMenu(v);
        return false;
 }

 

 

触摸事件:

SetOnTouchListener()方法:

MotionEvent:保存发生触摸的位置,时间等细节信息的方法

触摸事件类型主要有三种:

1.MotionEvent.ACTION_DOWN:手指按下屏幕触发。

2.MotionEvent.ACTION_MOVE:手指在屏幕上移动触发

3.MotionEventACTION_UP:手指抬起时触发。

 

触摸事件与单击事件的区别:

01 	Button button = (Button) findViewById(R.id.btn);  //获得按钮对象
02 
03 	button.setOnClickListener(new View.OnClickListener() {
04 	@Override
05 	public void onClick(View v) {   	//为按钮添加单击事件监听器
06 	        Log.i("onClick", "这是单击事件");
07 	    }
08 	});

09 	//为按钮添加触摸事件监听器
10 	button.setOnTouchListener(new View.OnTouchListener() {
11 	@Override
12 	public boolean onTouch(View v, MotionEvent event) {
13 	if (event.getAction() == MotionEvent.ACTION_DOWN) {  //表示手指按下
14 	Log.i("onTouch", "按下");
15 	        } else if (event.getAction() == MotionEvent.ACTION_UP) {//表示手指抬起
16 	Log.i("onTouch", "抬起");
17 	        }
18 	return false;     //表示未消耗掉这个事件
19 	}
20 	});

当触摸屏幕时,先进入触摸事件再进入单击事件进行判断,若onTouch()方法返回true,则不再进行单击事件,否则触发单击事件。

单击事件触动一个方法,触摸事件触动两个方法

 

手势:(Gestures)

1.Android中手势交互的执行顺序:

a.手指触碰屏幕时,触发MotionEvent事件,

b.该事件被OnToouchListener监听,可在它的onTouch()方法中获得该MotionEvent对象

c.通过GestureDetector转发MotionEvent对象给OnGestureListener

d.我们可以通过OnGestureListener获得该对象,然后获取相关信息,以及做相关处理。

 

下面通过一个简单的实例来进行验证:

 

我们知道监听手势的关键是:GestureListener

他给我们提供了下述的回调方法:

  • 按下(onDown): 刚刚手指接触到触摸屏的那一刹那,就是触的那一下。
  • 抛掷(onFling): 手指在触摸屏上迅速移动,并松开的动作。
  • 长按(onLongPress): 手指按在持续一段时间,并且没有松开。
  • 滚动(onScroll): 手指在触摸屏上滑动。
  • 按住(onShowPress): 手指按在触摸屏上,它的时间范围在按下起效,在长按之前。
  • 抬起(onSingleTapUp):手指离开触摸屏的那一刹那。

知道了GestureListener的相关方法后,实现手势检测也很简单,步骤如下:

  • Step 1: 创建GestureDetector对象,创建时需实现GestureListener传入
  • Step 2: 将Activity或者特定组件上的TouchEvent的事件交给GestureDetector处理即可! 我们写个简单的代码来验证这个流程,即重写对应的方法:

手势可分为:手势判断,手势添加,手势识别等

   

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值