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():轻击时触发

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

原文地址:https://www.cnblogs.com/dongao/p/12251090.html