强强学Android_Android事件传递
16lz
2021-12-21
学习资料 : 疯狂Android讲义_ Android事件处理 学习笔记 如有错误之处请大家帮忙指出纠正__谢谢 ------------------------------------------------------------------------------------------------------------------------------------------- Android事件处理概念 : 当用户在程序应用界面上执行各种操作时,应用程序必须为用户提供响应动作,这种响应动作就需要通过事件处理来完成 Android提供了两种方式的事件处理: 基于回调的事件处理 和 基于监听的事件处理 一 : 基于监听的处理 事件监听主要涉及以下三类对象 Event Source [事件源] 事件的发生场所 , 通常就是各个组件,例如按钮, 窗口 , 菜单等 Event [事件] 事件封装了界面组件上发生的特定的事件, 比如用户在界面上按钮 , 移动,抬起 等等 , 一般通过Event对象来获得用户所做的事件 Event Listener[事件监听器] 负责监听事件源所发生的事件 , 并对各事件作出相应的响应 当用户按下按钮或者单击某个菜单选项的时候, 这些动作就会激发一个相应的事件 , 该事件就会触发事件源身上的事件监听器 , 事件监听器就会调用事件处理器(事件监听器里的实例方法)来作出相应的处理 事件处理流程事例图
点击事件:
接下来的小案例 ; 按钮就是事件源,我们需要自己手动为事件源绑定事件监听器---事件监听器必须由开发者来实现 View.OnClickListener 实现了该接口的子类,必须实现未实现的方法 , 该类将会作为事件监听器使用,当按钮被点击时,他的方法,就是事件处理器, 我们可以在该方法中进行相应的操作 我们一般都是直接使用匿名内部类作为事件监听器类来使用1 1 package org.crazyit.event; 2 2 import android.app.Activity; 3 3 import android.os.Bundle; 4 4 import android.view.View; 5 5 import android.view.View.OnClickListener; 6 6 import android.widget.Button; 7 7 import android.widget.EditText; 8 8 // 实现事件监听器接口 9 9 public class ActivityListener extends Activity10 10 implements OnClickListener11 11 {12 12 EditText show;13 13 Button bn;14 14 @Override15 15 public void onCreate(Bundle savedInstanceState)16 16 {17 17 super.onCreate(savedInstanceState);18 18 setContentView(R.layout.main);19 19 show = (EditText) findViewById(R.id.show);20 20 bn = (Button) findViewById(R.id.bn);21 21 // 直接使用Activity作为事件监听器22 22 bn.setOnClickListener(this);23 23 }24 24 // 实现事件处理方法25 25 @Override26 26 public void onClick(View v)27 27 {28 28 show.setText("bn按钮被单击了!");29 29 }30 30 }View Code
1 1 <?xml version="1.0" encoding="utf-8"?> 2 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 3 android:orientation="vertical" 4 4 android:layout_width="fill_parent" 5 5 android:layout_height="fill_parent" 6 6 android:gravity="center_horizontal" 7 7 > 8 8 <EditText 9 9 android:id="@+id/show"10 10 android:layout_width="fill_parent" 11 11 android:layout_height="wrap_content" 12 12 android:editable="false"13 13 />14 14 <Button 15 15 android:id="@+id/bn"16 16 android:layout_width="wrap_content" 17 17 android:layout_height="wrap_content" 18 18 android:text="单击我"19 19 />20 20 </LinearLayout>View Code
-
基于监听的事件处理规则
-
1 package org.crazyit.event; 2 import android.content.Context; 3 import android.util.AttributeSet; 4 import android.util.Log; 5 import android.view.KeyEvent; 6 import android.widget.Button; 7 public class MyButton extends Button 8 { 9 public MyButton(Context context, AttributeSet set)10 {11 super(context, set);12 }13 @Override14 public boolean onKeyDown(int keyCode, KeyEvent event)15 {16 super.onKeyDown(keyCode, event);17 Log.v("-crazyit.org-", "the onKeyDown in MyButton");18 // 返回true,表明该事件不会向外扩散19 return true;20 }21 }
View Code -
直接在xml中使用该控件
1 public class MyButton extends Button 2 { 3 public MyButton(Context context , AttributeSet set) 4 { 5 super(context , set); 6 } 7 @Override 8 public boolean onKeyDown(int keyCode, KeyEvent event) 9 {10 super.onKeyDown(keyCode , event);11 Log.v("-MyButton-" , "the onKeyDown in MyButton");12 // 返回false,表明并未完全处理该事件,该事件依然向外扩散13 return false;14 }15 }View Code
1 public class Propagation extends Activity 2 { 3 @Override 4 public void onCreate(Bundle savedInstanceState) 5 { 6 super.onCreate(savedInstanceState); 7 setContentView(R.layout.main); 8 Button bn = (Button) findViewById(R.id.bn); 9 // 为bn绑定事件监听器10 bn.setOnKeyListener(new OnKeyListener()11 {12 @Override13 public boolean onKey(View source14 , int keyCode, KeyEvent event)15 {16 // 只处理按下键的事件17 if (event.getAction() == KeyEvent.ACTION_DOWN)18 {19 Log.v("-Listener-", "the onKeyDown in Listener");20 }21 // 返回false,表明该事件会向外传播22 return false; // (1)23 }24 });25 }26 // 重写onKeyDown方法,该方法可监听它所包含的所有组件的按键被按下事件27 @Override28 public boolean onKeyDown(int keyCode, KeyEvent event)29 {30 super.onKeyDown(keyCode , event);31 Log.v("-Activity-" , "the onKeyDown in Activity");32 //返回false,表明并未完全处理该事件,该事件依然向外扩散33 return false;34 }35 }View Code 接下来我们通过Log看下事件传递的顺序 当该组件上发生某个按键被按下的事件时, [1]Android系统最先触发的是该控件身上绑定的事件监听器 , [2]前提第一步返回false, 接下来触发该组件中提供的事件回调方法 [3]前提第二步返回false,最终事件将会传递到Activity中的回调方法 反例 : 如果我们将监听器中的回调方法返回值返回true , 证明该方法完全处理该事件 , 事件将不会再进行传递 Log打印: -------------------------------------------------------------------------------------------------------------------------------- 重写onTouchEvent方法响应触摸屏事件 基于监听事件处理方式 更加强大, 事件源, 事件监听由两个类分开实现 , 因此具有更好的可维护性 android的事件处理机制保证基于 监听的事件监听器会被 优先触发 通过手指移动实现跟随手势移动的小球
-
1 public class DrawView extends View 2 { 3 public float currentX = 40; 4 public float currentY = 50; 5 // 定义、创建画笔 6 Paint p = new Paint(); 7 public DrawView(Context context, AttributeSet set) 8 { 9 super(context, set);10 }11 @Override12 public void onDraw(Canvas canvas)13 {14 super.onDraw(canvas);15 // 设置画笔的颜色16 p.setColor(Color.RED);17 // 绘制一个小圆(作为小球)18 canvas.drawCircle(currentX, currentY, 15, p);19 }20 @Override21 public boolean onTouchEvent(MotionEvent event)22 {23 // 当前组件的currentX、currentY两个属性24 this.currentX = event.getX();25 this.currentY = event.getY();26 // 通知改组件重绘27 this.invalidate();28 // 返回true表明处理方法已经处理该事件29 return true;30 }31 }
View Code通过实验我们发现 , 小球会跟随我们的手指进行移动
更多相关文章
- Android(安卓)Crash日志抓取及保存
- android之实现各个组件点击事件监听
- android 入门demo 事件监听
- Android的一些基本常识
- Android中各种消息监听机制
- Android(安卓)OnTouchListener 触摸事件 & GestureDetector 手势
- android、pull解析xml
- Android(安卓)BaseAdapter如何获得每一项并添加按钮事件
- Android(安卓)ListView列表分组