Android基础——物理按键,长按,触摸事件及其监听器

布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/relationLayout"
    tools:context=".MainActivity">

    <ImageButton
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="长按按钮"
        />

</RelativeLayout>

java代码:长按这块还有点问题

package com.example.myeventi;

import androidx.appcompat.app.AppCompatActivity;

import android.app.Activity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.RelativeLayout;
import android.widget.Toast;

public class MainActivity extends Activity{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //2.2:把长按事件注册到菜单中,并打开菜单,在onCreate中执行
        ImageButton button1 = (ImageButton)findViewById(R.id.button1);
        button1.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                registerForContextMenu(v);//把长按事件注册到ContextMenu中
                openContextMenu(v);//打开菜单
                return false;
            }
        });

        //3.2:创建并实例化TouchView类的对象,并为TouchView添加触摸事件监听器,
        //      在重写的方法中根据触摸的位置重绘TouchView
        final TouchView touchView = new TouchView(MainActivity.this);
        touchView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                touchView.bitmapX = event.getX()-80;//设定坐标;
                touchView.bitmapY = event.getY()-80;
                touchView.invalidate();//重新绘制
                return true;
            }
        });
        //3.3:把TouchView更新到布局管理器中
        RelativeLayout relativeLayout = (RelativeLayout) findViewById(R.id.relationLayout);
        relativeLayout.addView(touchView);
    }

    /*
    1:基本按钮连续按两次返回键退出应用
    */
    private static long lastTime = 0;
    //1.1:重写onKeyDown()方法拦截用户单击后退按钮事件
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if(keyCode == KeyEvent.KEYCODE_BACK){
            exit();
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }
    //1.2:创建退出方法exit(),需要判断两次按下返回键的时间差
    public void exit(){
        if(System.currentTimeMillis()-lastTime > 2000){//只按了一次
            Toast.makeText(
                    MainActivity.this,"再按一次退出程序",Toast.LENGTH_SHORT
            ).show();
            lastTime = System.currentTimeMillis();
        }
        else {//连按两次就退出
            finish();
            System.exit(0);
        }
    }

    /*
    * 2:长按事件监听器
    * */
    //2.1:在MainActivity中重写onCreateContextMenu菜单,为菜单添加选项值
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        menu.add("收藏");
        menu.add("举报");
    }
    //2.2:把长按事件注册到菜单中,并打开菜单,在onCreate中执行

    /*
    * 3.触摸事件监听器
    * */
    //3.1:新建TouchView类呈现触摸所在地的图像
    //3.2:创建并实例化TouchView类的对象,并为TouchView添加触摸事件监听器,
    //      在重写的方法中根据触摸的位置重绘TouchView
    //3.3:把TouchView更新到布局管理器中
}

原文地址:https://www.cnblogs.com/zsben991126/p/12238670.html

时间: 2024-11-06 22:26:08

Android基础——物理按键,长按,触摸事件及其监听器的相关文章

android中View点击和触摸事件的处理

android中的事件类型分为按键事件和屏幕触摸事件,Touch事件是屏幕触摸事件的基础事件,有必要对它进行深入的了解. 一个最简单的屏幕触摸动作触发了一系列Touch事件:ACTION_DOWN->ACTION_MOVE->ACTION_MOVE->ACTION_MOVE...->ACTION_MOVE->ACTION_UP 当屏幕中包含一个ViewGroup,而这个ViewGroup又包含一个子view,这个时候android系统如何处理Touch事件呢?到底 是View

关于Android中物理按键不响应的可能的一个问题。

今天在工作中犯了一个错误,写的视频播放器突然物理音量键就不起作用了.一开始以为是自定义的音量条把系统的物理音量条按键给屏蔽掉了.删除自定义的音量条还是不行,又怀疑是是添加了什么权限之类的,反复尝试都不是那些原因.最后发现是onKeyDown物理按键的监听事件的问题!!!重新onKeyDown方法的时候,我竟然鬼使神差的返回true!!!返回true的意思是不是back按钮的都不继续往下传递响应,就是这里的原因.改成return false就好了.以此为戒,谨记谨记!!! 版权声明:本文为博主原创

【android学习】安卓设备实现触摸事件的监听,跨进程事件注入

最近想实现触摸屏的事件记录,并且分别做时间戳标记,类似于adb shell 下的getevent/setevent,查了很多资料,下面是一些总结. 实现方法: 1.利用onclick方法等.这种方法只能用于自己的Activity和View中,如果要检测其他Activity,比如键盘就不行了. 2.从linux内核入手.在事件分发前截获事件,可以对任意Activity实现事件捕获. android触摸事件的流程: http://blog.csdn.net/sunnyfans/article/det

Android(Linux)模拟按键、触摸屏等事件

前提: 在我们应用程序或者在写Android自动化测试时候常常会需要模拟实体按键,来给我们做测试用.这也是我要整理的目的.主要的涉及的是Linux Input Event事件.以下的例子基于Android 5.1(Linux-3.10). 一.利用getevent.sendevent模拟按键 (1)命令:getevent -t 结果: ... add device 6: /dev/input/event9 bus: 0000 vendor 0000 product 0000 version 00

Android好奇宝宝_08_乱侃触摸事件传递

讲解触摸事件传递原理的网上有一大把,有从源码角度讲的,有从实际例子角度讲的.我这里呢只是记录下自己的理解,讲的可能没其他大牛透彻,有错误的跪求评论指正. 直接上图,对照图解和文字来分析触摸事件的传递. (1)乱七八糟图解版: (2)看图说话: (2.1)上图并不包含Activity,Activity没有onInterceptTouchEvent方法,默认实现都是直接往下传递. (2.2)讲解3个触摸事件控制方法的含义及其返回值的意义: <1>onInterceptTouchEvent onIn

Android6.0触摸事件分发机制解读

本篇博文是Android触摸事件分发机制系列博文的第一篇,带领大家从全局掌握Android触摸事件分发机制.特别声明的是,本源码解读是基于最新的Android6.0版本. (一)Android6.0源码解读之View点击事件分发机制 (二)Android6.0源码解读之ViewGroup点击事件分发机制 (三)Android6.0源码解读之Activity点击事件分发机制 为什么要解读触摸事件分发机制 1.掌握View事件分发机制 2.为解决View滑动冲突提供理论支持 3.了解Android最

Android基础入门教程——2.2.4 FrameLayout(帧布局)

Android基础入门教程--2.2.4 FrameLayout(帧布局) 标签(空格分隔): Android基础入门教程 本节引言: FrameLayout(帧布局)可以说是六大布局中最为简单的一个布局,这个布局直接在屏幕上开辟出 一块空白的区域,当我们往里面添加控件的时候,会默认把他们放到这块区域的左上角,而这种布局方式 却没有任何的定位方式,所以它应用的场景并不多;帧布局的大小由控件中最大的子控件决定,如果控件 的大小一样大的话,那么同一时刻就只能看到最上面的那个组件!后续添加的控件会覆盖

cocos2d-x之监听手机的物理按键

1 //如何监听按键事件 2 //创建物理按键的监听事件 3 auto listener = EventListenerKeyboard::create(); 4 //按键被释放时执行的操作,EventKeyboard::KeyCode表示按键代码 5 listener->onKeyReleased = [](EventKeyboard::KeyCode code,Event *e){ 6 log("Key Code : %d",code);//显示按键的值 7 //按下后退键关

HTML5触摸事件演化tap事件

触摸事件是移动浏览器特有的HTML5事件,虽然click事件在pc和移动端更通用,但是在移动端会出现300ms延迟,较为影响用户体验,300ms延迟来自判断双击和长按,因为只有默认等待时间结束以确定没有后续动作发生时,才会触发click事件.所以触摸事件反应更快,体验更好. 触摸事件的类型: 为了区别触摸相关的状态改变,存在多种类型的触摸事件.可以通过检查触摸事件的 TouchEvent.type 属性来确定当前事件属于哪种类型. 注意: 在很多情况下,触摸事件和鼠标事件会同时被触发(目的是让没