As基于回调的监听

1.View类的常见回调方法

序号 方法 作用
01 boolean onKeyDown(int keyCode,KeyEvent event) 捕捉手机键盘的事件,即键盘码。event为按键事件的对象,封装了触发事件的各种信息
02 boolean onKeyUp(int keyCode,KeyEvent event) 捕捉手机键盘按键抬起的事件
03 boolean onTouchEvent( MotionEvent) 触摸事件,包括按下,抬起,滑动
04 boolean onKeyLongPress(int KeyCode,KeyEvent event) 长按触发事件
05 boolean onKeyShortcut(int KeyCode,KeyEvent event) 当一个快捷键事件时触发该方法
06 boolean onTrackballEvent(MotionEvent event) 在组建上触发轨迹球屏事件时触发该方法

2.回调方法的返回值
boolean类型的返回值用于表示该方法是否能完全处理该事件,true表示完全处理,不会传播出去,false表示未完全处理,事件会被传播出去

例子:

创建一个事件类完成操作
package com.example.a4_333;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

public class DrawView extends View {  //常见DrawView类实现
    public float currentX=40;        //定义初始位置
    public float currentY=40;
    public DrawView(Context context) {
        super(context);
    }
    public DrawView(Context context, AttributeSet attrs){
        super(context,attrs);
    }
    public void onDraw(Canvas canvas){  在画布上定义一个画笔
        super.onDraw(canvas);
        Paint p=new Paint();
        p.setColor(Color.CYAN);
        canvas.drawCircle(currentX,currentY,15,p);  画一个圆
    }
    public boolean onTouchEvent(MotionEvent event){  实现触摸事件
        super.onTouchEvent(event);
        currentX=event.getX();
        currentY=event.getY();
        invalidate();
        return true;
    }
}

布局文件layout
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <com.example.a4_333.DrawView    //创建DrawView组件 完整的包名类名
        android:id="@+id/draw"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</FrameLayout>

3.监听的顺序:组件绑定的监听器—事件回调方法—传播到该组件所在的Activity。若果任何一个时间返回true,name该事件不再外传

创建一个layout
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/root">

</FrameLayout>
创建DrawView类实现事件
package com.example.a4_332b;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.MotionEvent;
import android.view.View;

public class DrawView extends View {
    public float currentX;
    public float currentY;
    public DrawView(Context context) {
        super(context);
    }
    public void onDraw(Canvas canvas){
        super.onDraw(canvas);
        Paint p=new Paint();
        p.setColor(Color.CYAN);
        canvas.drawCircle(currentX,currentY,15,p);
    }
    public boolean onTouchEvent(MotionEvent event){
        super.onTouchEvent(event);
        currentX=event.getX();
        currentY=event.getY();
        invalidate();
        System.out.println("调用了DrawView类的onTouchEvent()回调方法");
        return false;   //向外传播--2
    }
}

package com.example.a4_332b;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.FrameLayout;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        FrameLayout frame=(FrameLayout) findViewById(R.id.root);
        final DrawView draw=new DrawView(this);
        frame.addView(draw);
        draw.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
            System.out.println("调用了DrawView类的事件监听方法");
                return false;             //传播出去--1            
            }

        });
    }
    public boolean onTouchEvent(MotionEvent event){
        super.onTouchEvent(event);
        System.out.println("调用了MainActivity的onTouchEvent()回调方法");
        return  true;           //不传播 --3
    }
}

如果都是false则一直传播,显示为点击移动,而不是触摸移动。

onDraw方法的学习推荐一个不错的网页

4.重写onKeyDown()方法,参数KeyCode是指键盘码,可以通过判断返回的Key code是什么数值来判断用户按下的是什么按键

物理按键 KeyEvent 说明
电源 KEYCODE_POWER 启动或唤醒设备,将界面切换到酸丁的屏幕
后退 KEYCODE_BACK 返回前一个界面
菜单 KEYCODE_MENU 显示当前应用的可用菜单
HOME键 KEYCODE_HOME 返回到HOME界面
搜索键 KEYCODE_SEARCH 当前应用中启动搜索
相机键 KEYCODE_CAMERA 启动相机
音量键 KEYCODE_VOLUME_UR KEYCODE_VOLUME_DOWN 控制上下文音量,例如音乐播放器,手机铃声等
方向键 KEYCODE_DPAD_CENTER/UP/DOWN/LEFT/RIGHT 某些设备中包含的方向键,用于移动光标等
键盘键 KEYCODE_0…/9…/A…/Z 数字0-9,字母A-Z等键
发布了15 篇原创文章 · 获赞 0 · 访问量 139

猜你喜欢

转载自blog.csdn.net/qq_44230959/article/details/105496769