安卓基础学习 Day10 |事件处理

写在前面的话

1、主要参考自B站相关视频。
2、内容如果有不对的,希望可以指出或补充。
3、巩固内容。

一、概述

事件处理:就是用户对于图形界面的交互操作。在Android手机以及平板电脑上,事件的发生是在监听器下进行的,主要包括键盘事件和触摸事件两大类。键盘事件包括按下、弹起等,触摸事件包括按下、弹起、滑动、双击等。

1.基于回调机制的事件处理(概括):以on开头的方法。

2.基于监听接口机制的事件处理(概括):以Listener结尾的。

二、处理键盘事件

(一)概述

1、单击事件

该事件的监听器是View.OnClickListener,事件处理方法是onClick()。

2、按键事件

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

3、焦点事件

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

(二)测试-综合

① 布局

② MainActivity.java

package com.example.test;

import androidx.appcompat.app.AppCompatActivity;

import android.graphics.Color;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity implements View.OnClickListener,
View.OnKeyListener,View.OnFocusChangeListener{

    private TextView t_title,t_text;
    //声明一个长度为2的数组
    ImageButton[] bt_cats = new ImageButton[2];

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.test);

        //获取到控件
        t_title = findViewById(R.id.test_title);
        t_text = findViewById(R.id.test_text);
        bt_cats[0] = findViewById(R.id.test_cat1);//赋给数组中的第一个元素
        bt_cats[1] = findViewById(R.id.test_cat2);

        //设置标题
        t_title.setText("请通过键盘中的1、2或点击\n来选择你喜欢的猫咪");
        //取出bt_cats里面的每一个元素并为它添加监听器
        for(ImageButton bt_cat:bt_cats){
            //给bt_cat添加单击事件监听器
            bt_cat.setOnClickListener(this);
            //给bt_cat添加键盘按键监听器
            bt_cat.setOnKeyListener(this);
            //给bt_cat添加焦点监听器
            bt_cat.setOnFocusChangeListener(this);
        }
    }
    @Override
    //实现OnClickListener接口中的方法  单击事件
    public void onClick(View v){
        switch (v.getId()){
            case R.id.test_cat1:
                //设置提示文本
                t_text.setText("这是一只布偶猫");
                break;
            case R.id.test_cat2:
                t_text.setText("这是一只橘猫");
                break;
        }
    }

    @Override
    //实现OnKeyListener接口中的方法  按键事件
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        //判断键盘码
        switch(keyCode){
            case KeyEvent.KEYCODE_1:
                //调用点击事件并请求到焦点事件
                bt_cats[0].performClick();
                bt_cats[0].requestFocus();
                break;
            case KeyEvent.KEYCODE_2:
                bt_cats[1].performClick();
                bt_cats[1].requestFocus();
                break;
        }
        return false;
    }

    @Override
    //实现OnFocusChangeListener接口中的方法  焦点事件
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus) {
            //吐司提示
            Toast toast = Toast.makeText(this, "获得焦点", Toast.LENGTH_SHORT);
            TextView tv = (TextView) toast.getView().findViewById(android.R.id.message);
            tv.setTextColor(Color.YELLOW); //设置吐司字体颜色
            toast.show();
            
            //得到焦点时文本变成红色
            t_text.setTextColor(Color.RED);
        }else{
            t_text.setTextColor(Color.BLACK);
        }
    }
}

③ 测试效果

三、处理触摸事件

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

(一)测试-移动位置

① 布局

② TestActivity.java

package com.example.test;

import android.annotation.SuppressLint;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;

import androidx.appcompat.app.AppCompatActivity;

public class TestActivity extends AppCompatActivity {
    private ImageView t_img;
    private LinearLayout t_layout;
    private LinearLayout.LayoutParams LayoutParams;

    @SuppressLint("ClickableViewAccessibility")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.test2);

        //获取到控件
        t_img = (ImageView) findViewById(R.id.test_img);
        t_layout = (LinearLayout) findViewById(R.id.test_layout);
        // 获取焦点
        t_layout.setFocusable(true);
        t_layout.requestFocus();
        // 获取图像控件的布局参数
        LayoutParams = (LinearLayout.LayoutParams) t_img.getLayoutParams();

        // 触摸监听事件
        t_layout.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                // 根据变化的触点坐标来更新图像控件的布局参数
                LayoutParams.leftMargin = (int) event.getX();
                LayoutParams.topMargin = (int) event.getY();
                // 重新设置图像控件的布局参数
                t_img.setLayoutParams(LayoutParams);

                return true;
            }
        });
    }
}

③ 测试效果

由于是新建的一个活动窗口来测试的,所以需要先更改一下清单文件,如下。

(二)手势事件

1、Day29内容。
2、OnTouchListener只能监听到按下、移动、松开三种触摸事件,而要监听到双击、滑动、长按等复杂的手势操作,就需要用到OnGestureListener。

1 概述

安卓手势操作的执行顺序:

触发一个MotionEvent(主要用于传递触摸的事件类型,如按下)事件【→】MotionEvent事件被OnTouchListener监听,在其onTouch()方法里获得该MotionEvent对象【→】通过GestureDetector(手势侦测器)将此MotionEvent对象移交给OnGestureListener(手势监听,识别各种手势)【→】OnGestureListener监听器获得该事件对象,然后根据该对象封装的信息,做出合适的处理

2 测试

布局-注意红框部分。

TestActivity2.java

package com.example.test;

import android.os.Bundle;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.widget.LinearLayout;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.view.ViewCompat;
import androidx.core.view.ViewPropertyAnimatorCompat;

public class TestActivity2 extends AppCompatActivity {
    //手势侦测器
    private GestureDetector gd;
    //图像标识数组
    private int[] imgs;
    //图像索引,表示在数组中的位置
    private int imgIndex;
    //图片数量
    private static final int imgCount = 3;
    //布局
    private LinearLayout linearLayout;

    private long time = 0;//时间

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.test2_2);

        //获取布局实例
        linearLayout = findViewById(R.id.test_linearLayout);

        //初始化图像标识数组
        imgs = new int[imgCount];
        for (int i = 0; i < imgCount; i++) {
            imgs[i] = getResources().getIdentifier(
                    "cat" + (i + 1), //图片名
                    "drawable",
                    "com.example.test");//注意这里的包名要与程序的一样
        }
        //实例化手势侦测器
        gd = new GestureDetector(new GestureDetector.OnGestureListener() {
            @Override
            public boolean onDown(MotionEvent e) {
                return false;
            }

            @Override
            public void onShowPress(MotionEvent e) { }

            @Override
            //单击时回调
            public boolean onSingleTapUp(MotionEvent e) {
                /**连续点击两次(双击)缩小图片-时间间隔不超过2s*/
                if(System.currentTimeMillis() - time > 2000) {//System.currentTimeMillis()获得当前时间
                    //ViewPropertyAnimatorCompat 动画
                    ViewPropertyAnimatorCompat animate = ViewCompat.animate(linearLayout);
                    animate.scaleXBy(0.5f).scaleYBy(0.5f).start();//图片放大0.5倍
                    time = System.currentTimeMillis();
                    //提示
                    Toast.makeText(TestActivity2.this,"双击缩小",Toast.LENGTH_SHORT).show();
                } else {
                    ViewPropertyAnimatorCompat animate = ViewCompat.animate(linearLayout);
                    animate.scaleXBy(-0.5f).scaleYBy(-0.5f).start();//图片缩小0.5倍
                }

                return false;
            }

            @Override
            public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
                return false;
            }

            @Override
            public void onLongPress(MotionEvent e) { }

            @Override
            //移动;手指滑动屏幕后快速离开,屏幕还处于惯性滑动的状态时回调
            public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
                //手势往左滑动20个像素,图片切换到下一张
                if (e2.getX() < e1.getX() - 20) {
                    //更改图像索引
                    if (imgIndex < imgCount - 1) {
                        imgIndex ++;
                    } else {
                        imgIndex = 0;
                    }
                }
                //手势向右滑动20个像素,图片切换上一张
                if (e2.getX() > e1.getX() + 20) {
                    //更新图像索引
                    if (imgIndex > 0) {
                        imgIndex--;
                    } else {
                        imgIndex = imgCount - 1;
                    }
                }
                //利用更改后的图像索引去设置根布局的背景图片
                linearLayout.setBackgroundResource(imgs[imgIndex]);
                return false;
            }
        });
    }
    //将窗口的触摸事件交给手势侦测器来处理
    public boolean onTouchEvent(MotionEvent event) {
        /**将窗口触摸事件交给手势侦测器处理*/
        return gd.onTouchEvent(event);
    }
}

3 效果
注意:由于是新建的一个活动窗口来测试的,所以需要更改一下清单文件,与【上个测试的③ 测试效果】部分同理。

运行效果如下。

补充

1、Toast(吐司)的基本使用

2、GestureOverlayView属性

3、Android 图片缩放,手势,事件

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值