精华内容
下载资源
问答
  • 安卓按键事件

    2021-01-12 17:18:48
    能利用安卓按键事件处理编写应用 一、安卓界面事件 (一)安卓常用事件 1、单击事件 当用户触碰到某个组件或者方向键被按下时产生该事件,该事件的监听器是View.OnClickListener,事件处理方法是onClick()。 2、焦点...

    零、学习目标
    能说出常用的安卓界面事件
    能利用安卓按键事件处理编写应用
    一、安卓界面事件
    (一)安卓常用事件
    1、单击事件
    当用户触碰到某个组件或者方向键被按下时产生该事件,该事件的监听器是View.OnClickListener,事件处理方法是onClick()。
    2、焦点事件
    组件得到或者失去焦点时产生该事件,监听器是View.OnFocusChangeListener,事件处理方法是onFocusChange()。
    3、按键事件
    用户按下或者释放手机键盘上的某个按键时产生,监听器是View.OnKeyListener, 事件处理方法是onKey()。
    4、触碰事件
    手机上具有触屏功能时,触碰屏幕产生该事件,监听器是View.OnTouchListener,事件处理方法是onTouch()。
    (二)安卓事件处理方式
    1、基于回调的事件处理机制
    基于回调的事件处理方式,在Activity生命周期那部分已经涉及到了七个回调方法。 (onCreate - onDestroy, onStart - onStop, onResume - onPause, onRestart )
    2、基于监听的事件处理机制
    注册事件监听器
    实现事件监听器接口
    编写事件处理代码
    二、教学案例——通过按键移动米老鼠
    (一)运行效果
    在这里插入图片描述
    通过按上、下、左、右方向键来移动米老鼠。
    (二)涉及知识点

    1、线性布局(LinearLayout)
    2、图像视图(ImageView)
    (1)图像源 – src
    (2)背景 – background
    (3)比例类型 – scaleType
    3、安卓按键事件处理
    (三)实现步骤
    1、创建安卓应用【MoveMickeyByKey】
    在这里插入图片描述
    在这里插入图片描述
    2、准备背景图片与米老鼠图片,拷贝到drawable目录里
    在这里插入图片描述
    3、主布局资源文件activity_main.xml
    在这里插入图片描述

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/root"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/background"
    android:gravity="center"
    android:orientation="vertical">
    
    <ImageView
    android:id="@+id/ivMickey"
    android:layout_width="100dp"
    android:layout_height="120dp"
    android:scaleType="fitXY"
    android:src="@drawable/mickey" />
    
    </LinearLayout>
    

    4、主界面类MainActivity
    在这里插入图片描述

    package net.hw.movemickeybykey;
    
    import android.os.Bundle;import android.view.KeyEvent;import android.view.View;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.Toast;
    
    import androidx.appcompat.app.AppCompatActivity;
    
    public class MainActivity extends AppCompatActivity {
    protected static final int STEP = 10;
    private ImageView ivMickey;
    private LinearLayout root;
    private LinearLayout.LayoutParams layoutParams;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // 利用布局资源文件设置用户界面
    setContentView(R.layout.activity_main);
    // 通过资源索引获得控件实例
    ivMickey = findViewById(R.id.ivMickey);
    root = findViewById(R.id.root);
    
    // 设置根布局可以获得焦点
    root.setFocusable(true);
    // 让根布局获得焦点
    root.requestFocus();
    
    // 获取图像控件的布局参数
    layoutParams = (LinearLayout.LayoutParams) ivMickey.getLayoutParams();
    
    // 给根布局注册监听器
    root.setOnKeyListener(new View.OnKeyListener() {
    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
    switch (keyCode) {
    // 根据按键修改图像控件的布局参数
    case KeyEvent.KEYCODE_DPAD_UP: // 按上方向键
    // 上边界碰撞检测
    if (ivMickey.getTop() >= 10) {
    layoutParams.topMargin = layoutParams.topMargin - STEP;
    } else {
    Toast.makeText(MainActivity.this, "碰到上边界~", Toast.LENGTH_SHORT).show();
    }
    break;
    case KeyEvent.KEYCODE_DPAD_DOWN: // 按下方向键
    layoutParams.topMargin = layoutParams.topMargin + STEP;
    break;
    case KeyEvent.KEYCODE_DPAD_LEFT: // 按左方向键
    layoutParams.leftMargin = layoutParams.leftMargin - STEP;
    break;
    case KeyEvent.KEYCODE_DPAD_RIGHT: // 按右方向键
    layoutParams.leftMargin = layoutParams.leftMargin + STEP;
    break;
    }
    // 重新设置图像控件的布局参数
    ivMickey.setLayoutParams(layoutParams);
    
    return false;
    }
    });
    }}
    

    5、启动应用,查看效果
    在这里插入图片描述

    6、代码说明
    如果根布局没有获得焦点,那么按键不会移动米老鼠
    三、常用物理键
    1、HOME键
    keyCode == KeyEvent.KEYCODE_HOME
    判断用户是否按下了HOME物理键
    2、Back键
    keyCode == KeyEvent.KEYCODE_BACK
    判断用户是否按下了BACK物理键
    3、Menu键
    keyCode == KeyEvent.KEYCODE_MENU
    判断用户是否按下了MENU物理键

    展开全文
  • 文章目录零、学习目标一、安卓界面事件(一)安卓常用事件1、单击事件2、焦点事件3、按键事件4、触碰事件(二)安卓事件处理方式1、基于回调的事件处理机制2、基于监听的事件处理机制二、教学案例——通过按键移动...

    零、学习目标

    1. 能说出常用的安卓界面事件
    2. 能利用安卓按键事件处理编写应用

    一、安卓界面事件

    (一)安卓常用事件

    1、单击事件

    当用户触碰到某个组件或者方向键被按下时产生该事件,该事件的监听器是View.OnClickListener,事件处理方法是onClick()

    2、焦点事件

    组件得到或者失去焦点时产生该事件,监听器是View.OnFocusChangeListener,事件处理方法是onFocusChange()

    3、按键事件

    用户按下或者释放手机键盘上的某个按键时产生,监听器是View.OnKeyListener, 事件处理方法是onKey()

    4、触碰事件

    手机上具有触屏功能时,触碰屏幕产生该事件,监听器是View.OnTouchListener,事件处理方法是onTouch()

    (二)安卓事件处理方式

    1、基于回调的事件处理机制

    基于回调的事件处理方式,在Activity生命周期那部分已经涉及到了七个回调方法。 (onCreate - onDestroy, onStart - onStop, onResume - onPause, onRestart

    2、基于监听的事件处理机制

    • 注册事件监听器
    • 实现事件监听器接口
    • 编写事件处理代码

    二、教学案例——通过按键移动米老鼠

    (一)运行效果

    在这里插入图片描述
    通过按上、下、左、右方向键来移动米老鼠。

    (二)涉及知识点

    1、线性布局(LinearLayout)
    2、图像视图(ImageView)
    (1)图像源 – src
    (2)背景 – background
    (3)比例类型 – scaleType
    3、安卓按键事件处理

    (三)实现步骤

    1、创建安卓应用【MoveMickeyByKey】

    在这里插入图片描述
    在这里插入图片描述

    2、准备背景图片与米老鼠图片,拷贝到drawable目录里

    在这里插入图片描述

    3、主布局资源文件activity_main.xml

    在这里插入图片描述

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/root"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/background"
        android:gravity="center"
        android:orientation="vertical">
    
        <ImageView
            android:id="@+id/ivMickey"
            android:layout_width="100dp"
            android:layout_height="120dp"
            android:scaleType="fitXY"
            android:src="@drawable/mickey" />
    
    </LinearLayout>
    

    4、主界面类MainActivity

    在这里插入图片描述

    package net.hw.movemickeybykey;
    
    import android.os.Bundle;
    import android.view.KeyEvent;
    import android.view.View;
    import android.widget.ImageView;
    import android.widget.LinearLayout;
    import android.widget.Toast;
    
    import androidx.appcompat.app.AppCompatActivity;
    
    public class MainActivity extends AppCompatActivity {
        protected static final int STEP = 10;
        private ImageView ivMickey;
        private LinearLayout root;
        private LinearLayout.LayoutParams layoutParams;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            // 利用布局资源文件设置用户界面
            setContentView(R.layout.activity_main);
            // 通过资源索引获得控件实例
            ivMickey = findViewById(R.id.ivMickey);
            root = findViewById(R.id.root);
    
            // 设置根布局可以获得焦点
            root.setFocusable(true);
            // 让根布局获得焦点
            root.requestFocus();
    
            // 获取图像控件的布局参数
            layoutParams = (LinearLayout.LayoutParams) ivMickey.getLayoutParams();
    
            // 给根布局注册监听器
            root.setOnKeyListener(new View.OnKeyListener() {
                @Override
                public boolean onKey(View v, int keyCode, KeyEvent event) {
                    switch (keyCode) {
                        // 根据按键修改图像控件的布局参数
                        case KeyEvent.KEYCODE_DPAD_UP: // 按上方向键
                            // 上边界碰撞检测
                            if (ivMickey.getTop() >= 10) {
                                layoutParams.topMargin = layoutParams.topMargin - STEP;
                            } else {
                                Toast.makeText(MainActivity.this, "碰到上边界~", Toast.LENGTH_SHORT).show();
                            }
                            break;
                        case KeyEvent.KEYCODE_DPAD_DOWN: // 按下方向键
                            layoutParams.topMargin = layoutParams.topMargin + STEP;
                            break;
                        case KeyEvent.KEYCODE_DPAD_LEFT: // 按左方向键
                            layoutParams.leftMargin = layoutParams.leftMargin - STEP;
                            break;
                        case KeyEvent.KEYCODE_DPAD_RIGHT: // 按右方向键
                            layoutParams.leftMargin = layoutParams.leftMargin + STEP;
                            break;
                    }
                    // 重新设置图像控件的布局参数
                    ivMickey.setLayoutParams(layoutParams);
    
                    return false;
                }
            });
        }
    }
    

    5、启动应用,查看效果

    在这里插入图片描述

    6、代码说明

    • 如果根布局没有获得焦点,那么按键不会移动米老鼠
      在这里插入图片描述
    • 要将图像的布局参数类型转换成线性布局的布局参数
      在这里插入图片描述

    三、常用物理键

    1、HOME键

    • keyCode == KeyEvent.KEYCODE_HOME
    • 判断用户是否按下了HOME物理键

    2、Back键

    • keyCode == KeyEvent.KEYCODE_BACK
    • 判断用户是否按下了BACK物理键

    3、Menu键

    • keyCode == KeyEvent.KEYCODE_MENU
    • 判断用户是否按下了MENU物理键

    四、课后作业

    任务:避免米老鼠移出界外

    教学案例里的米老鼠不会移出上边界,但是会移出其它边界,请给代码添加边界检测功能,让米老鼠只能在手机屏幕内移动,而不能移出边界之外。

    展开全文
  • 安卓按键事件分发处理机制

    千次阅读 2016-11-24 21:21:09
    安卓按键KeyEvent传递过程

    一、KeyEvent传递过程

    主要可以划分为三步:过滤器、View树、Activity。

    1.WindowManagerService.java内有两个线程,一个负责分发按键消息,一个负责读取按键消息。在执行processEvent分发事件时,系统有一些过滤器可以进行一些特定的处理操作,这些过滤器的处理既可以在事件分发前也可以在事件分发后。比如home键在分发前进行处理消费,应用无法监听该类消息,而返回键是在事件分发之后,只有当应用不进行处理时,系统才会处理返回键用来退出当前Activity,

    2.processEvent分发事件后,先传递到ViewRootImpl的deliverKeyEvent中,如果mView(即根DecorView)为空或者mAdded为false,则直接返回。若不为空,然后判断IME窗口(输入法)是否存在,若存在则优先传递到IME中,当输入窗口没有处理这个事件,事件则会真正派发到视图mView.dispatchKeyEvent中,然后回调Activity的dispatchKeyEvent(event)去处理,由于Activity中的dispatchKeyEvent最终调用的是mDecor中的superDispatchKeyEvent(event),之后就是ViewGroup通过递归调用把Event传递到指定的View上。

    3.事件传递到VIew之后,先会调用View的dispatchKeyEvent,如果有注册Listener,就直接调用Listener的onKey去响应,如果没有注册Listener,z之后会根据Action的类型调用对应的onXXX(onKeyDown,onKeyup)函数去处理,如果所有的view都没有进行处理,那么最终会回调到activity的onXXX方法中。

    二、Activity View的dispatchKeyEvent,onkeyDown,onKeyUp, setListener处理顺序

    1. Activity.dispatchKeyEvent(down) ----->view.dispatchKeyEvent ------>view.setListener(如setOnKeyListener) ------>view.onkeyDown------->Activity.onkeyDown------>Activity.dispatchKeyEven(up)------>view.dispatchKeyEvent---->view.setListener(如setOnKeyListener) ------>view.onkeyup----->view.onClick(setOnClickListener)---->Activity.onkeyUp

            2. 当一个event事件传递到某个view上时,如果一些Action(比如Down)进行了消费后,则该View下的子view以及想消费该event的Action的行为都不会执行。默认情况下,ViewGroup控件不会执行onkeyDown和onkeyup,只有当其焦点属性为true时,才可以传递到执行


    展开全文
  • 安卓 按键点击事件

    2015-01-29 10:26:54
    导入OnClickListener类,安卓中已经定义好了OnClickListener接口,所以想添加点击事件只需要去实现这个接口就好了。 点击事件在初学中碰到了这几种: 一:PreButton.setOnClickListener(new PreOnClick

    初玩安卓,随便留点东西,十里坡剑神。


    import android.view.View.OnClickListener;

    导入OnClickListener类,安卓中已经定义好了OnClickListener接口,所以想添加点击事件只需要去实现这个接口就好了。

    点击事件在初学中碰到了这几种:

    一:PreButton.setOnClickListener(new PreOnClickListener());

    注意点击响应事件都是实际对象,此时先用new创建一个类对象。

    PreOnClickListener()类必须实现OnClickListener,所以用implements。OnClickListener接口中唯一个方法就是onClick(View view)

    实现该方法就是实现点击响应事件。

    二:newButton.setOnClickListener(this);

    用this来指代自身这个对象,所以此类在声明的时候需用implements去实现接口。

    然后实现onClick(View view)即可完成调用。


    现在顺带记两个点击事件方法。

    1. 以下方法可实现显示图片数组。

    private ImageView pictImageView=null;

      pictImageView = (ImageView)super.findViewById(R.id.Picture);

    pictImageView.setImageResource(iImages[i]);

    2.    以下可实现多个按键的方法体,相当于switch用法

            View continueButton = findViewById(R.id.cont_button);
            View newButton = findViewById(R.id.new_button);
            View aboutButton = findViewById(R.id.about_button);
            View exitButton = findViewById(R.id.exit_button);

    findViewById()注意是View类型的。

    public void onClick(View v)

    {

    switchi( v.getId() )

    case R.id.about_button:

    }

    v.getId()是View的一个方法

    从一个activity切到另一个activity,Intent用法如下

     Intent intent = new Intent(this,About.class);
        startActivity(intent);

    展开全文
  • android应用发送按键事件 模拟按键事件分发 主要用到了以下三种方法: Instrumentation 标准写法如下,缺点是不能跨进程 private void sentKey(final int keyCode) { Log.d(TAG,"---sentKey---, keyCode : " + ...
  • 安卓TimePicker通过按键事件与其他控件进行焦点切换
  • 安卓后台监听按键事件

    万次阅读 2017-04-20 18:22:36
    我们都知道要做监听的话...可以用的方法利用AccessibilityService(安卓的无障碍辅助功能)步骤.1.配置文件代码&lt;application&gt; &lt;service android:name="你的无障碍辅助类名" andr...
  • 在游戏开发中,需要对安卓平台的菜单键和返回键的点击做处理,如下:3.x 版本auto keyboardListener = EventListenerKeyboard::create(); keyboardListener->onKeyReleased = [](EventKeyboard::KeyCode keycode, ...
  •  在一个activity 重载父类 的下面这三个方法来处理按键事件 public boolean onKeyDown(int keyCode, KeyEvent event):  public boolean onKeyUp(int keyCode, KeyEvent event):  public boolean onKeyLongPress...
  • Android实现监听连续点击事件源码.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
  • android系统模拟点击事件发送QQ消息.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
  • android注入代码到驱动模拟系统点击事件demo.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
  • 我的做法是在PhoneWindowManager.java 这个文件中,在interceptBeforeQueueing 函数中 通过 return ACTION_PASS_TO_USER 来决定是否分发给ap ,但现在通过这种... 所以想问下apk如果监听按键事件的话有 是有多种方法吗
  • 首先大致看看安卓按键事件的默认分发机制 package com.example.keytest; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.KeyEvent...
  •  相信使用过TimePicker的人都知道,这个控件本身有自己的按键事件(如果设置可获取焦点”focusable(true)”时,这个控件本身的按键事件将“失效”,这时按上、下键都不能选择时间而只是改变焦点的位置) ...
  • 安卓开发12:安卓各种事件操作

    千次阅读 2013-07-01 13:43:50
    先看一个OnClick 安卓中的Button的点击事件: activity_main.xml:android:onClick="Hello" 定义了一个Onclick的点击事件,点击之后,触发MainActivity中的Hello函数。 <RelativeLayout xmlns:and
  • 继续在网上搜索安卓按键模拟(其实那时都不知道用什么关键字好了,能想到的关键字都用遍了,但是搜索出来的结果,都是之前提到的那几个依赖源码环境和系统权限的方案)。发现有很多介绍ADB调试,向手机发送按键事件...
  • 安卓中为按钮绑定监听器的方式有两种:①布局文件中声明②代码中新建监听器并绑定;在实现"BY战机"中,我采用了第二种,即在代码中建立监听器。为了以后复习学习和网友交流,在此我同时介绍一...
  • 前一天学习了Spinner控件的使用方法。Spinner控件的数据可以在values资源中指定,也可以通过适配器指定。...今天将学习按键事件监听的实现。主要通过一个控制球员头像位置的程序实现,如图1所示。当按下模拟设备键盘的S
  •  上一篇文中介绍了触控事件的机制,其实按键事件和他很相似,基本也传递和分发(拦截不存在,你无法阻止实际物理键的按下去),主要有dispatchKeyEvent(KeyEvent event),onKeyUp和onKeyDown, **dispatchKeyEvent...
  • 在做自定义弹窗的时候遇到的问题,如果不继承Dialog 或者popwindow 自己写的通过 getWindow的decorView 给decorView view 动态添加View 和移除View实现弹窗会出现返回按键如果是弹窗情况下需要关闭弹窗(即移除View) ,...

空空如也

空空如也

1 2 3 4 5 ... 13
收藏数 241
精华内容 96
关键字:

安卓按键事件