目录
安卓常用事件介绍
1、单击事件
当用户触碰到某个组件或者方向键被按下时产生该事件,该事件的监听器View.OnClickListener
,事件处理方法是onClick()
。
2、焦点事件
组件得到或者失去焦点时产生该事件,监听器是View.OnFocusChangeListener,事件处理方法是onFocusChange()。
3、按键事件
用户按下或者释放手机键盘上的某个按键时产生,监听器是View.OnKeyListener, 事件处理方法是onKey()。
4、触碰事件
手机上具有触屏功能时,触碰屏幕产生该事件,监听器是View.OnTouchListener
,事件处理方法是onTouch()
。
二、安卓事件处理方式
1、基于回调的事件处理机制
基于回调的事件处理方式,在Activity生命周期那部分已经涉及到了七个回调方法。 (onCreate - onDestroy, onStart - onStop, onResume - onPause, onRestart )
具体例子:
新建一个安卓应用,并导入一张背景图片和图像
将默认的约束布局改成线性布局,设置相关属性
具体代码:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/root" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/img01" android:gravity="center" android:orientation="vertical" tools:context=".MainActivity"> <ImageView android:id="@+id/iv_mickey" android:layout_width="100dp" android:layout_height="120dp" android:scaleType="fitXY" android:src="@drawable/mickey" /> </LinearLayout>
打开strings 改变应用标题
具体代码:
<resources> <string name="app_name">通过按键移动米老鼠</string> </resources>
打开MainActivity实现主界面功能
实现代码:
具体代码:
package net.zyt.movemickeybykey; import androidx.appcompat.app.AppCompatActivity; import android.content.res.Resources; import android.graphics.Point; import android.os.Bundle; import android.util.DisplayMetrics; import android.util.Log; import android.view.KeyEvent; import android.view.View; import android.view.WindowManager; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.Toast; public class MainActivity extends AppCompatActivity { private final int STEP=10;//移动步长 private ImageView ivMickey;//米老鼠图像控件 private LinearLayout root;//线性根布局 private LinearLayout.LayoutParams layoutParams;//布局参数 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //利用布局资源文件设置用户界面 setContentView(R.layout.activity_main); //通过资源标识符获取控件实例 ivMickey=findViewById(R.id.iv_mickey); root=findViewById(R.id.root) ; //线性根部局获得焦点 root.setFocusable(true); root.requestFocus(); //获取图像控件的布局参数 layoutParams= (LinearLayout.LayoutParams) ivMickey.getLayoutParams();//(alt+enter) //给线性根布局注册监听器,实现监听接口,编写事件处理方法 root.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { //根据按键来修改米老鼠图形控件的布局参数-改变图像的位置 switch (keyCode){ case KeyEvent.KEYCODE_DPAD_UP://19,按的上方向健 // 上边界碰撞检测 if (ivMickey.getTop() >= 10) { //判断米老鼠控件是否碰到上边界 layoutParams.topMargin = layoutParams.topMargin - STEP; } else { Toast.makeText(MainActivity.this, "温馨提示:碰到上边界~", Toast.LENGTH_SHORT).show(); } break; case KeyEvent.KEYCODE_DPAD_DOWN://20,按的下方向健 // 下边界碰撞检测 if (ivMickey.getTop() <=1660) { layoutParams.topMargin = layoutParams.topMargin + STEP; } else { Toast.makeText(MainActivity.this, "温馨提示:碰到下边界~", Toast.LENGTH_SHORT).show(); } break; case KeyEvent.KEYCODE_DPAD_LEFT://21,按的左方向健 // 左边界碰撞检测 if (ivMickey.getLeft() >=10) { //判断米老鼠控件是否碰到左边界 layoutParams.leftMargin=layoutParams.leftMargin-STEP; } else { Toast.makeText(MainActivity.this, "碰到左边界~", Toast.LENGTH_SHORT).show(); } break; case KeyEvent.KEYCODE_DPAD_RIGHT://22,按的右方向健 Log.d("Mickey","ivMickey.getLeft():"+ivMickey.getLeft()); // 右边界碰撞检测 if (ivMickey.getLeft() <=800) { layoutParams.leftMargin=layoutParams.leftMargin+STEP; } else { Toast.makeText(MainActivity.this, "碰到右边界~", Toast.LENGTH_SHORT).show(); } break; } //重新设置米老鼠图像控件的布局参数,改变其位置 ivMickey.setLayoutParams(layoutParams); return false;//事件要往后传播 } }); } }
运行效果: