AIDE手机编程初级教程(零基础向) 3.3.1 优化信息显示 上篇

第三章 优化小游戏

系列教程导航

3.3 优化信息显示

3.3.1 上篇


文章目录




前言

    大家好!很久没更新了,非常抱歉!˃̣̣̥᷄⌓˂̣̣̥᷅ 好不容易有时间了,我赶快来更一篇文章(=^▽^=)

    我们的小游戏,到目前为止,显示各种信息都是通过文本的方式,直接写在屏幕中间的文本框里面。但是,这种界面看起来并不友好。

    大家一定看过QQ,或者微信的聊天界面吧?那里面的消息就是以消息框展现出来的,看起来比我们的这个文本要好得多。这个虽然看似很复杂,事实上,你已经有能力写出这样的界面了。

    接下来,就让我们一起来实现消息显示的优化吧!




继承和包

    在学习如何实现消息框之前,我们先来了解一点继承和包的知识。

    前面,我们写过一辆车的类。假设我们要写另外十辆车的类。写完后,你就会发现,里面会有很多类似甚至完全相同的内容,比如说车都有车牌号,所以每个车的类里面都要写这么一个属性。

    相信你已经猜到接下来会有什么事情发生了吧?一直写相同的内容,简直就是浪费生命。所以,我们就有了这样的想法:把这些类里面都有的内容给抽取出来,然后组成一个父类,就好像是父亲,然后这些车的类都是子类,就好像是儿子。父亲有的,儿子也应该继承下来,所以我们让子类继承父类里的内容。这样,子类就具有了父类的属性和方法了。

    在Java中,有非常非常多的类,这么多的类里面有不少内容是重复的。所以,我们把这些类里面的重复内容给抽取出来,组成父类。当然,父类还可以继续抽取重复内容,组成更高级的父类。这样不断地进行抽取,就使得各种类之间建立了一种联系,好像一个网(当然,你也可以把他们想象成一个巨大的家族)。

    继承的好处在于,父类中的内容是子类都具有的,所以我们不必重复写相同的内容;而且,如果我们想写一个新的子类的话,直接继承父类即可,不必重新写这些重复内容。这样就提高了代码的复用性。同时,继承使类之间产生了联系,这样有利于我们使用这些类。

    有关继承的知识就简单讲到这里,我们后面还会接着学习。

    但是还有一个问题,虽然继承使类之间产生联系,但是如此多的类文件,我们如何存储它们呢?总不能全部放在一个文件夹下面吧。

    怎么办呢?很简单,我们设置多级目录就好了啊。这就是,简单来说就是你经常见到的文件夹。所以,类名其实并不只包括它的名字,它的全称是包名.类名。正因如此,我们在找一个类的话 时候,就可以按照它的全称很快找到(毕竟包体现出来就是文件夹嘛)。

    那么,我们如何把一个Java文件放进包里面呢?很简单,使用package语句即可。例如,我们在A.java文件的最前面写了这样的语句:

package mypack;

    这一句就把A类放到了mypack包里面。注意,包名里的字母均要小写

    我们在之前的程序里面,用到了很多Java中的类。由于它们不是我们程序里面有的,所以需要导入Java的包中的类。导入一个类的基本格式是:

import 类名的全称

    其中的import是关键字,后面跟着的就是要导入的类的全称。有的时候,我们如果需要导入一个包中的所有类的话,可以使用通配符*,也就是星号。例如:

import packa.*

    这样就导入了packa包里面的所有类。注意这个语句应该写在整个Java文件的最前面(前面可以有空行或者注释)

    说到这里,我们不妨看看我们之前写的小游戏:

在这里插入图片描述

    第一句的作用是,把当前的类放在com.owen.caishuzi这个包里面,(中间的两个点,这个包对应着一个三级目录);下面三句的作用则是分别导入了android.app,android.os和android.content中的全部类。

    一般来讲,我们需要哪个类,就导入哪个类。所以我们把通配符去掉,并直接导入我们需要的类。如下图所示:

在这里插入图片描述


在这里插入图片描述

    由于AIDE自动导入类会使用通配符,故我们需要把通配符手动改成自己需要的类。这也是以后我们在写Java程序的时候需要注意的。




新的容器

    讲完继承和包之后,我们进入今天的正题。首先,我们想一想应该如何实现消息框的功能。

    消息框并不是简单的文本框,里面可以放内容:文本,图片,音频……当然,在我们的小游戏里,只需要在消息框里面放上文本即可。那么,是不是使用线性布局来存放这些消息框就行了呢?让我们想想平常用QQ的经历:当消息很多的时候,我们可以上下滑动。这就是线性布局不能做到的了。所以,我们需要一个新的容器,在这里,我选择了ListView

    ListView,正如它名字所说,是列表视图。它也是一个容器,里面可以放各种控件,排一个列表一样的样式,并且可以上下滑动。如果想象不出来的话,大家可以去看一看CSDN的首页。

在这里插入图片描述

    简单介绍完ListView这个新的容器之后,我们来想一想怎么实现消息框的效果。

    事实上,这个过程很简单。我们定义出容器,然后定义出消息框的布局。在点击发送按钮的时候,我们就把编辑框里面的消息塞到消息框里面,然后把这个消息框添加到容器里面。不过,里面有一些主要注意的地方,我简单说一下;

  1. 虽然说在我们的小游戏里面,发送的消息都是纯文本,不过,一方面,我们在做应用的时候,会经常遇到发送非纯文本的情况;另一方面,为了让大家练习之前学过的知识,我们会定义一个消息类,然后把发送的消息全部都变成对象,而不是一个字符串。
  2. 消息框有一个很关键的特点,就是你发的消息都是靠着屏幕右边的,而对方发的消息都是靠着屏幕左边的。如何实现这样的效果呢?我们可以这样,在定义消息布局的时候,将左右的消息框都定义出来,然后在发送消息的时候进行判断,如果是我们自己发的消息,就把左边的消息框隐藏;反之,如果是程序发送的消息,就把右边的消息框隐藏
  3. 为了存储消息对象,我们使用的是Java中专门存储各种对象的容器——集合,具体地讲是一个List集合,而不是数组。这是因为数组的长度是无法改变的,而消息列表的长度会随着我们发送的消息进行动态改变

    接下来,让我们一步一步完成消息框的设计!




定义ListView和文本框布局

    我们依然是先在xml文件中定义各种布局。首先打开main.xml文件,然后进入图形化编辑界面:

在这里插入图片描述

    点击中间的文本框,然后选择删除,这样就把原本的文本框给删除掉了。

在这里插入图片描述

    然后,我们把上面的这个线性布局也一并删除。

在这里插入图片描述

    点击编辑框,选择父视图,然后选择前面添加,找到并选择适配视图下的列表视图。

在这里插入图片描述

在这里插入图片描述

    接下来设置列表视图的属性,点击列表视图,把layout_width设置为match_parent;然后点击layout_height,选择fixed size,并把高度设为0dp(8我们后面会通过weight调整列表视图的高度)

在这里插入图片描述

在这里插入图片描述

    我们点击这个非常细的列表视图,然后把weight设为1.0

在这里插入图片描述

    可以看到,列表视图的高度已经正常了。接着,我们设置它的id,我写的是msg_list_view,msg是message的简写;然后点击divider,选择Color,参数设为#000000,这样就可以把列表的边框隐藏

在这里插入图片描述

在这里插入图片描述

    至此,我们完成了Listview的定义。

    我们接着定义消息框。由于消息框需要动态加入,所以我们新建一个xml文件,在里面定义消息框。

在这里插入图片描述


在这里插入图片描述

    将里面的线性布局属性设置如下:

在这里插入图片描述

    其中,padding属性指内边距,也就是线性布局里面的控件到线性布局的边界的距离。

    这个线性布局就是整个消息框的容器,里面会有左右两个消息框。为了方便,我们会把左右两个消息框分别放在两个小的线性布局里面。于是,我们在现在的这个线性布局里面添加一个线性布局(垂直),作为左边的消息框所在的小线性布局。然后在新添加的线性布局里面添加两个文本框(也就是TextView),里面会分别放发送者的名字和消息的具体内容。

在这里插入图片描述

    此时,message.xml大概是这样的:

在这里插入图片描述

    下面分别是左消息框的线性布局和两个文本框的属性,以及属性设置完后的message.xml文件。其中,TextView的padding_left,textSize和textColor属性可以由自己的喜好进行调整。

    线性布局的属性如下:

在这里插入图片描述

    第一个文本框的属性如下:

在这里插入图片描述

    第二个文本框的属性如下:

在这里插入图片描述

    此时message.xml文件如下:

在这里插入图片描述

    右边的消息框和左边的几乎是一样的(不建议直接在AIDE里面复制粘贴,因为如果复制的内容有回车的话,AIDE会出错,很麻烦),只需要把id中的left改成right即可。当然,你也可以随意进行设计。

    完成之后,样子大概是这样的:

在这里插入图片描述

    至此,我们完成了消息框的定义。




定义消息对象

    接下来,我们定义消息对象。回到Java文件所在的目录下,新建一个Msg.java

在这里插入图片描述

    我们给Msg类添加两个属性:名字和内容。其中 名字指的就是该消息的发送者,内容也就是该消息的具体内容。由于代码比较简单,所以我直接把图放出来,大家可以当做参考。

在这里插入图片描述

    这段程序里面定义了两个属性,定义了构造函数,所以创建一个消息对象需要其内容和名字,并且提供了两个公共的函数来获取到这个消息对象的内容和名字。其中,在构造函数里面,出现了this关键字。为什么要用到this关键字呢?因为这里出现了两个重名的变量,this是为了区分成员变量(属于对象的变量)和局部变量。this关键字代表着它所在函数所属对象的引用,所以说this.name是消息对象的一个成员变量,而name只是一个局部变量,在这个函数调用结束之后就会被释放。




后记

    消息框的优化并不涉及很高深的知识,但是颇为繁琐,希望我能把它讲的清楚明白!如果有不理解的地方,还请见谅。

    下篇文章里面,我会讲到定义ListView的适配器,定义消息列表,并最终完成消息框的设计。敬请期待!

感谢你的阅读!本教程会长期不定时更新。本人不是大神,也会犯错,如果有建议或者提问的话,欢迎评论留言!

作者头像

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值