安卓飞机大战设计过程

news2024/9/20 20:43:31

用户界面

XML布局文件和Activity类

Android布局文件XML是在res/layout文件夹下的xml文件,里面可以放一些组件

启动Activity时, Android 框架会调用 Activity 中的 onCreate() 回调方法,从而加载应
用代码中的布局资源;

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

事件处理

三个对象:事件源(例:button)、事件监听器(事件处理方法)、事件(系统生成)

基于监听事件的处理方法的实现

1. 在布局文件里绑定

2. Activity做事件监听器(实现接口,重写方法)

3. 匿名内部类(new 接口)

4.内部类实现接口

5. 外部类

多选的事件监听

radioGroup = (RadioGroup)findViewById(R.id.MusicSelect);
radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup radioGroup, int i) {
                selectRadioBtn();
            }
        });
private void selectRadioBtn(){
        radioButton = (RadioButton) findViewById(radioGroup.getCheckedRadioButtonId());
        text = radioButton.getText().toString();
    }

页面切换与数据传递

使用intent

出发的Activity

Intent intent = new Intent(MainActivity.this, OfflineActivity.class);
intent.putExtra("Music",text);         
startActivity(intent);

到达的Activity

String MusicSelect = getIntent().getStringExtra("Music");

图形处理与绘制

Color类

Paint类和Canvas类的方法,自己在网上搜吧,这里有用到一个canvas锁

在绘制的逻辑中通过lockCanvas()方法
获取Canvas对象进行绘制,通过
unlockCanvasAndPost(mCanvas)方法 对画布内容进行提交。

//绘制开始
canvas = mSurfaceHolder.lockCanvas();

......

//绘制结束后
mSurfaceHolder.unlockCanvasAndPost(canvas);

游戏开发的视图

如何使用SurfaceView

1. 创建自定义SurfaceView继承自SurfaceView并实现两个接口:

public abstract class BaseGame extends SurfaceView implements SurfaceHolder.Callback, Runnable{

2. 在构造函数里初始化如下成员变量

boolean mbLoop; //控制绘画线程的标志位
private final SurfaceHolder mSurfaceHolder;
private Canvas canvas;  //绘图的画布
private final Paint mPaint;
        mbLoop = true;
        mPaint = new Paint();  //设置画笔
        mSurfaceHolder = this.getHolder();
        mSurfaceHolder.addCallback(this);
        this.setFocusable(true);

3. 实现SurfaceHolder.Callback接口

create里创建线程并启动

@Override
    public void surfaceCreated(@NonNull SurfaceHolder surfaceHolder) {
        /*TODO*/
        mbLoop = true;
        new Thread(this).start();
    }

    @Override
    public void surfaceChanged(@NonNull SurfaceHolder surfaceHolder, int i, int i1, int i2) {
        GameActivity.screenWidth = i1;
        GameActivity.screenHeight = i2;
    }

    @Override
    public void surfaceDestroyed(@NonNull SurfaceHolder surfaceHolder) {
        /*TODO*/
        mbLoop = false;
    }

4. 实现Runnable接口

@Override
    public void run() {
        /*TODO*/
        while(mbLoop){
            //run  函数一直跑
            //绘制对手分数
            if(partner) {
                //Log.d()
                actionOver();
            }
            draw();
            if(gameOverFlag) continue;
            action();

        }
    }

数据存储

APP内部文件存储的实现方式

Context是抽象类,Android提供了该抽象类的具体实现类;通过它,我们可以获取应用程序的资源。

需要使用Context

 ➢ 四大组件的交互,包括启动 Activity、Broadcast、Service,获取 ContentResolver 等。

➢ 获取系统/应用资源,包括 AssetManager、PackageManager、 Resources、System Service 以及 color、string、drawable 等。

➢ 文件,包括获取缓存文件夹、删除文件、SharedPreference 相关等。

➢ 数据库(SQLite)相关,包括打开数据库、删除数据库、获取数据库路径等

数据展示:使用适配器和适配器控件展示和处理数据的方法

适配器控件ListView

  • 以表格形式展示数据
  • 处理用户对表格的操作

在xml文件里加入ListView

<ListView
        android:id="@+id/playerListView"
        android:layout_width="358dp"
        android:layout_height="533dp"
        android:layout_marginStart="1dp"
        android:layout_marginTop="1dp"
        android:layout_marginEnd="1dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.545" />

在Activity内对ListView进行操作

  • 绑定adapter
  • 监听
//获取ListView
        ListView listview = (ListView) findViewById(R.id.playerListView);

 //添加并且显示
        listview.setAdapter(listItemAdapter);
 //添加事件监听器
        listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
                showDeleteDialog(arg0,arg1,arg2,arg3,listItemAdapter,listview);
            }
        });

适配器SimpleAdapter

向ListView里面放数据

要学习创建SimpleAdapter的要传入的参数,根据参数要求去转换自己的数据格式

学习链接:AndroidStudio中ListView的使用方法之SimpleAdapter适配器-CSDN博客

与用户的交互:掌握AlertDialog的使用

对话框

比较深:Android———最详细的系统对话框(AlertDialog)详解 - Jetictors - 博客园 (cnblogs.com)

Handler的工作机制

掌握子线程通过主线程Handler更新主线程UI的方法

(子线程对UI线程的操作是不安全的,为解决子线程与UI线程的信息交互)

BaseGame是SurfaceView的子类,游戏绘制运行在子线程,无法直接更新UI。

游戏结束后BaseGame发消息给GameActivity,由GameActivity加载展示排行榜页面

先来介绍要用到的三个类

工作流程

Looper类及里面的MessageQueue类都是线程帮我们创建好的

子线程通知UI更新UI步骤

class MyHandler extends Handler {
        //复写handlerMessage
        @Override
        public void handleMessage(Message msg) {
            // 根据不同线程发送过来的消息,执行不同的UI操作
            // 根据 Message对象的what属性 标识不同的消息
            if(msg.what == 1 && msg.obj.toString().equals("over")) {
                // BaseGame 发消息过来了,游戏结束,进入排行榜页面
                /** 页面跳转 **/
                Log.d(TAG, "BaseGame 发消息过来了,游戏结束,进入排行榜页面");
                if (partner) {
                    Intent intent = new Intent(GameActivity.this, PartnerScoreActivity.class);

                    intent.putExtra("gameLever", gameType);
                    startActivity(intent);
                }else {
                    Intent intent = new Intent(GameActivity.this, PlayerListActivity.class);
                    intent.putExtra("gameLever", gameType);
                    startActivity(intent);
                }
            }
        }
    }
Handler mHandler = new MyHandler();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2072530.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PDF编辑神器!免费版助你轻松搞定文档转换

随着数字化时代的来临&#xff0c;PDF文件因其稳定性和兼容性成为了我们在职场中常用的文档格式。而面对众多的PDF编辑器&#xff0c;免费版的工具选择显得尤为重要。今天分享五款我用过的免费版PDF编辑器的使用感受&#xff0c;帮助大家更好地了解并选择适合自己的办公工具。 …

Flink1.18 同步 MySQL 到 Doris

一、前言 使用Apache Flink实现数据同步的ETL&#xff08;抽取、转换、加载&#xff09;过程通常涉及从源系统&#xff08;如数据库、消息队列或文件&#xff09;中抽取数据&#xff0c;进行必要的转换&#xff0c;然后将数据加载到目标系统&#xff08;如另一个数据库…

数据结构之排序(二)

目录 基本思想&#xff1a; 1.1冒泡排序 ​编辑1.1.1代码实现 1.3冒泡排序的特性总结&#xff1a; 2.1 快速排序 2.1.1基本思想 2.2.2代码实现 1. hoare版本 2.挖坑法 3.前后指针版本 2.2.3 快速排序的优化&#xff08;三数取中&#xff09; 实现步骤 3.1 快速排序非…

链表--随机链表复制

给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成&#xff0c;其中每个新节点的值都设为其对应的原节点的值。新节点的 n…

太阳方向角/高度角/赤纬角/太阳时角/真平太阳时差/理论计算方法(matlab)

1. 理论学习 方向角&#xff0c;高度角计算公式 如图&#xff0c;直观地描述了方位角(圆盘上红色夹角)与高度角(黄色线与圆盘的夹角) 赤纬角计算公式 地球赤道平面与太阳和地球中心的连线之间的夹角 如图所示&#xff0c;23度那个. 时角计算公式 太阳时角是指日面中心的时角…

博客园OpenApi管理平台

简介 博客园&#xff08;Cnblogs&#xff09;提供了OpenAPI服务&#xff0c;允许开发者通过API来获取博客园中的数据。使用这个API&#xff0c;可以实现从博客园抓取文章、评论等信息的功能&#xff0c;这对于想要集成博客园内容到自己网站或应用的开发者来说是非常有用的。 …

【hot100篇-python刷题记录】【二叉树的最大深度】

R6-二叉树篇 最简单的方法&#xff1a; 循环len(root)次&#xff0c;每次循环执行以下操作&#xff1a; 循环pow(2,i)次&#xff0c;每次都root.pop(0) 如果为空&#xff0c;立即退出&#xff0c;返回i1 class Solution:def maxDepth(self, root: Optional[TreeNode]) ->…

C语言基础(十七)

C语言中的结构体&#xff08;Struct&#xff09;是一种用户自定义的数据类型&#xff0c;允许将不同类型的数据项组合成一个单一的类型&#xff1a; 测试代码1&#xff1a; #include "date.h" #include <stdio.h> #include <string.h> // 定义结构…

【数据分享】1999—2022年地级市市政公用事业和邮政、电信业发展情况相关指标(Shp/Excel格式)

在之前的文章中&#xff0c;我们分享过基于2000-2023年《中国城市统计年鉴》整理的1999-2022年地级市的人口相关数据、各类用地面积数据、污染物排放和环境治理相关数据、房地产投资情况和商品房销售面积、社会消费品零售总额和年末金融机构存贷款余额、一般公共预算收支状况、…

[NeurIPS 2024] Self-Refine: Iterative Refinement with Self-Feedback

Contents TL;DRReferences TL;DR 通过让 LLM 生成 feedback 不断 refine 自身的回答&#xff0c;可以提升回答效果&#xff0c;但也会带来不可忽视的推理开销 References Madaan, Aman, et al. “Self-refine: Iterative refinement with self-feedback.” Advances in Neura…

Openssl Infinite Loop 漏洞(CVE-2022-0778)

Openssl Infinite Loop 漏洞&#xff08;CVE-2022-0778&#xff09; 1. 漏洞详情 在该漏洞中由于证书解析时使用的 BN_mod_sqrt() 函数存在一个错误&#xff0c;它会导致在非质数的情况下永远循环。可通过生成包含无效的显式曲线参数的证书来触发无限循环。由于证书解析是在验…

word技巧:如何在Word中轻松实现文档内容的左右分栏排版

你是否曾遇到过需要让Word文档的内容更加整洁、易于阅读&#xff0c;却苦于不知如何将其巧妙分为左右两栏的困扰&#xff1f;别担心&#xff0c;今天我们就来详细解析这一实用技巧&#xff0c;让你的文档排版瞬间提升一个档次&#xff01; 方法如下&#xff1a; 首先&#xff0…

uniapp h5手机如何打开本地跑的前端项目进行本地调试

本地调试使用 vConsole是一个轻量级的移动端调试工具&#xff0c;可以在iOS设备上直接调试Uniapp H5应用。下面是具体的步骤&#xff1a; 在Uniapp项目中安装vConsole依赖&#xff1a;npm install vconsole。 在项目的main.js文件中引入vConsole库&#xff1a;import VConso…

python实现简单中文词元化、词典构造、时序数据集封装等

文章目录 简述代码词元化词典构造时序数据生成data.TensorDataset生成 简述 中文词元化、删除非中文字符、构建索引词典&#xff0c;以便于为训练提供向量化数据。 待处理文本&#xff0c;以朱自清的《背影》为例&#xff0c;图中是给句子手动换行了&#xff0c;不换也是没问…

【网络安全】服务基础第一阶段——第二节:网络测试与用户

一、Windows网络测试工具 CMD&#xff08;命令提示符&#xff09;中&#xff0c;ping和tracert是两个非常有用的网络诊断工具 1.1.ping命令 ping命令是Windows和其他操作系统中用于测试主机之间网络连接是否可达的基本命令行工具。它通过发送ICMP&#xff08;Internet Contr…

LLM agentic模式之规划能力(planning)

文章目录 任务分解分解优先方法交替分解方法 多计划选择外部规划器辅助规划反思和改进记忆增强规划评估 2024年2月的综述《 Understanding the planning of LLM agents: A survey》提供了基于LLM的的agent的规划(planning)能力的系统视角&#xff0c;总结了近年来提高规划能力…

如何申请 Midjourney API ,看这篇文章就够了

Midjourney Imagine API 的申请与应用 Midjourney&#xff0c;这一杰出的 AI 绘图工具&#xff0c;凭借输入几个关键字&#xff0c;便能在短短一两分钟内生成极为精美的图像&#xff0c;展现出令人惊叹的创作能力。它以独特的绘画技术在行业中独树一帜&#xff0c;现今在各个领…

墨刀基础篇(一) :6.常用组件(动态组件)

一&#xff1a;动态组件 动态组件是除了文件和矩形之外最重要的一个组件。文本和矩形是一切组件的基础&#xff0c;而动态组件是复杂组件的根本。动态组件就是可以拥有多个状态&#xff0c;每个状态可以放不同的内容&#xff0c;每个状态之间可以互相切换&#xff0c;每个状态…

springboot系列--springboot前置知识

一、spring相关知识 一、spring能干什么 二、spring生态 spring生态覆盖了&#xff1a;web开发、数据访问、安全控制、分布式、消息服务、移动开发、批处理等等。 官网链接&#xff1a;Spring | Home 二、springboot相关知识 一、springboot作用 Spring Boot makes it easy …

Ansys Rocky在电池制造行业应用

Ansys Rocky在电池制造行业应用 对于电池电极制造的理解 干湿混合应用 砑光应用 微尺度电极干燥应用 更多应用 材料生产 电极和电池生产