android初学者
更新:2020年1月。
在本入门级Android Studio的第1部分中 ,您在开发环境中设置了Android Studio,并了解了用户界面。 现在,在第2部分中,您将编写第一个应用程序的代码。
这款动画手机应用程序包含一个活动,该活动展示了Google的Android机器人角色以及为该角色设置动画的按钮。 单击该按钮可使角色逐渐从绿色变为红色,再变为蓝色,然后再变为绿色。 尽管该应用不是特别有用,但编写它可以帮助您熟悉使用Android Studio。 在第3部分中,您将使用Android设备模拟器和Kindle Fire平板电脑构建并运行该应用程序 。
请注意,此系列已针对Android Studio 3.2.1(截至本文撰写时的当前稳定版本)进行了更新。
Android Studio的项目和编辑器窗口
我在第1部分末尾介绍了Android Studio的主窗口。该窗口分为几个区域,其中包括一个Project窗口(用于标识应用程序的资源文件)和各种编辑器窗口(用于编写代码并指定移动应用程序的资源)在Android Studio中。 图1显示了Project窗口和Editor窗口。
“项目”窗口突出显示W2A ,这是应用程序的W2A.java
源文件的名称(尽管未显示.java
文件扩展名)。 与W2A对应的是一个编辑器窗口,可通过在“项目”窗口中双击W2A来到达。 编辑器窗口显示文件的当前内容,在本例中为该应用程序主要活动的骨骼Java源代码。
每个编辑器窗口都与一个选项卡关联。 例如, W2A的编辑器窗口与W2A.java选项卡相关联。 第二个选项卡标识为main.xml (应用程序主要活动的默认基于XML的布局)。 通过单击窗口的选项卡,可以从一个编辑器窗口移至另一窗口。
Android示例应用
示例应用程序( W2A.java )包含一个主要活动,该活动显示Android机器人角色和一个按钮。 当用户按下按钮时,机器人会通过一系列颜色设置动画。 在本节中,我们将探索活动的源代码和资源。
探索并编写Android示例应用程序
活动的源代码存储在清单2所示的文件W2A.java
中。
清单1. W2A.java
package ca.javajeff.w2a;
import android.app.Activity;
import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
public class W2A extends Activity
{
AnimationDrawable androidAnimation;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ImageView androidImage = (ImageView) findViewById(R.id.android);
androidImage.setBackgroundResource(R.drawable.android_animate);
androidAnimation = (AnimationDrawable) androidImage.getBackground();
final Button btnAnimate = (Button) findViewById(R.id.animate);
View.OnClickListener ocl;
ocl = new View.OnClickListener()
{
@Override
public void onClick(View v)
{
androidAnimation.stop();
androidAnimation.start();
}
};
btnAnimate.setOnClickListener(ocl);
}
}
W2A.java
文件以package语句开头,该语句命名存储W2A
类的包( ca.javajeff.w2a
)。 接下来是针对各种Android API类型的一系列import语句。 接下来,代码描述了W2A
类,该类扩展了android.app.Activity
。
W2A
首先声明一个类型为android.graphics.drawable.AnimationDrawable
的androidAnimation
实例字段。 AnimationDrawable
类型的对象描述逐帧动画,其中当前的可绘制对象被替换为动画序列中的下一个可绘制对象。
什么是可绘制对象?
可绘制对象是可以绘制的东西,例如图像。 AnimationDrawable
间接扩展了抽象的android.graphics.drawable.Drawable
类,该类是可绘制对象的常规抽象。
onCreate()方法
该应用程序的所有工作都在W2A
重写的onCreate(Bundle)
方法中进行:不需要其他方法,这有助于使该应用程序保持简单。
onCreate(Bundle)
首先调用其同名的超类方法,所有覆盖活动方法都必须遵循该规则。
然后,此方法执行setContentView(R.layout.main)
来建立应用程序的用户界面。 R.layout.main
是应用程序资源的标识符(ID),该资源位于单独的文件中。 您对这个ID的解释如下:
-
R
是在构建应用程序时生成的类的名称。 该类之所以称为R
是因为其内容标识了各种应用程序资源,包括布局,图像,字符串和颜色。 -
layout
是嵌套在R
中的类的名称。 其ID存储在此类中的应用程序资源描述了特定的布局资源。 每种应用程序资源都与以类似方式命名的嵌套类相关联。 例如,string
标识字符串资源。 -
main
是在layout
声明的基于int
的常量的名称。 此资源ID标识主布局资源。 具体而言,main
指的是存储主要活动的布局信息的main.xml
文件。main
是W2A
唯一的布局资源。
将R.layout.main
传递给Activity
的void setContentView(int layoutResID)
方法可指示Android使用存储在main.xml
的布局信息创建用户界面屏幕。 在后台,Android创建了main.xml
描述的用户界面组件,并将它们放置在设备屏幕上,如main.xml
的布局数据所指定。
该屏幕基于视图 (用户界面组件的抽象)和视图组 (对相关用户界面组件进行分组的视图)。 视图是android.view.View
类的子类的类的实例,类似于AWT / Swing组件。 视图组是抽象android.view.ViewGroup
类的子类的类的实例,类似于AWT / Swing容器。 Android将特定的视图(例如按钮或微调器)称为小部件 。
继续, onCreate(Bundle)
执行ImageView androidImage = (ImageView) findViewById(R.id.android);
。 该语句首先调用View
的View findViewById(int id)
方法来查找在main.xml
声明并标识为android
的android.widget.ImageView
元素。 它实例化ImageView
并将其初始化为main.xml
文件中声明的值。 然后,该语句将该对象的引用保存在局部变量androidImage
。
ImageView和AnimationDrawable
接下来, androidImage.setBackgroundResource(R.drawable.android_animate);
语句调用ImageView
的继承自View
void setBackgroundResource(int resID)
方法,将视图的背景设置为resID
标识的资源。 R.drawable.android_animate
参数标识一个名为android_animate.xml
的XML文件(稍后提供),该文件存储有关动画的信息,并存储在res
的drawable
子目录中。 setBackgroundResource()
调用将androidImage
视图链接到android_animate.xml
描述的图像序列,该序列将在此视图上绘制。 此方法调用的结果是绘制了初始图像。
ImageView
通过调用AnimationDrawable
方法使应用程序为一系列可绘制对象设置AnimationDrawable
。 在应用程序执行此操作之前,它必须获取ImageView
的AnimationDrawable
。 androidAnimation = (AnimationDrawable) androidImage.getBackground();
接下来的赋值语句通过调用ImageView
的(从View
)继承的Drawable getBackground()
方法来完成此任务。 此方法返回给定ImageView
的AnimationDrawable
,随后将其分配给androidAnimation
字段。 AnimationDrawable
实例用于启动和停止动画,我将在稍后描述该过程。
最后, onCreate(Bundle)
创建“ 动画”按钮。 它调用findByViewId(int)
从main.xml
获取按钮信息,然后实例化android.widget.Button
类。
然后,它使用View
类的嵌套onClickListener
接口创建一个侦听器对象。 每当用户单击按钮时,都会调用此对象的void onClick(View v)
方法。 通过调用View
的void setOnClickListener(AdapterView.OnClickListener listener)
方法,将侦听器与其Button
对象一起注册。
要停止然后启动动画, Animate的单击侦听器将调用androidAnimation.stop();
其次是androidAnimation.start();
。 在start()
之前调用stop()
方法,以确保随后单击Animate按钮会导致新的动画开始。
更新并保存您的代码
在继续之前,用清单1中的代码替换W2A.java选项卡中的骨架代码。按Ctrl + S 保存此窗口的内容,或者从File菜单中选择Save All 。
编码Android应用程序的main.xml
该应用程序的主要活动与基于XML的布局相关联,该布局存储在文件main.xml
,如清单2所示。
清单2. main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
android:background="#ffffff">
<ImageView android:id="@+id/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="10dip"/>
<Button android:id="@+id/animate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/animate"/>
</LinearLayout>
在XML声明之后,清单2声明一个LinearLayout
元素,该元素指定一个布局 (一个视图组,以某种方式在Android设备的屏幕上排列包含的视图),以在屏幕上水平或垂直地排列包含的小部件(包括嵌套的布局)。
<LinearLayout>
标记指定了一些用于控制此线性布局的属性。 这些属性包括:
-
orientation
将线性布局标识为水平或垂直。 包含的小部件水平或垂直放置,默认方向是水平。"horizontal"
和"vertical"
是可以分配给该属性的唯一合法值。 -
layout_width
标识布局的宽度。 合法值包括"fill_parent"
(与父级一样宽)和"wrap_content"
(要宽到足以包含内容)。 (请注意,fill_parent
在Android 2.2中已重命名为match_parent
,但仍受支持并广泛使用。) -
layout_height
标识布局的高度。 合法值包括"fill_parent"
(与父级一样高)和"wrap_content"
(足够高以包含内容)。 -
gravity
确定布局相对于屏幕的放置方式。 例如,"center"
指定布局应在屏幕上水平和垂直居中。 -
background
标识背景图像,渐变或纯色。 为简单起见,我对十六进制颜色标识符进行了硬编码,以表示纯白色背景(#ffffff
)。 (颜色通常存储在colors.xml
并从该文件中引用。)
LinearLayout
元素封装了ImageView
和Button
元素。 这些元素中的每一个都指定一个id
属性,该属性标识该元素,以便可以从代码中引用它。 分配给该属性的资源标识符 (以@
开头的特殊语法)以@+id
前缀开头。 例如, @+id/android
将ImageView
元素标识为android
; 通过指定R.id.android
从代码中引用此元素。
这些元素还指定layout_width
和layout_height
属性,以确定其内容的布局方式。 每个属性都分配了wrap_content
以便该元素以其自然大小显示。
ImageView
指定layout_marginBottom
属性,以标识其自身与垂直跟随的按钮之间的空格。 该空间指定为10 倾角或与密度无关的像素 。 这些是虚拟像素,应用程序可使用这些虚拟像素以与屏幕密度无关的方式表示布局尺寸/位置。
密度无关像素
与密度无关的像素 (dip)等效于160 dpi屏幕上的一个物理像素,基线密度由Android假定。 在运行时,Android会根据使用中的屏幕实际密度,透明地处理所需的下垂单位的任何缩放比例。 通过以下公式将浸入单位转换为屏幕像素: 像素=浸入量*(密度/ 160) 。 例如,在240 dpi的屏幕上,1倾角等于1.5物理像素。 Google建议使用浸入单元定义应用程序的用户界面,以确保在不同设备屏幕上正确显示用户界面。
选择并保存新布局
android初学者