.Net 转战 Android 4.4 日常笔记(8)--常见事件响应及实现方式

本文深入探讨Android开发中的事件处理机制,包括单击、长按、滑动、键盘与焦点事件,并详细说明如何通过动态、配置与可复用方式设置事件监听器,以及触摸事件的组成部分和容器事件获取X、Y坐标的应用。同时,解释长按事件与点击事件的交互逻辑,以及如何利用焦点事件和键盘事件进行交互操作。
在Andrioid开发中,常见的事件如下
  1. 单击事件 OnClickListener
  2. 长按事件 OnLongClickListener
  3. 滑动事件 OnTouchListenner
  4. 键盘事件 OnKeyListenner
  5. 焦点事件 setOnFoucsChangeListener

设置方式

1.动态设置(最常用的方式)

 Button btn = (Button) findViewById(R.id.btnTest);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Log.i("Tip","按钮被点击了");
            }
        });

2.配置方式(仅限于Button的OnClick事件)

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Test1"
        android:id="@+id/btnTest1"
        android:layout_below="@+id/btnTest"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="56dp"
        android:onClick="Test1"/>

在拖入的控件加入 android:onClick="Test1" ,后台必须有Test1方法对应,在Test1按Alt+Enter创建方法

   public void Test1(View view) {
        //传入的View是当前的button
        Button btn = (Button)view;
        btn.setText("改变了按钮的文本");
        Log.i("Tip","配置的按钮被点击了!");
    }

3.可复用方式(这种方式适用于重复可复用代码)

首先在我们的MainActivity加入方法

private View.OnClickListener listener = new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Log.i("Tip","监听到按钮点击!");
        }
    };

拖入3个按钮并设置ID分别为btnTest2,btnTest3,btnTest4

在onCreate方法中加入这3个按钮的事件。

     Button btn2 = (Button) findViewById(R.id.btnTest2);
        Button btn3 = (Button) findViewById(R.id.btnTest3);
        Button btn4 = (Button) findViewById(R.id.btnTest4);
        btn2.setOnClickListener(listener);
        btn3.setOnClickListener(listener);
        btn4.setOnClickListener(listener);

这样我们用了更少的代码获得更清晰的结构

接下来我们要在方法中判断是那个按钮点击了

    private View.OnClickListener listener = new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            //通过getId来获取触发的是那个按钮
            switch(view.getId())
            {
                case
                        R.id.btnTest2: Log.i("Tip","点击按钮2!");
                    break;
                case
                        R.id.btnTest3: Log.i("Tip","点击按钮3!");
                    break;
                case
                        R.id.btnTest4: Log.i("Tip","点击按钮4!");
                    break;
            }
        }
    };

查看结果

长按和点击事件存在产生的问题

如果我们一个事件同时绑定了OnClick事件和OnLongClick事件,会发生什么!

拖入一个button Id为btnTest5,并绑定2个事件

  Button btn5 = (Button) findViewById(R.id.btnTest5);
        btn5.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Log.i("Tip","按钮被点击了");
            }
        });

        btn5.setOnLongClickListener(new View.OnLongClickListener(){
            @Override
            public boolean onLongClick(View view) {
                Log.i("Tip","按钮被长按了了");
                return false;
            }
        });

我们长按后松开按钮看看打印出什么(2个事件触发了,但是我们貌似只要长按,在我们理解中,长按就是长按,单击就是单击)

这时我们看看帮助文档怎么说

Returns

true if the callback consumed the long click, false otherwise.

大约理解到 

onLongClick 返回 true时候会回调消耗这个事件不会往下传递,现在我们改下代码

btn5.setOnLongClickListener(new View.OnLongClickListener(){
            @Override
            public boolean onLongClick(View view) {
                Log.i("Tip","按钮被长按了");
                return true;
            }
        });

运行之后的点击只显示长按事件的触发

触摸事件

Touch事件由元事件组成action_up,action_down,action_move等等....

 Button btn6 = (Button) findViewById(R.id.btnTest6);
        //Touch事件由元事件组成action_up,action_down,action_move等等....
        btn6.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
               int event = motionEvent.getAction();
                if(event==MotionEvent.ACTION_DOWN)
                {
                    Log.i("Tip","被按下...");
                }
                else  if(event==MotionEvent.ACTION_MOVE)
                {
                    Log.i("Tip","被移动...");
                }
                else  if(event==MotionEvent.ACTION_UP)
                {
                    Log.i("Tip","被松开...");
                }
                return false;
            }
        });

可以看到鼠标按后在上面移动后松开的事件触发!

再来看一个有趣的动作,可以移动的按钮,根据容器的event获取 X和Y坐标给按钮

现在打开MainActivity.xml的给容器一个ID值

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context="com.ymnets.testtouchlistener.app.MainActivity"
    android:id="@+id/myLayout" >

改变一下代码

  ViewGroup viewGroup = (ViewGroup) findViewById(R.id.myLayout);
        final Button btn = (Button)findViewById(R.id.button);
        //Touch事件由元事件组成action_up,action_down,action_move等等....
        viewGroup.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                int event = motionEvent.getAction();
                if(event==MotionEvent.ACTION_MOVE)
                {
                    btn.setX(motionEvent.getX());
                    btn.setY(motionEvent.getY());
                    Log.i("Tip","被移动...");
                }
                return true;
            }
        });

其中ViewGroup其实就是布局,View就是组件元素

现在大力的移动手指吧!

焦点事件

焦点事件跟我们的JS的焦点事件基本一个性质。

但是Android得到焦点和失去焦点都在同个方法内运行

随便拖一个TextBox在安卓里面叫EditText

输入事件代码

EditText editText = (EditText) findViewById(R.id.editText);
        editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View view, boolean b) {
                Log.i("Tip","有焦点了...");
            }
        });

当文本框得到和失去焦点时候都会出现日志

05-20 05:03:52.009    1165-1165/com.ymnets.testtouchlistener.app I/Tip﹕ 有焦点了...

键盘事件

设置我们文本框的键盘事件!

  editText.setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View view, int i, KeyEvent keyEvent) {
                if(keyEvent.getAction()==KeyEvent.ACTION_UP) {
                    Log.i("Tip", i + "");
                }
                return false;
            }
        });

其中的i是keyCode,输出了keyCode

当然我们也可以根据keyCode去获取点击了哪个键!实际上非常有趣...

内容概要:本文详细介绍了一个基于C++的养老院管理系统的设计与实现,旨在应对人口老龄化带来的管理挑战。系统通过整合住户档案、健康监测、护理计划、任务调度等核心功能,构建了从数据采集、清洗、AI风险预测到服务调度与可视化的完整技术架构。采用C++高性能服务端结合消息队列、规则引擎和机器学习模型,实现了健康状态实时监控、智能任务分配、异常告警推送等功能,并解决了多源数据整合、权限安全、老旧硬件兼容等实际问题。系统支持模块化扩展与流程自定义,提升了养老服务效率、医护协同水平和住户安全保障,同时为运营决策提供数据支持。文中还提供了关键模块的代码示例,如健康指数算法、任务调度器和日志记录组件。; 适合人群:具备C++编程基础,从事软件开发或系统设计工作1-3年的研发人员,尤其是关注智慧养老、医疗信息系统开发的技术人员。; 使用场景及目标:①学习如何在真实项目中应用C++构建高性能、可扩展的管理系统;②掌握多源数据整合、实时健康监控、任务调度与权限控制等复杂业务的技术实现方案;③了解AI模型在养老场景中的落地方式及系统架构设计思路。; 阅读建议:此资源不仅包含系统架构与模型描述,还附有核心代码片段,建议结合整体设计逻辑深入理解各模块之间的协同机制,并可通过重构或扩展代码来加深对系统工程实践的掌握。
内容概要:本文详细介绍了一个基于C++的城市交通流量数据可视化分析系统的设计与实现。系统涵盖数据采集与预处理、存储与管理、分析建模、可视化展示、系统集成扩展以及数据安全与隐私保护六大核心模块。通过多源异构数据融合、高效存储检索、实时处理分析、高交互性可视化界面及模块化架构设计,实现了对城市交通流量的实时监控、历史趋势分析与智能决策支持。文中还提供了关键模块的C++代码示例,如数据采集、清洗、CSV读写、流量统计、异常检测及基于SFML的柱状图绘制,增强了系统的可实现性与实用性。; 适合人群:具备C++编程基础,熟悉数据结构与算法,有一定项目开发经验的高校学生、研究人员及从事智能交通系统开发的工程师;适合对大数据处理、可视化技术和智慧城市应用感兴趣的技术人员。; 使用场景及目标:①应用于城市交通管理部门,实现交通流量实时监测与拥堵预警;②为市民出行提供路径优化建议;③支持交通政策制定与信号灯配时优化;④作为智慧城市建设中的智能交通子系统,实现与其他城市系统的数据协同。; 阅读建议:建议结合文中代码示例搭建开发环境进行实践,重点关注多线程数据采集、异常检测算法与可视化实现细节;可进一步扩展机器学习模型用于流量预测,并集成真实交通数据源进行系统验证。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值