zoukankan      html  css  js  c++  java
  • Android事件处理和手势

    一、事件处理概述

    1、基于监听的事件处理

    之前介绍的单击事件监听器等。

    2、基于回调的事件处理

    有两种方式:

    ① 重写Android组件的回调方法。

    ② 重写Activity的回调方法。

    经常重写的方法有三个:触摸方法:onTouchEvent()、按下方法:onKeyDown()、抬起方法:onkeyUp()。

    package com.example.eventhandlingandgestures;
    
    import androidx.appcompat.app.AppCompatActivity;
    
    import android.os.Bundle;
    import android.view.KeyEvent;
    import android.view.MotionEvent;
    import android.widget.Toast;
    
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            Toast.makeText(MainActivity.this,"触摸",Toast.LENGTH_SHORT).show();
            return super.onTouchEvent(event);
        }
    
        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {
            Toast.makeText(MainActivity.this,"按下",Toast.LENGTH_SHORT).show();
            return super.onKeyDown(keyCode, event);
        }
    
        @Override
        public boolean onKeyUp(int keyCode, KeyEvent event) {
            Toast.makeText(MainActivity.this,"抬起",Toast.LENGTH_SHORT).show();
            return super.onKeyUp(keyCode, event);
        }
    }

    二者区别:

    基于监听的事件处理适用于某些特定的事件,而基于回调的事件处理适用于通用性的事件。

    二、物理按键事件处理

    有三个状态,按下 onKeyDown(),抬起  onkeyUp(),长按onkeyLongPress()。

    Android为每个物理按键都提供了这三个方法。

    Android为区分每个按键,给每个按键都定义了常量。

     实例:连续按下两次返回键退出到主屏幕。

    package com.example.eventhandlingandgestures;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.KeyEvent;
    import android.widget.Toast;
    
    public class MainActivity extends Activity {
    
        private long exitTime = 0;//记录此刻按下按键的时间
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
    
        //第一步:重写onKeyDown()方法来拦截用户单击后退按钮事件
        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {
            if(keyCode==KeyEvent.KEYCODE_BACK){
                exit();//自定义的退出方法
                return true;
            }
            return super.onKeyDown(keyCode, event);
        }
    
        //第二步:创建退出方法exit()
        public void exit(){//判断按键时间差是否大于两秒
            if((System.currentTimeMillis()-exitTime)>2000){//弹出提示框
                Toast.makeText(MainActivity.this,"再按一次退出程序",Toast.LENGTH_SHORT).show();
                exitTime = System.currentTimeMillis();
            }else{//结束应用
                finish();
                System.exit(0);
            }
        }
    }

    三、触摸屏事件处理

    1、单击事件

    方法:setOnClickListener(),需要参数View.onClickListener,重写方法onClick(View v)

    2、长按事件

    方法:setOnLongClickListener(),需要参数View.onLongClickListener,重写方法onLongClick(View v)

    实例:长按触发菜单

    package com.example.eventhandlingandgestures;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.ContextMenu;
    import android.view.View;
    import android.widget.ImageView;
    
    public class MainActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            //--长按注册
            ImageView imageView = findViewById(R.id.image);
            imageView.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    //注册到菜单
                    registerForContextMenu(v);
                    //打开
                    openContextMenu(v);
                    return false;
                }
            });
        }
    
        //长按显示
        //第一步:在MainActivity中重写onCreateContextMenu菜单,为其添加选项值
        @Override
        public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
            super.onCreateContextMenu(menu, v, menuInfo);
            menu.add("收藏");
            menu.add("举报");
            //第二步:将长按事件注册到菜单中,并打开菜单,在onCrete方法中
        }
    
    }

    3、触摸事件

    方法:setOnTouchListener(),需要参数View.onTouchListener,重写方法onTouchListener(View v,MotionEvent event);

    MotionEvent: 保存发生触发的位置、时间等细节信息。

    4、单击事件与触摸事件的区别

    package com.example.eventhandlingandgestures;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.ContextMenu;
    import android.view.MotionEvent;
    import android.view.View;
    import android.widget.Button;
    import android.widget.ImageView;
    
    public class MainActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Button button = findViewById(R.id.btn);
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Log.i("onClick","单击事件");
                }
            });
            button.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    if(event.getAction()==MotionEvent.ACTION_DOWN){//如果是手指按下
                        Log.i("onTouch","按下");
                    }else if(event.getAction()==MotionEvent.ACTION_UP)
                        Log.i("onTouch","抬起");
                    return false;//返回false,表示未消耗这个事件
                }
            });
        }
    }

    通过最简单的鼠标做比喻,鼠标按下为触摸事件中的按下事件,鼠标抬起为触摸事件中的抬起事件,这整个动作为一次单击事件。

    触摸事件中重写的onTouch()中若返回false,则未消耗此事件,可被单击事件捕获到;若返回true,则代表消耗了此事件,则不可被单击事件捕获到。

    四、手势检测

    Android为手势检测提供了GestureDetector类,代表一个手势检测器。创建这个类的对象时,需要传入一个GestureDetector.OnGestureListener接口的实例,此接口代表一个监听器,用来对用户的手势进行响应。实现时必须重写6个方法,分别是:

    ① onDown():触摸事件按下时触发

    ② onFling():手指拖过时触发

    ③ onLongPress():长按时触发

    ④ onScroll():

    ⑤ onShowPress():

    ⑥ onSingleTapUp():轻击时触发

    还有自定义手势,添加手势等操作,需要继续慢慢学习掌握。

  • 相关阅读:
    mockm remote 不能正常使用的解决方案
    uviewui 的 bug 当 url 的 query 参数中有 http://127.0.0.1/ 并且省略请求前缀的时候, 就会导致请求无法发送出去
    检查 nodmeon 是否可以修改文件后重启应用
    mocha 如何延迟指定时间后再运行所有用例
    使用 babel 编译 js 为 es5 支持 ie
    git 摘取提交
    Makefile学习笔记
    使用 Service Worker 缓解网站 DDOS 攻击
    如何热更新长缓存的 HTTP 资源
    网站图片无缝兼容 WebP/AVIF
  • 原文地址:https://www.cnblogs.com/dongao/p/12251090.html
Copyright © 2011-2022 走看看