事件处理机制:基于监听的事件处理机制,基于回调的事件处理机制。
基于监听的事件处理
处理模型:
- 事件源
- 事件
- 事件监听器
委派式事件处理方式:事件源讲整个事件处理机制委托给事件监听器;当该事件源发送指定的事件时,就通知所委托的事件监听器,由事件监听器来处理这个事件。
示例
控制飞机移动
package com.example.plane;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.util.TypedValue;
import android.view.View;
import java.util.Timer;
import java.util.TimerTask;
public class PlaneView extends View {
//坐标
float currentX;
float currentY;
//画笔
private Paint p = new Paint();
private Bitmap plane0;
private Bitmap plane1;
private int index;
//private int index=0;
public PlaneView(Context context) {
super(context);
//定义飞机图片
plane0= BitmapFactory.decodeResource(context.getResources(), R.drawable.rc);
plane1= BitmapFactory.decodeResource(context.getResources(), R.drawable.ass);
//启动定时器切换飞机图片,实现动画效果
new Timer().schedule(new TimerTask() {
@Override
public void run() {
index++;
PlaneView.this.invalidate();
}
},0L,100L);
setFocusable(true);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//绘制飞机
canvas.drawBitmap(index%2==0?plane0:plane1,currentX,currentY,p);
}
}
package com.example.plane;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
public class MainActivity extends AppCompatActivity {
//定义飞机移动的速度
private int speed = 10;
private PlaneView planeView;
DisplayMetrics metrics;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//去掉窗口标题
requestWindowFeature(Window.FEATURE_NO_TITLE);
//全屏显示
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
//创建PlaneView组件
planeView = new PlaneView(this);
setContentView(planeView);
planeView.setBackgroundResource(R.drawable.ic_baseline_blur_on_24);
//获取窗口管理器
WindowManager windowManager = getWindowManager();
Display display =windowManager.getDefaultDisplay();
metrics = new DisplayMetrics();
//获取屏幕宽和高
display.getMetrics(metrics);
//设置飞机的初始位置
planeView.currentX=(metrics.widthPixels/2);
planeView.currentY=(metrics.heightPixels-200);
planeView.setOnTouchListener(new MyTouchListener());
}
class MyTouchListener implements View.OnTouchListener{
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
if(motionEvent.getX()<metrics.widthPixels/8){
planeView.currentX-=speed;
}
if(motionEvent.getX()>metrics.widthPixels*7/8){
planeView.currentX+=speed;
}
if(motionEvent.getY()<metrics.widthPixels/8){
planeView.currentY-=speed;
}
if(motionEvent.getY()>metrics.widthPixels*7/8){
planeView.currentY+=speed;
}
return true;
}
}
}
响应系统设置的事件
Configuration类专门用于描述手机设备上的配置信息。
AsyncTask
AsyncTask是一个抽象类,通常用于被继承,继承AsyncTask时需要指定三个参数
- Params:启动任务执行的输入参数的类型
- Progress:后台任务完成的进度值的类型
- Result:后台执行任务完成后返回结果的类型