焦点事件
1.焦点事件是指针对于一个组件的状态的监听。在一个界面中,当要操作某一个组件时,就表示该组件获得了焦点。如:当需要输入文本时,可定要选中文本框,此时文本框就获得了焦点。使用方法:
public void setOnFocusChangeListener(View.OnFocusChangeListener).
2.
public class MyFocusDemo extends Activity {
private EditText edit = null; // 在此组件上设置焦点事件
private TextView txt = null; // 用于信息提示
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main);
this.edit = (EditText) super.findViewById(R.id.edit); // 取得组件
this.txt = (TextView) super.findViewById(R.id.txt); // 取得组件
this.edit.setOnClickListener(new OnClickListenerImpl()); // 设置单击事件
this.edit.setOnFocusChangeListener(new OnFocusChangeListenerImpl());//焦点事件
}
private class OnClickListenerImpl implements OnClickListener {
public void onClick(View v) {
MyFocusDemo.this.edit.setText(""); // 清空文本
}
}
private class OnFocusChangeListenerImpl implements OnFocusChangeListener {
public void onFocusChange(View v, boolean hasFocus) { // 表示操作的组件,而hasFocus表示是否获得焦点
if (hasFocus) { // 已经获得了焦点
MyFocusDemo.this.txt.setText("文本输入组件获得焦点。");
} else {
if (MyFocusDemo.this.edit.getText().length() > 0) { // 现在有数据
MyFocusDemo.this.txt.setText("文本输入组件失去焦点,输入内容合法。");
} else {
MyFocusDemo.this.txt.setText("文本输入组件失去焦点,输入内容不能为空。");
}
}
}
}
}
常按事件
1.常按事件就比如按某一个组件2秒之后才会触发这一操作,而不像普通的单击事件那样,每次单击都会执行一次。使用接口的定义:
public satic interface View.OnLongClickListener{
public boolean onLongClick(View v); }
处理用setOnLongClickListener()方法绑定的事件,之后使用onLongClick()方法执行具体的事件处理操作。
2.实例:程序首先使用ImageView显示一张图片,当用户长按时,将图片设置为手机的桌面背景。取得一个图片的InputStream对象要使用以下方法:
Resource对象.openRawResource(资源ID).
(1)添加允许设置桌面背景的权限
<uses-permission android:name="android.permission.SET_WALLPAPER"/>
(2)主程序:
public class MyLongClickDemo extends Activity {
private TextView info = null;
private ImageView img = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main);
this.img = (ImageView) super.findViewById(R.id.img);
this.info = (TextView) super.findViewById(R.id.info);
this.img.setOnLongClickListener(new OnLongClickListenerImpl());
}
private class OnLongClickListenerImpl implements OnLongClickListener {
public boolean onLongClick(View v) {
try {
MyLongClickDemo.this.clearWallpaper(); // 清除已有的桌面
MyLongClickDemo.this.setWallpaper(MyLongClickDemo.this.img
.getResources().openRawResource(R.drawable.mldn_bg)); // 设置桌面
MyLongClickDemo.this.info.setText("手机桌面背景已修改。");
} catch (Exception e) {
e.printStackTrace() ;
MyLongClickDemo.this.info.setText("手机桌面背景设置失败。");
}
return false;
}
}
}
键盘事件
1.键盘事件使用View.OnKeyListener接口进行事件的处理。此接口定义:
public static interface View.OnClickListener{
public boolean onKey(View v,int keyCode,KeyEvent event); }
该接口用于处理setOnKeyListener()方法绑定的时间,触发后将自动使用onKey()方法进行事件的处理,返回boolean值,一般返回false。(View表示操作此事件的组件;;keyCode对应着按键的编码数字;;KeyEvent表示触发的对象事件)。
2.实例:使用正则表达式验证输入的是否是email地址。
public class MyKeyDemo extends Activity {
private EditText input = null;
private ImageView img = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main);
this.input = (EditText) super.findViewById(R.id.input); // 取得组件
this.img = (ImageView) super.findViewById(R.id.img); // 取得组件
this.input.setOnKeyListener(new OnKeyListenerImpl());
}
private class OnKeyListenerImpl implements OnKeyListener {
public boolean onKey(View v, int keyCode, KeyEvent event) {
switch (event.getAction()) {
case KeyEvent.ACTION_UP:
String msg = MyKeyDemo.this.input.getText().toString(); // 取得输入的文字信息
if (msg.matches("\\w+@\\w+\\.\\w+")) { // 验证通过
MyKeyDemo.this.img.setImageResource(R.drawable.right); // 设置正确图片
} else {
MyKeyDemo.this.img.setImageResource(R.drawable.wrong); // 设置错误图片
}
case KeyEvent.ACTION_DOWN: // 键盘按下
break;
}
return false;
}
}
}
触摸事件
1.触摸事件(OnTouchListener)指的是当用户接触到屏幕之后所产生的一种事件形式,而当用户在屏幕上划过时,可以使用触摸事件取得用户当前的坐标。接口定义:
public interface View.OnTouchListener{
public anstract boolean onTouch(View v,MotionEvent event); }
当用户触摸屏幕之后自动执行onTouch()方法进行处理,同时自动产生一个MotionEvent事件类的对象,通过此对象可以取得用户当前的X坐标和Y坐标。
2.
public class MyPaintView extends View {
private List<Point> allPoint = new ArrayList<Point>(); // 保存所有的操作坐标
public MyPaintView(Context context, AttributeSet attrs) { // 接收Context,同时接收属性集合
super(context, attrs); // 调用父类的构造
super.setOnTouchListener(new OnTouchListenerImpl());
}
private class OnTouchListenerImpl implements OnTouchListener {
public boolean onTouch(View v, MotionEvent event) {
Point p = new Point((int) event.getX(), (int) event.getY()); // 将坐标保存在Point类
if (event.getAction() == MotionEvent.ACTION_DOWN) { // 按下,表示重新开始保存点
MyPaintView.this.allPoint = new ArrayList<Point>(); // 重绘
MyPaintView.this.allPoint.add(p); // 保存点
} else if (event.getAction() == MotionEvent.ACTION_UP) { // 用户松开
MyPaintView.this.allPoint.add(p); // 记录坐标点
MyPaintView.this.postInvalidate(); // 重绘图形
} else if (event.getAction() == MotionEvent.ACTION_MOVE) { // 用户移动
MyPaintView.this.allPoint.add(p); // 记录坐标点
MyPaintView.this.postInvalidate(); // 重绘图形
}
return true; // 表示下面的操作不再执行了。
}
}
@Override
protected void onDraw(Canvas canvas) { // 进行绘图
Paint p = new Paint(); // 依靠此类开始画线
p.setColor(Color.RED);// 定义图的颜色
if (MyPaintView.this.allPoint.size() > 1) { // 现在有坐标点保存的时候可以开始进行绘图
Iterator<Point> iter = MyPaintView.this.allPoint.iterator();
Point first = null;
Point last = null;
while (iter.hasNext()) {
if (first == null) {
first = (Point) iter.next(); // 取出坐标
} else {
if (last != null) { // 前一阶段已经完成了
first = last; // 重新开始下一阶段
}
last = (Point) iter.next(); // 结束点坐标
canvas.drawLine(first.x, first.y, last.x, last.y, p);
}
}
}
}
}