文章目录

  • 一、学习要点
  • 二、案例演示
  • 1、案例演示
  • 2、装备图片素材
  • 3、字符串资源文件
  • 4、主布局资源文件
  • 5、主界面类
  • 6、常用物理键
  • 1、HOME键
  • 2、Back键
  • 3、Menu键
  • 7、吐司提示



一、学习要点

  1. 安卓界面事件
  2. 安卓事件处理方式
  3. 常用物理键

二、案例演示

1、案例演示

  • 基于Empty Activity模板创建 - MoveMickeyByKey应用

2、装备图片素材

android自定义控件 高度 安卓控件调整位置_android自定义控件 高度

  • 拷贝到drawable目录中

3、字符串资源文件

  • strings.xml
  • android自定义控件 高度 安卓控件调整位置_java_02


<resources>
    <string name="app_name">通过按键移动图片</string>
</resources>

4、主布局资源文件

  • activity_main.xml
  • android自定义控件 高度 安卓控件调整位置_android自定义控件 高度_03


  • 约束布局改成线性布局并设置相应属性
  • 添加一个图像视图
  • 预览效果

5、主界面类

  • MainActivity
  • android自定义控件 高度 安卓控件调整位置_android自定义控件 高度_04


  • 声明常量和变量
  • 通过资源标识符获取控件实例
  • 让线性根布局获得焦点
  • 获取图像控件的布局参数
  • 给线性根布局注册按键监听器
package net.hxl.move_mickey_by_key;

import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Build;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    // 声明常量和变量
    protected int STEP = 10;//步长
    private ImageView ivMickey; //米老鼠图像控件
    private LinearLayout root; // 线性根布局
    private LinearLayout.LayoutParams layoutParams;//布局参数
    private int screenWidth;//手机屏幕宽度
    private int screenHeight;//手机屏幕高度

//    @RequiresApi(api = Build.VERSION_CODES.R)
    @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();

        // 给线性根布局注册按键监听器,实现监听器接口,编写事件处理方法
        root.setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                // 根据按键来修改米老鼠图像控件的布局参数 - 改变图像的位置
                switch (keyCode) {
                    case KeyEvent.KEYCODE_DPAD_UP: // 19, 按上方向键
                        layoutParams.topMargin = layoutParams.topMargin - STEP;
                        break;
                    case KeyEvent.KEYCODE_DPAD_DOWN: // 20, 按下方向键
                        layoutParams.topMargin = layoutParams.topMargin + STEP;
                        break;
                    case KeyEvent.KEYCODE_DPAD_LEFT: // 21, 按左方向键
                        layoutParams.leftMargin = layoutParams.leftMargin - STEP;
                        break;
                    case KeyEvent.KEYCODE_DPAD_RIGHT: // 22, 按右方向键
                        layoutParams.leftMargin = layoutParams.leftMargin + STEP;
                        break;
                }
                // 重新设置米老鼠图像控件的布局参数,改变其位置
                ivMickey.setLayoutParams(layoutParams);

                return false; // 事件要往后传播
            }
        });
    }
}
  • 启动程序,查看效果

android自定义控件 高度 安卓控件调整位置_android自定义控件 高度_05

6、常用物理键

1、HOME键

  • keyCode == KeyEvent.KEYCODE_HOME
  • 判断用户是否按下了HOME物理键

2、Back键

  • keyCode == KeyEvent.KEYCODE_BACK 判断用户是否按下了BACK物理键

3、Menu键

  • keyCode == KeyEvent.KEYCODE_MENU
  • 判断用户是否按下了MENU物理键

7、吐司提示

android自定义控件 高度 安卓控件调整位置_java_06

  • 查看效果
package net.hxl.move_mickey_by_key;

import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Build;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    // 声明常量和变量
    protected int STEP = 10;//步长
    private ImageView ivMickey; //米老鼠图像控件
    private LinearLayout root; // 线性根布局
    private LinearLayout.LayoutParams layoutParams;//布局参数
    private int screenWidth;//手机屏幕宽度
    private int screenHeight;//手机屏幕高度

    @RequiresApi(api = Build.VERSION_CODES.R)
    @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();
        // 获取跟布局的布局参数

        // 获取手机屏幕尺寸
        screenWidth = getWindowManager().getCurrentWindowMetrics().getBounds().width();
        screenHeight = getWindowManager().getCurrentWindowMetrics().getBounds().height();

        // 给线性根布局注册监听器,实现监听器接口,编写事件处理方法
        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() <= 1500 ){
                            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,按右方向键
                        if (ivMickey.getLeft() <= 800){
                            layoutParams.leftMargin = layoutParams.leftMargin + STEP;
                        }else {
                            Toast.makeText(MainActivity.this, "碰到右边界~", Toast.LENGTH_SHORT).show();
                        }
                        break;
                }
                // 重新设置图像控件的布局参数,改变其位置
                ivMickey.setLayoutParams(layoutParams);

                return false;//事件要往后传播
            }
        });
    }
}