As基于回调的监听

1.View类的常见回调方法

序号方法作用
01boolean onKeyDown(int keyCode,KeyEvent event)捕捉手机键盘的事件,即键盘码。event为按键事件的对象,封装了触发事件的各种信息
02boolean onKeyUp(int keyCode,KeyEvent event)捕捉手机键盘按键抬起的事件
03boolean onTouchEvent( MotionEvent)触摸事件,包括按下,抬起,滑动
04boolean onKeyLongPress(int KeyCode,KeyEvent event)长按触发事件
05boolean onKeyShortcut(int KeyCode,KeyEvent event)当一个快捷键事件时触发该方法
06boolean 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等键
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值