Android学习笔记(四)

Touch事件的处理
两种方式:
→1、为view对象设置OnTouchListener监听器
→2、重写控件Activity的onTouchEvent方法
★注意:
OnTouchListener监听器的onTouch方法在控件处理touch事件时优先于控件本身的onTouchEvent方法。越向下越具体到组件的touch事件处理的优先级越高;
●OnTouchListener
boolean onTouch(View v,MotionEvent event);return true表示该组件已经处理完该事件,不需向上传递;false还需向上一级传递。

◆ Touch事件的派发和处理机制。
1、Touch事件首先在Activity中被向下派发给View的根容器;根容器依次向下派发事件,直到将事件派发给触发该事件的具体控件,该控件会将事件派发给自己的事件处理方法。
2、触发事件的控件首先进行Touch事件的处理,如果该控件将事件消费,则事件处理结束,且后续的关联事件都由该控件处理;如果该控件未消费touch事件,则事件会传递给该控件所在的容器进行处理。如果容器消费该事件则事件处理结束,否则继续向上级容器传递事件。以此类推,如果事件一直未被消费,则Touch事件最终在Activity的onTouchEvent方法中处理

◆手势操作:
→1、创建OnGestureListener对象
→2、使用OnGestureListener对象创建GestureDetector
→3、在合适的touch事件处理方法中将所有的touch事件传递给GestureDetector对象的onTouchEvent方法
★创建GestureDetector时创建实现的监听器。

   SimpleOnGestureListener implements OnGesturelistener ,OnDoubleTapListener
 onFling(e1,e2): //一般重写此方法,用始末两点即可判断手势的方向。

●直接判断始末点的差值:

if(e1.getX()-e2.getX()>20){从右向左}
if(e2.getX()-e1.getX()>20){从左向右}
●通过判断按下点和抬起点的坐标:
if (event.getAction()==event.ACTION_DOWN) {
start=event.getX(); }
if (event.getAction()==event.ACTION_UP) { }
onScroll
onShowPress
onLongPress
onSingleTap
onDoubleTap
...
▲GestureDetector (手势检测器)
作用:用于对touch事件的分发;分发处理Activity的onTouchEvent()的事件:
detector.onTouchEvent(event);
▲构造方法: GestureDetector(Context context,OnGestureListener l)
▲主要方法:
boolean onTouchEvent(MotionEvent event)

◆意图
●两个分类
▲显式意图:明确指定要启动的组件信息;
▲隐式意图:不明确指定启动的组件信息,而经过注册通过过滤器进行启动。
●过滤器:用于隐式意图,过滤选择操作类型。在注册时用于标记自己可支持哪一类请求;当有多个action相同时,系统会让用户自己选择哪一个应用来处理相应的请求。如,打开一个网址。

 <intent-filter>
    <action android:name="android.intent.action.MAIN" />//什么样的动作
    <category android:name="android.intent.category.LAUNCHER" /> //动作的类型;此设置启动的MainActivity的桌面图标。
    <data android:mimeType="Image" android:scheme="http"存在关系递进/> //可查看什么样的数据;
</intent-filter>

★№桌面中的图标是MainActivity的图标,而不是程序的图标,若不显示设置MainActivity的图标,则会继承使用Application的图标;而Application的图标是用于进程管理器中的默认图标。

★ 打开网页:

 Uri uri = Uri.parse("http://www.xinping.me");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);

★拨打电话:

Uri uri =Uri.parse("tel:"+"12345678901");
Intent  intent = new Intent(Intent.ACTION_CALL,uri);

★打开拨号界面:

Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:"+"12345678902"));

★发送短信:

Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.parse("smsto:"+number));
intent.putExtra("sms_body", msg);

● 意图六个属性
▲ 显式相关
ComponentName component //(组件)显式意图必须设置此属性的值
○ 构造方法:
ComponentName(String pkgName,String clsName)
ComponentName(Context pkg,String clsName)
ComponentName(Context pkg,Class cls)
▲ 隐式相关
String action
Set<String> categories
Uri data
▲ 传递数据
Bundle extras
○ 构造方法: Bundle()
○ 主要方法:
void putByte(String key,byte value)
void putByteArray(String key,byte[] value)

★隐式意图的匹配原则:
1、intent对象中包含的隐式意图三个属性,都能与某个组件的intent-filter中声明的过滤属性相匹配,则该组件支持隐式意图的操作。
2、具体的匹配原则:
1)action的匹配原则
a)每个intent对象中最多只能包含一个action
b)intent-filter中可以声明多个action
c)intent对象中包含的action,若在intent-filter所声明的action范围内,则测试通过
d)如果intent-filter中未声明action,该filter拒绝任何的action
e)如果intent对象中未包含action,默认能通过所有的action测试,除非出现(d)中所列情况
2)category的匹配原则
a)intent对象中可以包含多个category
b)intent-filter中可以声明多个category
c)如果intent对象中包含的category是intent-filter中声明的category的子集,则category测试通过。
d)如果intent对象中未包含category,理论上可以通过任何的category测试
★注意:被传入到startActivity方法中的intent,一定会包含一个category(Intent.CATEGORY_DEFAULT)
★所以,为activity声明的intent-filter中至少要过滤Intent.CATEGORY_DEFAULT
3)data的匹配原则
a)intent对象中最多只能包含一个具体的资源路径(Uri)作为data(数据,路径)
b)在intent-filter中声明了组件可支持的数据(uri)的格式
android:scheme
android:host
android:port
android:path
android:mimetype
c)如果intent中包含的uri值,符合intent-filter中声明的格式则data测试通过
★在非Activity上下文启动Activity时,必须为启动意图设置flag(Intent.FLAG_ACTIVITY_NEW_TASK)

◆startActivityForResult
可用于在Activity中新打开另一个Activity关闭后返回的数据;
▲使用context.startActivityForResult方法启动Activity
1、在源Activity中调用startActivityForResult启动目标Activity
2、在目标Activity中设置返回值(setResult方法)结束目标Activity
3、重写源Activity中onActivityResult方法接收返回值

◆广播接收器
▲发送广播 :
→1、创建广播意图
→2、调用context对象的 sendBroadcast发送
●方法:

 Intent intent = new Intent("com.fanfan.tt");//创建一个广播意图
intent.putExtra("info", "hello"); //携带参数 
sendBroadcast(intent); //发送广播

▲接收广播:

→1、 创建类 扩展自BroadcastReceiver
→2 重写onReceive方法 ,处理广播意图
● 方法:创建一个类继承BroadcastReceiver:在onReceiver方法中取出action和数据:

 String a = intent.getAction();
if ("com.fanfan.test".equals(a)) {
  String info = intent.getStringExtra("info"); ...
}

№3、 注册:
§1) 静态注册:在AndroidManifest.xml中使用receiver标签注册
静态注册:只要在程序中启动过一次,以后不论是否启动程序,该广播器就一直停驻在系统中,系统通过扫描程序清单就能使该广播接收器就一直接收广播。

 <receiver
  android:name="com.fanfan.a0903.MyReceiver"
  android:exported="true">
  <intent-filter>
     <action android:name="com.fanfan.test" />
  </intent-filter>
</receiver>

§2) 动态注册:
context对象的registerReceiver方法注册
context对象的unRegisterReceiver方法取消注册
★№一般在程序中注册。在onCreat方法中注册一个广播接收器的同时也要在onDestory()方法中反注册,是一组对称的方法,否则容易出现内存泄漏异常。

protected void onCreate(Bundle savedInstanceState) {
 receiver = new MyReceiver(); 
 IntentFilter filter =new IntentFilter(); 
 filter.addAction("com.fanfan.test"); 
 registerReceiver(receiver, filter);}//广播接收器动态注册
protected void onDestroy() {
unregisterReceiver(receiver); }//一定要注销广播

★ [为考虑到手机性能,能动态注册就不使用静态注册。]
★ [若为静态注册,在接收广播时,是按注册的先后顺序收到广播;而动态注册的广播比静态注册的广播优先级,会先收到。]

博客地址:Android学习笔记(四)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,284评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,115评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,614评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,671评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,699评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,562评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,309评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,223评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,668评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,859评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,981评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,705评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,310评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,904评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,023评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,146评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,933评论 2 355

推荐阅读更多精彩内容