android事件处理之基于监听
Android提供了了两种事件处理方式:基于回调和基于监听。
基于监听:
监听涉及事件源,事件,事件监听器。用注册监听器的方法将某个监听器注册到事件源上,就可以对发生在事件源上的时间进行监听。
最简单的的一个例子:单击按钮改变文本框里的文字。
界面布局:activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.zjlyyq.shijianchuli.MainActivity"> <EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="还没有任何操作"
android:id="@+id/et1"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按钮1"
android:id="@+id/bt1"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按钮2"
android:id="@+id/bt2"/>
</LinearLayout>
</LinearLayout>
MainActivity:
package com.example.zjlyyq.shijianchuli; import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText; public class MainActivity extends AppCompatActivity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button bt1 = (Button)findViewById(R.id.bt1);
Button bt2= (Button)findViewById(R.id.bt2);
//为按钮绑定监听器
bt1.setOnClickListener(new MyClickListener());
bt2.setOnClickListener(new MyClickListener());
}
//定义一个单击事件的监听器
class MyClickListener implements View.OnClickListener{
@Override
public void onClick(View v) {
EditText et1 = (EditText)findViewById(R.id.et1);
et1.setText("bt1被单击了");
}
}
}


注:以上程序采用内部类的形式。
事件由系统自动生成事件对象,事件对象会作为参数传给在事件源上注册的事件监听器。在上面的程序中,并没有事件对象,这是因为事件源触发的事件足够简单,无需封装事件对象,也就没有将数据对象传入监听器。但在更复杂的事件中,例如:键盘事件,触屏事件,包含更多的信息,Android会将时间信息封装成XxxEvent对象。并将对象作为参数传给监听器。
下面看个复杂点的例子:控制飞机移动
由于几乎不需要界面布局,该游戏直接使用一个PlaneView作为Activity显示的内容,并未该PlaneView增加触摸监听器即可。
PlaneView:
package com.example.zjlyyq.shijianchuli; import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.view.View; /**
* Created by zjlyyq on 2016/12/10.
*/
public class PlaneView extends View {
public float currentX;
public float currentY;
public Bitmap plane;
public PlaneView(Context context) {
super(context);
//定义飞机
plane = BitmapFactory.decodeResource(context.getResources(),R.drawable.plane);
setFocusable(true);
} @Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//创建画笔
Paint p = new Paint();
//绘制飞机
canvas.drawBitmap(plane,currentX,currentY,p);
}
}
MainActivity:
package com.example.zjlyyq.shijianchuli; import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.EditText; public class MainActivity extends AppCompatActivity {
private int speed = 10;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//去掉窗口标题
requestWindowFeature(Window.FEATURE_NO_TITLE);
//全屏显示
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
final PlaneView planeView = new PlaneView(this);
setContentView(planeView); //获取窗口管理器
WindowManager windowManager = getWindowManager();
Display display = windowManager.getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
//获取屏幕宽和高
display.getMetrics(metrics);
//设置飞机初始位置
planeView.currentX = metrics.widthPixels/2;
planeView.currentY = metrics.heightPixels - 40;
//为planeView组件的键盘事件绑定监听器
planeView.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
switch (event.getKeyCode()){
//控制飞机下移
case KeyEvent.KEYCODE_PAGE_DOWN:
planeView.currentY += speed;
break;
//控制飞机上移
case KeyEvent.KEYCODE_PAGE_UP:
planeView.currentY -= speed;
break;
}
//通知palneView组件重绘
planeView.invalidate();
return true;
}
});
//为planeView组件的触屏事件绑定监听器
planeView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
float x,y;
//获得触屏事件的位置
x = event.getX();
y = event.getY();
planeView.currentY = y;
planeView.currentX = x;
//通知palneView组件重绘
planeView.invalidate();
return true;
}
});
}
}
这个程序监听器采用匿名内部类的形式,并传入了MotionEvent对象。
android事件处理之基于监听的更多相关文章
- Android开发之基于监听的事件处理
在Android 应用开发过程中,常用监听事件如下:(1) ListView事件监听setOn ItemSelectedListener:鼠标滚动时触发setOnItemClickListener: ...
- Android学习笔记基于监听的事件处理
事件处理流程 代码格式: Button btn1 = findViewById(R.id.btn1); btn1.setOnClickListener(new View.OnClickListener ...
- Android的事件处理机制详解(二)-----基于监听的事件处理机制
基于监听的事件处理机制 前言: 我们开发的app更多的时候是需要与用户的交互----即对用户的操作进行响应 这就涉及到了android的事件处理机制; android给我们提供了两套功能强大的处理机制 ...
- Android基础新手教程——3.1 基于监听的事件处理机制
Android基础新手教程--3.1.1 基于监听的事件处理机制 标签(空格分隔): Android基础新手教程 本节引言: 第二章我们学习的是Android的UI控件,我们能够利用这些控件构成一个精 ...
- Android零基础入门第34节:Android中基于监听的事件处理
原文:Android零基础入门第34节:Android中基于监听的事件处理 上一期我们学习了Android中的事件处理,也详细学习了Android中基于监听的事件处理,同时学会了匿名内部类形式,那么本 ...
- Android的事件处理机制之基于监听的事件处理
无论是桌面应用还是手机应用程序,面对用户的使用,经常需要处理的便是用户的各种动作,也就是需要为用户动作提供响应,这种为用户动作提供响应的机制就是事件处理. 而Android为我们提供了两套强大的响应机 ...
- Android_基于监听的事件处理机制
一.引言 在经过几天的学习之后, 首先熟悉了几大基本布局以及一些常用控件的使用方法,目前正在学习如何实现一个基本的登录注册界面及其功能,而实现功能就需要我们采用事件处理机制来进行调用事件处理方法.以下 ...
- Android EditText截获与监听输入事件
Android EditText截获与监听输入事件共有2种方法: 1.第一种方法:使用setOnKeyListener(),不过这种方式只能监听硬键盘事件. edittext.setOnKeyLi ...
- Android Back Home键监听
Android Back Home键监听 Back键的监听 对于Back键的监听比较容易,可以在多个系统回调处拦截,比如在activity的下列方法中都可以收到Back键按下的事件: @Overrid ...
随机推荐
- java基础 常用组件
几个常用组件: 在图形用户界面编程中,我们常常会提供用户登陆界面,比如登陆到会员管理系统,登陆到工资管理系统,仓库管理系统等,如下图我们就会用到: 1. 文本框(JTextField) 2. 密码框( ...
- js作用域之常见笔试题,运行结果题
笔试题中经常有运行结果题,而大多体型都是围绕作用域展开,下面总结了几种相关的题: 外层的变量函数内部可以找到,函数内部的变量(局部变量)外层找不到. function aaa() { var a = ...
- bzoj4692: Beautiful Spacing
先二分答案后dp 设\(su[n]\)为\(\sum_{1}^{n}xi[i]\) 设\(f[n]\)为1时表示第n个单次能做某一行的结尾,且之前的空格满足二分出来的答案. 考虑怎样的\(f[i]\) ...
- liniux mint android-ndk风波
我的安装过程sudo chmod a+x android-ndk-r10d-linux-x86_64.bin/dowonload $ ./android-ndk-r10d-linux-x86_64.b ...
- CentOS 6.3下Samba服务器的安装与配置方法(图文详解)
这篇文章主要介绍了CentOS 6.3下Samba服务器的安装与配置方法(图文详解),需要的朋友可以参考下 一.简介 Samba是一个能让Linux系统应用Microsoft网络通讯协议的软件, ...
- git服务器搭建总结
1.软件选择 服务端软件:由于我对linux还不熟悉,而且公司用的都是windows,于是找到了bonobo,这是一个基于.net framework 4.5和.net mvc4的开源软件,iis7. ...
- c#获取外网IP地址的方法
1.如果你是通过路由上网的,可以通过访问ip138之类的地址来获取外网IP 2.如果是通过PPPOE拨号上网的,可以使用以下代码获取IP //获取宽带连接(PPPOE拨号)的IP地址,timeout超 ...
- XUT 1245
这是一道2016湘潭邀请赛的题目,记得那个时候看到这个题目就想到了最短生成树,然后给别人做,WA了,最后发现是有向图,然后我自己去写了个搜索,结果是RE吧 今天刚刚好想到这个题目,然后再来做,发现这个 ...
- android 4.4/5.1上使用aar的问题
在Android6.0上可以使用LOCAL_STATIC_JAVA_AAR_LIBRARIES.build脚本会把指定的aar解压缩到临时目录,并将class.jar和res添加到对应的变量. LOC ...
- [原创]MvvmLight中用IDialogService替代DialogMessage的用法
在新版的MvvmLight中,DialogMessage被标注为已过时,需要用IDialogService来替代,IDialogService的具体用法如下: 先在主窗体中实现IDialogServi ...