目录
一、概述
二、处理键盘事件
(一)概述
(二)测试-综合
三、处理触摸事件
(一)测试-移动位置
(二)手势事件
补充
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 图片缩放,手势,事件
网友评论