Android_study

目录


https://www.runoob.com/android/android-tutorial.html安卓教程

API

API( Application Programming Interface),它能够帮你实现轻松的和其他软件组件(如服务器,操作系统等)的交互。交互只能发生在中间的区域。在 API 术语里面,我们管中间的这块区域叫做接口 Interface ;在这里各个部分发生交互。

在 API 术语中,协议 是规定了各部分之间如何进行交流的一系列规则的集合。各部分之间想要完成交互必须理解并且遵守同一个协议。

在程序员的世界里,通用的格式包含 XML 和 JSON。

API 端点 通常是指在同一个接口中提供特定功能子集的服务提供者。在这种情况下,小冰和小娜都是端点。(小冰和小娜是同一个柜台不同功能的提供者)不同的端点可以有不同的协议和不同的格式。

总结起来:接口是不同组件进行交互的地方。协议是一系列规定了他们之间怎样进行交互的规则。格式定义了他们通过什么进行交流(JSON或者是XML),端点可以在同一个接口里面提供不同的功能。

API 是用于构建应用程序软件的一组子程序定义,协议和工具。一般来说,这是一套明确定义的各种软件组件之间的通信方法

https://blog.csdn.net/weixin_42067279/article/details/87987028API详解

项目文件

按照功能不同,项目文件分布在不同文件夹里。

(1)Android 清单文件夹 app\manifests\

里面只有一个文件 AndroidManifest.xml,这里都是一些关于应用包的元数据 。

Application 内部有一个或多个==activity(活动)元素,所谓 activity,就是为用户执行的一项任务,一个 Android 应用程序可以有一个或多个活动。在这个应用程序,只有一个活动名为 MainActivity。另外还有intent-filter(意图过滤器)==元素,意图是指从活动转到其它活动,这个Manifest 所用的意图过滤器,其名为 *android.intent.action.MAIN*,它的 category(类别)是launcher(启动器),这个特殊的意图就是如果用户点击了菜单中的应用图标,这就是开始要运行的活动,这就像 C/C++中的 main 程序一样,这个意图过滤器定义了应用程序的进入点。

(2)代码文件夹 app\java\com.mycompany.helloworld\

这个文件夹是放代码文件的地方,目前只有文件 MainActivity

(3) 资源文件夹 app\res\

这个文件夹存放项目所需的各种资源,包括子文件夹:

1)图片文件夹 drawable

2)布局文件夹 layout

布局就是界面设计,Android 使用 XML 文件定义用户界面,用 XML 文件描述屏幕视觉元素的布局。

3)菜单文件夹 menu

文件夹下有一个文件 menu_main.xml

4)图片文件夹 mipmap

这个文件夹也是存放图片的,和 drawable 作用相同,但是用 mipmap 系统会在缩放上提供一定的性能优化。目前这里存放着启动图标,不同的图标适应不同的屏幕。

5)键值

包括颜色、适配不同屏幕、字符串、样式。我们重点学习 strings.xml.

	<resources>
 	<string name="app_name">HelloWorld</string>
    <string name="action_settings">Settings</string>
	</resources>

用 户 界 面 上 文 本 是 字 符 串 , 这 些 字 符 串 可 以 放 在 strings.xml 里 。如

<string name="app_name">HelloWorld</string>

它的键是 app_name,值是 HelloWorld。试着把 HelloWorld 改为“你好,世界!”总要指定字符串,这个字符串资源文件可以管理所有的 UI 文本,使得开发人员容易地管理、更新文本,以及 app 多语言国际化。

activity和intent

https://blog.csdn.net/JourneyX/article/details/52970903activity和intent详解

Activity是Android四大组件之一主要用于与用户进行交互,在一个App中可能存在零个或多个Activity。Android的四大组件都必须要在清单文件中进行注册。

Acitivity的启动需要使用到Intent类,Intent不是Android四大组件之一,Intent,意图,主要用于Android三大组件之间的通讯,是三大组件的桥梁。

PS:这里的三大组件是Activity、Service、BroadcastReceiver

一个Android应用程序可以包含零或多个Activity,当应用程序具有多个Activity时,就可能需要从一个Activity跳转到另一个Activity。在Android中,Activity之间的导航是通过Intent(意图)来完成

Intent并不是Andorid应用的组件,但它是各组件之间通信的载体

Intent不仅仅可以用于同一个App内来传递“意图”,也可以跨App。

显示意图:需要明确指定需要启动的组件名称。

隐式意图:不需要明确指定需要启动的组件的名称,只需要给定启动的组件的相关信息。所谓的相关系,比如:打电话、上网、发邮件。

显示意图和隐式意图的区别

1、显示意图:必须指定要激活的组件的完整包名和类名

(应用程序之间耦合在一起,一般是在激活自己应用中的组件时使用显示意图。效率较高)

2、隐式意图:只需要指定执行的动作和数据就可以

(好处:应用程序之间没有耦合。一般在激活其他应用中的组件时使用隐式意图。缺点:效率较低)

意图过滤器:

通过intent传递数据

1、 Intent.setData(Uri) ——> intent.getData() :传递简单的文本数据,// 传递Uri对象(实际上就是一个字符串)

2、 putExtra(name ,value) ——> getXXXExtra() //传递额外数据

通过该方法可以传递以下数据类型:八种基本数据类型,数组,字符串,序列化对象

(在Android中有两个序列化接口:A)Serializable接口: JDK自带的接口,使用方式很简单,只需要让自定义类实现Serializable接口即可。b)Parcelable接口,Android SDK提供的接口)

相对于Serializable接口,序列化和反序列化的效率更高,是Android推荐使用的,但是序列化和反序列的部分操作需要程序员自己完成

Bundle对象,就是一个容器,操作和Map集合类似,是以键值对的方式存储

3、 putExtras(Bundle extras) ——> getExtras():可以传递一组数据(Map集合)

4、putXXXArrayListExtra 传递ArrayList对象

Intent intent = getIntent();

activity和intent

Action代表该Intent所要完成的一个抽象“动作”

一个Intent对象最多包含一个action

一个Activity可以定义多个action

Android本身提供了很多action供开发者使用

Action代表该Intent所要完成的一个抽象“动作”

一个Intent对象最多包含一个action

一个Activity可以定义多个action

Android本身提供了很多action供开发者使用

category

为Activity增加额外的附加类别信息

为Activity增加额外的附加类别信息

data

声明数据的类型(mimeType)、约束(scheme)、主机名(host)、端口(port)、路径(path)等

声明数据的类型(mimeType)、约束(scheme)、主机名(host)、端口(port)、路径(path)等

应用场景:开启别的应用程序中的界面,系统需要查询匹配的Activity,效率较低

任务(Task)

一个应用程序一般都是由多个Activity组成的,task就是多个 Activity的集合

后退栈(Back Stack)

就是一个保存和管理应用程序中所有Activity的容器用户在进行操作时将与task中的Activity进行交互,这些Activity会按照启动顺序排队存入后退栈

Android为什么要引入任务和后退栈的概念?

在Windows下可以同时开启多个程序,并且可以在多个程序之间进行切换,在Andorid下也可以开启多个程序,可以通过长摁home键来查看开启的App,要实现在多个Activity之间进行切换,那么就要将已经打开的Activity保存在内存中,而Android系统是通过后退栈来存储已经开启的Activity,并记录他们开启的先后顺序。

Android 意图(Intent)和过滤器(Filter)

Android意图是一个要执行的操作的抽象描述。它可以通过 startActivity 来启动一个活动,broadcastIntent 来发送广播到任何对它感兴趣的广播接受器组件,startService(Intent) 或者bindService(Intent, ServiceConnection, int) 来与后台服务通讯。

意图本身(一个 Intent 对象)是一个被动的数据结构,保存着要执行操作的抽象描述。

例如,你有一个活动,需要打开邮件客户端并通过 Android 设备来发送邮件。为了这个目的,你的活动需要发送一个带有合适选择器的 ACTION_SEND 到 Android 意图处理者。指定的选择器给定合适的界面来让用户决定如何发送他的邮件数据。

Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:"));
email.putExtra(Intent.EXTRA_EMAIL, recipients);
email.putExtra(Intent.EXTRA_SUBJECT, subject.getText().toString());
email.putExtra(Intent.EXTRA_TEXT, body.getText().toString());
startActivity(Intent.createChooser(email, "Choose an email client from..."));

上面的语法调用 startActivity 方法来开启邮件活动。

例如,你有一个活动,需要在 Android 设备上通过浏览器打开一个URL。为了这个目的,你的活动发送 ACTION_WEB_SEARCH 意图到 Android 意图处理器来在浏览器中打开给定的 URL 。意图处理器通过解析一系列活动,并选择最适合你的意图的一个活动,在这个例子中,是 Web 浏览器活动。意图处理器传递你的网页地址到 Web 浏览器,并打开 Web 浏览器活动。

String q = "https://www.runoob.com";
Intent intent = new Intent(Intent.ACTION_WEB_SEARCH );
intent.putExtra(SearchManager.QUERY, q);
startActivity(intent);

上面的例子将在Android搜索引擎上查找"www.runoob.com",并在一个活动上给出关键词的结果。

对于每一个组件-活动,服务,广播接收器都有独立的机制来传递意图。

序号方法和描述
1Context.startActivity():意图传递给该方法,用于启动一个新的活动或者让已存在的活动做一些新的事情。
2Context.startService():意图传递给该方法,将初始化一个服务,或者新的信息到一个持续存在的服务。
3Context.sendBroadcast():意图传递给该方法,信息将传递到所有对此感兴趣的广播接收器。

意图对象

意图对象是一包的信息,用于组件接收到的意图就像 Android 系统接受到的信息。

意图对象包括如下的组件,具体取决于要通信或者执行什么。

动作(Action)

这是意图对象中必须的部分,被表现为一个字符串。在广播的意图中,动作一旦发生,将会被报告。动作将很大程度上决定意图的其他部分如何被组织。Intent 类定义了一系列动作常量对应不同的意图。这里是一份Android意图标准动作 列表。

意图对象中的动作可以通过 setAction() 方法来设置,通过 getAction() 方法来读取。

数据(Data)

添加数据规格到意图过滤器。这个规格可以只是一个数据类型(如元类型属性),一条 URI ,或者同时包括数据类型和 URI 。 URI 则由不同部分的属性来指定。

这些指定 URL 格式的属性是可选的,但是也相互独立 -

  • 如果意图过滤器没有指定模式,所有其他的 URI 属性将被忽略。
  • 如果没有为过滤器指定主机,端口属性和所有路径属性将被忽略。

setData() 方法只能以 URI 来指定数据,setType() 只能以元类型指定数据,setDataAndType() 可以同时指定 URI 和元类型。URI 通过 getData() 读取,类型通过 getType() 读取。

以下是动作/数据组的一些实例 -

序号动作/数据组和描述
1ACTION_VIEW content://contacts/people/1:显示ID为1的用户的信息。
2ACTION_DIAL content://contacts/people/1:显示电话拨号器,并填充用户1的数据。
3ACTION_VIEW tel:123:显示电话拨号器,并填充给定的号码。
4ACTION_DIAL tel:123:显示电话拨号器,并填充给定的号码。
5ACTION_EDIT content://contacts/people/1:编辑ID为1的用户信息。
6ACTION_VIEW content://contacts/people/:显示用户列表,以便查看。
7ACTION_SET_WALLPAPER:显示选择壁纸设置。
8ACTION_SYNC:同步数据,默认的值为:android.intent.action.SYNC
9ACTION_SYSTEM_TUTORIAL:开启平台定义的教程(默认教程或者启动教程)
10ACTION_TIMEZONE_CHANGED:当时区被改变时通知
11ACTION_UNINSTALL_PACKAGE:运行默认的卸载器

类别

类别是意图中可选的部分,是一个字符串,包含该类型组件需要处理的意图的附加信息。addCategory() 方法为意图对象添加类别,removeCategory() 方法删除之前添加的类别,getCategories() 获取所有被设置到意图对象中的类别。这里是Android意图标准类别列表。

可以查看下面章节中的意图过滤器来了解我们如何使用类别来通过对应的意图选择合适的活动。

附加数据

这是传递给需要处理意图的组件的以键值对描述的附加信息。通过 putExtras() 方法设置,getExtras() 方法读取。这里是Android意图标准附加数据列表。

标记

这些标记是意图的可选部分,说明Android系统如何来启动活动,启动后如何处理等。

序号标记和说明
1FLAG_ACTIVITY_CLEAR_TASK :如果在意图中设置,并通过 Context.startActivity 传递,这个标记将导致与该活动相关联的所有已存在的任务在活动启动前被清空。活动将成为一个空任务的根,所有旧的活动被结束。该标记可以与 FLAG_ACTIVITY_NEW_TASK 结合使用。
2FLAG_ACTIVITY_CLEAR_TOP :如果设置该标记,活动将在当前运行的任务中被启动。这病不会启动一个新的活动实例,所有的在它之上的活动被关闭,这个意图作为一个新的意图被传递到已有的(目前在顶部的)活动。
3FLAG_ACTIVITY_NEW_TASK :这个标记一般用于使得活动用于"启动器"风格的行为:为用户提供一个可以独立完成运行的数据,并启动完整儿独立的活动。

组件名称

组件名称对象是一个可选的域,代表活动、服务或者广播接收器类。如果设置,则意图对象被传递到实现设计好的类的实例,否则,Android 使用其他意图中的其他信息来定位一个合适的目标。组件名称通过 setComponent(),setClass()或者 setClassName() 来设置,通过 getComponent() 获取。

意图的类型

Android 支持两种类型的意图。

image

显式意图

显式意图用于连接应用程序的内部世界,假设你需要连接一个活动到另外一个活动,我们可以通过显示意图,下图显示通过点击按钮连接第一个活动到第二个活动。

image

这些意图通过名称指定目标组件,一般用于应用程序内部信息 - 比如一个活动启动一个下属活动或者启动一个兄弟活动。举个例子:

// 通过指定类名的显式意图
Intent i = new Intent(FirstActivity.this, SecondAcitivity.class);

// 启动目标活动
startActivity(i);

隐式意图

这些意图没有为目标命名,组件名称的域为空。隐式意图经常用于激活其他应用程序的组件。举个例子:

Intent read1=new Intent();
read1.setAction(android.content.Intent.ACTION_VIEW);
read1.setData(ContactsContract.Contacts.CONTENT_URI);
startActivity(read1);

用户页面布局

Android Studio 用 XML 文件描述界面 。content_main.xml 是 activity_main.xml 的一部分,activity_main.xml 定义了顶部和底部的母版,所以直接操作 content_main.xml即可。

Design 模式拖拽控件到界面上。

android:id="@+id/名称 ":识别 view 的唯一的 id,有了这个 id,在程序里可以用 id操作这个对象。定义 id 的格式为:@+id/名称,注意@+id/是固定的,反斜杠后的名称才是你自由取名字。引用 id 的格式为:R.java.资源名称。这种方式资源 ID 只声明一次,引用 ID 不需要加上+号。仅在指定新资源 ID 是才需要+号,诸如 string、布局等具体资源不需要+号。

android:layout_width android:layout_height:可以不用具体的数值,wrap_content 意思是能够包裹住它内容的,仅用于适应视图内容,表示宽度或高度上需要用多少就是多少。如果是match_parent,EditText 元素会充满屏幕,因为它将要适应父元素 LinearLayout 的大小。

**android:hint=“@string/名称”**是编辑框空的时候出现的默认字符串,也就是这个编辑框的提示文本,而文本属性值是@string/名称, 是因为引用具体资源(而不是标识符),不需要+号。这个字符串的具体值定义在另一个文件的字符串资源上。@string 表示该字符串定义在其它 XML 文件中,它在 values 目录下,名为 string.xml,打开它,其中有一个 string 元素,name 属性为 hello,内容是"Hello World,IntroActivity!"回头看 main 文件,该引用是说:要输入到屏幕的这个字段,实际数据在string.xml 文件中,实际显示的是这一段。

布局文件与 Activity关联

基类中的 onCreate 方法:super.onCreate(savedInstanceState); 每个 activity 都要进行一些必要的初始化,而这些初始化就是通过调用父类的构造函数来进行的。

调用方法 setContentView(R.layout.activity_display_message);,setContentView 就是说活动创建以后,这就是我需要渲染到屏幕上的视图,这个视图就是R.layout.activity_display_message,也就是就是在第一步我们编写 XML 布局文件描述 UI activity_display_message 文件 ,放置在 layout目录下 。setContentView(R.layout.activity_display_message)是在告诉机器,activity_display_message 中定义有布局 layout,这就是我要输出到屏幕的。

在 AndroidManifest.xml 里声明新建的activity。

调用

如何从活动转到另一个活动,当应用中包含一个或多个活动时,
什么能让我们从一个转到另一个,在 Android Studio 中,我们称之为 Intent(意图)。Intent 是
从一个活动传到另一个的异步信息,一般 Intent 包括两段数据,首先是动作,然后是该动作
所需数据。

Intent 有两个参数:

​ 第一个是 Context 类型参数,使用 this 因为 Activity 类是 Context 的子类;

​ 第二个是系统要传递的目标(这里是要启动的窗体)app 组件的类

findViewById()获取当前编辑框 EditText 对象

putExtra()把 message 作为附加数据加到 intent

调用 startActivity 方法,传递 Intent 对象

被调用

被调用的 activity 启动时要处理的工作在 onCreate()方法里实现。activity 收到带有 message 的Intent,然后处理它。onCreate()方法也必须用 setContentView()定义 activity 布局。

getIntent()获取传入的Intent 调用方

getStringExtra(“EXTRA_MESSAGE”)取得"EXTRA_MESSAGE"代表的值 message。

获取 xml 定义的 TextView,把 message 显示出来

protected void onCreate(Bundle savedInstanceState)
{
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_display_message);
 Intent intent=getIntent();
 String message=intent.getStringExtra("EXTRA_MESSAGE");
 TextView textView=(TextView)findViewById(R.id.textviewShow);
 textView.setText(message);//设置文本为 message
}

相对布局 RelativeLayout

相对布局的 XML 元素是<RelativeLayou>,相对布局的特点是可以让控件之间互相确定

关系,这样可以保证在屏幕的局部范围内几个控件之间的关系不受外部影响。

RelativeLayout属性

  1. 属性值为 true 或 false

android:layout_centerHrizontal 水平居中

android:layout_centerVertical 垂直居中

android:layout_centerInparent 相对于父元素完全居中

android:layout_alignParentBottom 贴紧父元素的下边缘

android:layout_alignParentLeft 贴紧父元素的左边缘

android:layout_alignParentRight 贴紧父元素的右边缘

android:layout_alignParentTop 贴紧父元素的上边缘

android:layout_alignWithParentIfMissing 如果对应的兄弟元素找不到的话就以

父元素做参照物

  1. 属性值必须为 id 的引用名“@id/id-name”

android:layout_below 在某元素的下方

android:layout_above 在某元素的的上方

android:layout_toLeftOf 在某元素的左边

android:layout_toRightOf 在某元素的右边

android:layout_alignTop 本元素的上边缘和某元素的的上边缘对齐

android:layout_alignLeft 本元素的左边缘和某元素的的左边缘对齐

android:layout_alignBottom 本元素的下边缘和某元素的的下边缘对齐

android:layout_alignRight 本元素的右边缘和某元素的的右边缘对齐

  1. 属性值为具体的像素值,如 30dip,40px

android:layout_marginBottom 离某元素底边缘的距离

android:layout_marginLeft 离某元素左边缘的距离

android:layout_marginRight 离某元素右边缘的距离

android:layout_marginTop 离某元素上边缘的距离

帧布局 FrameLayout

设计 FrameLayout 是为了显示单一项 view。通常,不建议使用 FrameLayout 显示多项

内容。因为它们的布局很难调节,不用 layout_gravity 属性的话,多项内容会重叠;使用

layout_gravity 的话,能设置不同的位置。

安卓在Fragment中使用SimpleAdapter适配器

public void switchLayout(){ 
	for (int i=0;i<persons.size();i++){
        HashMap<String,Object> map=new HashMap< >();
        map.put ("img",persons.get(i).getImgId());
        map.put("name", persons.get(i).getName());
        map.put("te1", persons. get(i).getTel());
        lxrlist.add(map) ;
    }
    String[] from={"img", "name", "te1"};
    int[] to={R.id.lxrimg, R.id.lxrname, R.id.lxrtel} ;

  /*  SimpleAdapter adapter=new SimpleAdapter( this,lxrlist,R.layout.person_layout,from,to);*/
    SimpleAdapter adapter=new SimpleAdapter( getActivity(), lxrlist,R.layout.person_layout, from,to) ;
    listView.setAdapter(adapter);
}

使用SimpleAdapter的格式
SimpleAdapter(Context context, List<? extends Map

一般使用这样使用的
SimpleAdapter adapter=new SimpleAdapter(this,lxrlist,R.layout.person_layout,from,to);

当是在Fragment中使用会报错,上下文context要使用getActivity()

线性布局 LinearLayout

线性布局里的控件以在 XML 出现的顺序出现在屏幕上。线性布局控制其中的控件或组件横向或纵向排列。在线性布局布局中,每一行或每一列只能放单独一个控件。线性布局不会换行。当控件排列到窗体边缘,后面的控件就被隐藏,而不会显示出来。

线性布局里的控件是从左到右水平排列,还是从上至下竖直排列是由属性android:orientation 决定的,当它值为"horizontal"时控件是在水平一直排列,不会转到下一行;当它值为"vertical"时控件至上而下排列。

线性布局的默认方向是水平方向(Horizontal)。

LinearLayout的属性:

LinearLayout的常用属性

  1. android:orientation 定义布局内控件或组件的排列方式

可选项:vertical 、 horizontal

  1. android:layout_width 定义控件的宽度

可选项:fill_parent / match_parent/ wrap_content/绝对数值

备注:fill_parent / match_parent的效果完全一致,都是填充整个父控件。但是自2.2版本开始推荐使用match_parent 。wrap_content指的是该控件的宽度正好包裹内容物。

  1. android:layout_height 定义控件的高度

可选项:fill_parent / match_parent/ wrap_content/绝对数值

备注:fill_parent / match_parent的效果完全一致,都是高度填充整个父控件。wrap_content指的是该控件的高度正好包裹内容物。

  1. android:id 设置控件的id。这样就可以在R.java中自动生成相应的值,在程序中通过findViewById就可以调用。

设置id的格式为:android:id = “@+id/id的名字”

  1. android:background 设置控件的背景颜色或背景图片

例如:android:background=“#ffffff”

​ android:background=“@drawable/图片名称”

【备注:】

颜色有RGB颜色格式和ARGB格式。RGB是红绿蓝三原色。而ARGB是带alpha的三原色,即有透明度的三原色。

#FFFFFF 代表白色

#000000 黑色

#FFFFFFFF 完全不透明

#00FFFFFF 完全透明

#88FFFFFF 半透明

  1. android:layout_weight 设置控件的权重。即各控件在水平或者垂直方向上平均分配。

备注:如果是水平方向设置权重,要将android:layout_width设置为0dp,如果是垂直方向上使用权重,要将android:layout_height设置为0dp。否则权重容易受到高度或宽度的干扰而出现偏差。

  1. android:gravity 该属性用来控制该View的内容物的位置。

如果该属性是定义在布局节点中,则该布局中所有控件的位置都受到这个属性的控制。

如果该属性出现在Button、TextView、EditText等控件中,则用来控制这些控件上的文字的位置。

可选项有:top、bottom、left、right、center_vertical、fill_vertical 、 center、fill等等。

【备注:】本属性与android:layout_gravity不同。

  1. android:layout_gravity 该属性用于设置控件相对于容器的对齐方式。

可选项有:top、bottom、left、right、center_vertical、center_horizontal 、fill_vertical 、 center、fill等等。

这些可选项中不是适用于每一种布局。在垂直线性布局中,android:gravity为bottom不起作用;而水平线性布局中,android:gravity为right不起作用。

LinearLayout的特有属性:【重新归纳:去除公共属性后的特有属性】

  1. android:orientation 布局管理器内组件的排列方式

  2. android:gravity 设置布局管理器内组件的对齐方式

  3. android:weightSum

LinearLayout 子元素的特有属性:

  1. android:layout_weight 子元素在 LinearLayout 中所占的权重

  2. android:layout_gravity 子元素在 LinearLayout 中的对齐方式

表格布局 TableLayout

这种布局和 Office 里的制作表格类似,把布局看作一个表格,控件放置在每个单元格里。

表格行的最大行高与该行最高控件匹配;表格最宽的列与该列最宽控件匹配。

网格布局 GridLayout

网格布局虽然和表格布局类似,但比表格更灵活。网格布局子控件放置在<GridLayout>里,子控件坐标确定自己在网格位置,即所在的行和列,元素还可以跨行、跨列。

典型应用:计算器

GridLayout布局属性:

  1. android:alignmentMode 设置布局的对齐模式。可以取以下值:

alignBounds – 对齐子视图边界。

alignMargins – 对齐子视图边距。

  1. android:columnCount GridLayout的最大列数

  2. android:rowCount GridLayout的最大行数

  3. android:orientation GridLayout中子元素的布局方向。有以下取值:

horizontal – 水平布局。

vertical – 竖直布局。

  1. android:columnOrderPreserved 设置该网格布局是否保留列序号。默认是true。

  2. android:rowOrderPreserved 设置该网格布局是否保留行序号。默认是true。

  3. android:useDefaultMargins 设置GridLayout使用默认的边距。默认值是false。

GridLayout子元素的属性:

  1. android:layout_column 显示该控件的列。例如,android:layout_column=“0”,表示在第1列显示该控件;android:layout_column=“1”,表示在第2列显示该控件。

  2. android:layout_row 该控件所在行。例如,android:layout_row=“0”,表示在第1行显示该控件;android:layout_row=“1”,表示在第2行显示该控件。它和 android:layout_column类似。

  3. android:layout_columnSpan 列合并。即该控件所占的列数。例如,android:layout_columnSpan=“2”,表示该控件占2列。

  4. android:layout_rowSpan 行合并。即该控件所占的行数。例如,android:layout_rowSpan=“2”,表示该控件占2行。

  5. android:layout_gravity 该控件的布局方式。选项值:

  • top – 控件置于容器顶部,不改变控件的大小。
  • bottom – 控件置于容器底部,不改变控件的大小。
  • left – 控件置于容器左边,不改变控件的大小。
  • right – 控件置于容器右边,不改变控件的大小。
  • center_vertical – 控件置于容器竖直方向中间,不改变控件的大小。
  • fill_vertical – 如果需要,则往竖直方向延伸该控件。
  • center_horizontal – 控件置于容器水平方向中间,不改变控件的大小。
  • fill_horizontal – 如果需要,则往水平方向延伸该控件。
  • center – 控件置于容器中间,不改变控件的大小。
  • fill – 如果需要,则往水平、竖直方向延伸该控件。
  • clip_vertical – 垂直剪切,剪切的方向基于该控件的top/bottom布局属性。若该控件的gravity是竖直的:若它的gravity是top的话,则剪切该控件的底部;若该控件的gravity是bottom的,则剪切该控件的顶部。
  • clip_horizontal – 水平剪切,剪切的方向基于该控件的left/right布局属性。若该控件的gravity是水平的:若它的gravity是left的话,则剪切该控件的右边;若该控件的gravity是 right的,则剪切该控件的左边。
  • start – 控件置于容器的起始处,不改变控件的大小。
  • end – 控件置于容器的结束处,不改变控件的大小。

绝对布局 AbsoluteLayout

采用绝对坐标进行布局定位,官方已经逐步弃用。

View及其子元素常用属性:(各种布局及控件的共同属性)

  1. android:id
  2. android:background
  3. android:onClick 为该控件的单击事件绑定监听器
  4. android:padding 设置控件四周的填充区域
  5. android:visibility 设置该控件是否可见(invisible/visible/gone)
  6. android:alpha 设置该组件透明度(0-1之间的数值)
  7. android:layout_height 子组件的布局高度
  8. android:layout_width 子组件的布局宽度
  9. android:layout_margin 设置子组件的外边距

AS视图工具箱(UI控件/组件)

控件名称:【标红色的为常用的】

  1. TextView 文本视图
  2. EditText 文本编辑框
  3. Button 按钮
  4. ImageView、Gallery 图像视图、画廊(建议过期)
  5. ImageButton 图片按钮
  6. ToggleButton 、Switch 开关按钮、开关
  7. RadioButton 单选按钮
  8. CheckBox 多选框
  9. Spinner 下拉列表
  10. AutoCompleteTextView 自动完成文本框
  11. ProgressBar 进度条
  12. SeekBar 拖动条
  13. RatingBar 星级评分条
  14. TimePicker、DatePicker 时间选择器、日期选择器
  15. AnalogClock、DigitalClock 模拟时钟、数字时钟
  16. Dialog(AlertDialog、ProgressDialog、TimePickerDialog、DatePickerDialog)提示对话框、进度对话框、时间选择对话框、日期选择对话框
  17. ListView、GridView 列表视图【*最重要的UI组件*】、 网格视图
  18. ScrollView 滚动视图
  19. ExpandableListView 可展开列表视图
  20. WebView 网页视图
  21. SearchView 搜索框
  22. TabHost 书签选项卡
  23. Notification 、Toast 通知 、 吐司(短时提醒)
  24. Menu(OptionMenu /SubMenu、ContextMenu) 菜单(选项菜单、上下文菜单)
  25. ImageSwitcher、TextSwitcher 、 ViewPager 图像切换器、文本切换器
  26. ActionBar 动作导航条

文本框 TextView

用于显示信息,不能输入,但可以在程序中动态修改显示信息。

TextView 常用属性:

  1. andorid:text 设置文本的内容

  2. android:textColor 设置文本的颜色

  3. android:textSize 设置文本的字体大小(sp)

  4. andorid:height 设置文本的高度,以像素为单位

  5. android:width 设置文本的宽度,以像素为单位

  6. android:inputType 设置文本的类型。例如是普通文本,还是email,password,数字等。

  7. android:singleLine 设置文本是否是单行显示。

  8. android:gravity 设置文本框内文本的对齐方式。可选项有:top、bottom、left、right、center、fill、center_vertical、center_horizontal、fill_horizontal等等。这些属性值也可以同时指定,各属性值之间用竖线隔开。例如right|bottom

  9. android:drawableLeft 用于在文本框左侧绘制图片。该属性值通过“@drawable/图片文件名”来设置。

  10. android:drawableRight 用于在文本框左侧绘制图片。该属性值通过“@drawable/图片文件名”来设置。

  11. android:drawableTop 用于在文本框左侧绘制图片。该属性值通过“@drawable/图片文件名”来设置。

  12. android:drawableBottom 用于在文本框左侧绘制图片。该属性值通过“@drawable/图片文件名”来设置。

  13. android:autoLink 给指定的文本增加可单击的超链接。可选项为:none、web、email、phone、map和all。多个选项之间使用“|”分隔,也可以使用all。

  14. android:hint 设置当文本框内文本内容为空时,默认显示的提示性文字。

  15. android:textAllCaps=“true” 设置所有字母都大小

  16. android:ellipsize=“end” 文字过长,设置省略号。可选项:start , end ,middle,marquee

  17. android:ellipsize=“start” 省略号在开头

  18. android:ellipsize=“middle” 省略号在中间

  19. android:ellipsize=“end” 省略号在结尾

  20. android:ellipsize=“marquee” 跑马灯显示

​ 【备注:】要实现跑马灯效果。要同时具有以下属性。

  • android:ellipsize=“marquee”
  • android:singleLine=“true”
  • android:focusable=“true”
  • android:focusableInTouchMode=“true”
  • android:marqueeRepeatLimit=“marquee_forever”

文本编辑框EditText

EditText 继承了TextView的所有属性。

android:inputType的可选项:

android:inputType="textPersonName" 
android:inputType="textPassword" 
android:inputType="numberPassword"    只可以输入数字
android:inputType="textEmailAddress" 
android:inputType="phone"    只允许输入数字,括号等特殊符号,不可以输入字母。
android:inputType="textPostalAddress"  
android:inputType="time" 
android:inputType="date" 
android:inputType="number" 

按钮Button

Button继承了TextView的所有属性。

sp、dp、dip、dpi 、 pt、px等单位的区别

dpi dpi指像素密度。dots per inch ,即每英寸内像素点的个数。它不是表示长度的单位。

在android中认为:低(120dpi),中(160dpi),高(240dpi),超高(320dpi)。随着技术的增长,实际dpi已经超出这个定义。

dip dimension independent pixels ,即与设备无关的像素。目前这个单位已经被dp所取代,而不建议使用dip。

dp 与dip的概念一样。不过dp已经取代了dip。在Android中用来表示非文字大小的尺寸。例如:外边距、内填充等。

px = dp * (dpi / 160)

​ 3.7寸屏幕,分辨率320*480手机上,正好1px = 1dp。

sp scale independent pixel ,即与缩放比例无关的像素。在android中常用来表示文字大小。

px 表示像素。因为同样是200px,但是在不同手机下显示的大小是不同的。

pt point磅。1磅=1/74英寸

xlarge 屏幕至少:960dp x 720dp

large 屏幕至少 :640dp x 480dp

normal 屏幕至少 :480dp x 320dp

small 屏幕至少 :426dp x 320dp

总之:dp是用来定义非文字的尺寸,sp用来定义文字大小。px只用于产生一条一像素的分割线时使用。

单项选择 RadioGroup 和 RadioButton

多选一的选择模式。因为一组 RadioButton 的选择是单选,任何时候只能是一个被选中。

只有把这一组 RadioButton 放在一个 RadioGroup 里,它们之间才是互斥的。RadioGruop 是

RadioButton 的容器,不仅让它们互斥选择,其 android:orientation 属性还能让它们排列

是水平还是竖直。

参数 view 代表触发这个事件方法的 RadioButton,**int id=view.getId();**取得这个

RadioButton 的 id 的整数值,用分支语句 switch 判断这个 id 与哪个 RadioButton 的 id 相符,然后用 Toast 弹出短暂的窗口提示

多项选择 CheckBox

提供几个选项给用户勾选。因为 CheckBox 不是互斥选择,所以放在 LinearLayout 里排

列好布局就可以了

图片视图 ImageView

它可以把 drawable 下的图片资源显示出来,首先把示例项目下为您准备好的 9 个图片

拷贝到你的 drawable 文件夹下。新建名为活动 ImagesActivity,修改布局文件.

日期选择器(DatePicker)

新建一个 DateTimeActivity,会自动生成布局文件activity_date_time和 content_date_time,

在 content_date_time 的 Design 模式,从视图工具箱的 Date&Time 下拖拽 DatePicker 和

TimePicker 到 content_date_time

下拉列表 Spinner

Spinner 提供一种下拉列表选择的输入方式,这种方式在手机应用上很常见,软件开发

的一个“潜规则”是能让用户选择的时候不让用户填写,因为下拉列表选择的数据规范,而用

户填写的内容可能千奇百怪,需要在程序中处理,否则会导致程序崩溃。

https://blog.csdn.net/weixin_44758662/article/details/107383396?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-9.add_param_isCf&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-9.add_param_isCf 详例1

https://blog.csdn.net/pu2810280557/article/details/100115842?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.add_param_isCf&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.add_param_isCf详例2

AutoCompleteTextView

AutoCompleteTextView用于输入一定字符后显示下拉列表框,供用户进行选择

XML属性功能
android:completionHint设置文本框中的提示信息
android:dropDownHeight设置提示框的高度单位dp
android:dropDownWidth设置提示框的宽度单位dp
android:popuPBackground为提示框设置背景
android:completionThreshold设置输入几个字符串才会显示提示信息
其他其他属性不常用,使用默认设置的就好

ProgressBar

ProgressBar就是我们常用的进度条

XML属性功能
可用 style设置进度条样式
android:max设置进度条最大值
android:progress设置进度条当前进度
android:progressDrawable设置进度条轨道的绘制形式

style

XML属性功能
?android:attr/progressBarStyleHorizontal细长条进度条
?android:attr/progressBarStyleLarge大圆形进度条
?android:attr/progressBarStyleSmall小圆形进度条
@android:style/Widget.ProgressBar.Horizontal粗长条进度条
@android:style/Widget.ProgressBar.Large大跳跃旋转的进度条
@android:style/Widget.ProgressBar.Small大跳跃旋转的进度条

SeekBar

SeekBar是拖动条,用户可以进行拖动,用来改变某种数值
为其设置监听后并重写方法

RatingBar

RatingBar是星状的评分条,如淘宝的评价等

XML属性功能
android:rating设置默认选择的星星数
android:numStars设置评分条总星数
android:stepSize设置评分条最少改变的星星数
android:isIndicator设置评分条是否能改变,true为不能

GridView网格视图

  • android:columnWidth:设置列宽,属性值为正整数,单位为dp,会影响auto_fit的自动调整
  • android:numColumns:设置列数,属性值为正整数,或者使用auto_fit来自动调整
  • android:verticalSpacing:设置行与行之间的间隙,属性值为正整数,单位为dp

GridView中的数据通过适配器Adapter来连接存取,常用的Adapter有四种:

  1. ArrayAdapter:数组适配器,通常用于用于将数组的值包装成多个列表项,只能显示一行文字
  2. SimpleAdapter:用于将list集合的多个值包装成多个列表项,可以自定义各种效果,功能强大
  3. SimpleCursorAdapter:用于将数据库的内容以列表的形式展现出来
  4. BaseAdapter:可以对各个列表项进行最大限度的定制,具有很高的灵活性

使用SimpleAdapter适配器制作相册总览页面:

GridView gridView = findViewById(R.id.gridView);                                                                                                          
//建立一个存储Map<String,Object>类型数据的List列表用于存储数据供下面的simpleAdapter适配器作为参数调用
         List<Map<String,Object>> listItem = new ArrayList<Map<String,Object>>();

//picture为图片资源id数组,将picture中的每一个图片资源id以image为键值key放入map中,然后加入list数组里
         for(int i=0;i<picture.length;i++){
         Map<String,Object> map = new HashMap<String,Object>();
         map.put("image",picture[i]);
         listItem.add(map);
         }

//关于simpleAdapter的构造参数看这个:
//https://blog.csdn.net/perfect2011/article/details/6925283
         SimpleAdapter simpleAdapter = new SimpleAdapter(this,listItem,R.layout.cell,new String[]{"image"},new int[]{R.id.imageView_cell});
         gridView.setAdapter(simpleAdapter);

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oG5soaJV-1688052978114)(C:\Users\user\Desktop\Android_study.assets\1.webp)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U1fS3ZVH-1688052978115)(C:\Users\user\Desktop\Android_study.assets\2.webp)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bUVBlEM9-1688052978115)(C:\Users\user\Desktop\Android_study.assets\3.webp)]

Android布局中match_parent和wrap_content的区别

match_parent

设置一个构件的布局为match_parent将强制性地使构件扩展,以填充布局单元内尽可能多的空间。这跟Windows控件的dockstyle属性大体一致。设置一个顶部布局或控件为match_parent将强制性让它布满整个屏幕。

match—->使等同于,parent—->父母,所以,可以从单词上去理解,它就是强制性的使它的大小等同于父控件,父控件多大,他就多大。

wrap_content

设置一个视图的尺寸为wrap_content将强制性地使视图扩展以显示全部内容。以TextView和ImageView控件为例,设置为wrap_content将完整显示其内部的文本和图像。布局元素将根据内容更改大小。设置一个视图的尺寸为wrap_content大体等同于设置Windows控件的Autosize属性为True。

wrap—->包(着),content—->内容,单词意思上去理解,这个属性就是让这个属性包着内容,转译过来,就是使这个属性和内容的大小刚好。

layout_width(layout_height)在match_parent、wrap_content、0dp时的不同情况

当按水平排放时,

若几个控件的android:layout_width=“wrap_content”,会先分配各个控件内部必须要占用的空间,其他剩余空间按该值得大小比例分配。

若几个控件的android:layout_width=“fill_parent” 会根据该值得比例反比去显示大小。

若android:layout_width="0dip"会按该值得大小比例分配。

竖直时亦然。

drawable样式

​ Drawable分为两种: 一种是普通的图片资源,在Android Studio中我们一般放到res/mipmap目录下, 直接往mipmap目录下丢图片,AS会自动分hdpi,xhdpi…; 另一种是编写的XML形式的Drawable资源,我们一般把他们放到res/drawable目录 下,比如最常见的按钮点击背景切换的Selctor。

​ 在XML我们直接通过@mipmap或者@drawable设置Drawable。 例: android:background = "@mipmap/iv_icon_zhu" / "@drawable/btn_back_selctor", 而在Java代码中我们可以通过Resource的getDrawable(R.mipmap.xxx)可以获得drawable资源 如果是为某个控件设置背景,比如ImageView,我们可以直接调用控件.getDrawale()同样 可以获得drawable对象!

​ Android中drawable中的资源名称有约束,必须是:[a-z0-9_.](即:只能是字母数字及和.), 而且不能以数字开头,否则编译会报错: Invalid file name: must contain only [a-z0-9.]。

ColorDrawable

​ 最简单的一种Drawable,当我们将ColorDrawable绘制到Canvas(画布)上的时候, 会使用一种固定的颜色来填充Paint,然后在画布上绘制出一片单色区域!

  • Java中定义ColorDrawable:
ColorDrawable drawable = new ColorDrawable(0xffff2200);  
txtShow.setBackground(drawable);  
  • 在xml中定义ColorDrawable:
<?xml version="1.0" encoding="utf-8"?>  
<color  
    xmlns:android="http://schemas.android.com/apk/res/android"  
    android:color="#FF0000"/>  

当然上面这些用法,其实用得不多,更多的时候我们是在res/values目录下创建一个color.xml 文件,然后把要用到的颜色值写到里面,需要的时候通过@color获得相应的值,比如:

  • 建立一个color.xml文件

比如:

<?xml version="1.0" encoding="utf-8"?>  
<resources>  
    <color name="material_grey_100">#fff5f5f5</color>
    <color name="material_grey_300">#ffe0e0e0</color>
    <color name="material_grey_50">#fffafafa</color>
    <color name="material_grey_600">#ff757575</color>
    <color name="material_grey_800">#ff424242</color>
    <color name="material_grey_850">#ff303030</color>
    <color name="material_grey_900">#ff212121</color>
</resources>

然后如果是在xml文件中话我们可以通过@color/xxx获得对应的color值 如果是在Java中:

int mycolor = getResources().getColor(R.color.mycolor);    
btn.setBackgroundColor(mycolor);  

ps:另外有一点要注意,如果我们在Java中直接定义颜色值的话,要加上0x,而且不能把透明度漏掉:

int mycolor = 0xff123456;    
btn.setBackgroundColor(mycolor); 
  • 使用系统定义好的color:

比如:BLACK(黑色),BLUE(蓝色),CYAN(青色),GRAY(灰色),GREEN(绿色),RED(红色),WRITE(白色),YELLOW(黄色). 用法:

btn.setBackgroundColor(Color.BLUE); 

也可以获得系统颜色再设置:

int getcolor = Resources.getSystem().getColor(android.R.color.holo_green_light);  
btn.setBackgroundColor(getcolor);  

xml中使用:

android:background="@android:color/black"
  • 利用静态方法argb来设置颜色:

Android使用一个int类型的数据表示颜色值,通常是十六进制,即0x开头, 颜色值的定义是由透明度alpha和RGB(红绿蓝)三原色来定义的,以"#"开始,后面依次为: 透明度-红-绿-蓝;eg:#RGB #ARGB #RRGGBB #AARRGGBB
每个要素都由一个字节(8 bit)来表示,所以取值范围为0~255,在xml中设置颜色可以忽略透明度, 但是如果你是在Java代码中的话就需要明确指出透明度的值了,省略的话表示完全透明,这个时候 就没有效果了哦~比如:0xFF0000虽然表示红色,但是如果直接这样写,什么的没有,而应该这样写: 0xFFFF0000,记Java代码设置颜色值,需要在前面添加上透明度~ 示例:(参数依次为:透明度,红色值,绿色值,蓝色值) txtShow.setBackgroundColor(Color.argb(0xff, 0x00, 0x00, 0x00));

NiewPatchDrawable

  • 点9图不能放在mipmap目录下,而需要放在drawable目录下!
  • AS中的.9图,必须要有黑线,不然编译都不会通过

xml定义NinePatchDrawable:

<!--pic9.xml-->  
<!--参数依次为:引用的.9图片,是否对位图进行抖动处理-->  
<?xml version="1.0" encoding="utf-8"?>  
<nine-patch  
    xmlns:android="http://schemas.android.com/apk/res/android"  
    android:src="@drawable/dule_pic"  
    android:dither="true"/>  

使用Bitmap包装.9图片:

<!--pic9.xml-->  
<!--参数依次为:引用的.9图片,是否对位图进行抖动处理-->  
<?xml version="1.0" encoding="utf-8"?>  
<bitmap  
    xmlns:android="http://schemas.android.com/apk/res/android"  
    android:src="@drawable/dule_pic"  
    android:dither="true"/>

ShapeDrawable

形状的Drawable,定义基本的几何图形,如(矩形,圆形,线条等),根元素是<shape…/> 节点比较多,相关的节点如下:

<shape>:

  • visible:设置是否可见
  • shape:形状,可选:rectangle(矩形,包括正方形),oval(椭圆,包括圆),line(线段),ring(环形)
  • innerRadiusRatio:当shape为ring才有效,表示环内半径所占半径的比率,如果设置了innerRadius, 他会被忽略
  • innerRadius:当shape为ring才有效,表示环的内半径的尺寸
  • thicknessRatio:当shape为ring才有效,表环厚度占半径的比率
  • thickness:当shape为ring才有效,表示环的厚度,即外半径与内半径的差
  • useLevel:当shape为ring才有效,表示是否允许根据level来显示环的一部分

<size>:

  • width:图形形状宽度
  • height:图形形状高度

<solid>

  • color:背景填充色,设置solid后会覆盖gradient设置的所有效果

<stroke>

  • width:边框的宽度
  • color:边框的颜色
  • dashWidth:边框虚线段的长度
  • dashGap:边框的虚线段的间距

<conner>

  • radius:圆角半径,适用于上下左右四个角
  • topLeftRadius,topRightRadius,BottomLeftRadius,tBottomRightRadius: 依次是左上,右上,左下,右下的圆角值,按自己需要设置!

<padding>

  • **left,top,right,bottm:**依次是左上右下方向上的边距!

GradientDrawable

一个具有渐变区域的Drawable,可以实现线性渐变,发散渐变和平铺渐变效果 核心节点:<gradient/>,有如下可选属性:

  • startColor:渐变的起始颜色
  • centerColor:渐变的中间颜色
  • endColor:渐变的结束颜色
  • type:渐变类型,可选(linear,radial,sweep), 线性渐变(可设置渐变角度),发散渐变(中间向四周发散),平铺渐变
  • centerX:渐变中间亚瑟的x坐标,取值范围为:0~1
  • centerY:渐变中间颜色的Y坐标,取值范围为:0~1
  • angle:只有linear类型的渐变才有效,表示渐变角度,必须为45的倍数哦
  • gradientRadius:只有radial和sweep类型的渐变才有效,radial必须设置,表示渐变效果的半径
  • useLevel:判断是否根据level绘制渐变效果

Android 应用程序组件

应用程序组件是一个Android应用程序的基本构建块。这些组件由应用清单文件松耦合的组织。AndroidManifest.xml描述了应用程序的每个组件,以及他们如何交互。

以下是可以在Android应用程序中使用的四个主要组件。

组件描述
Activities描述UI,并且处理用户与机器屏幕的交互。
Services处理与应用程序关联的后台操作。
Broadcast Receivers处理Android操作系统和应用程序之间的通信。
Content Providers处理数据和数据库管理方面的问题。

Activities

一个活动标识一个具有用户界面的单一屏幕。举个例子,一个邮件应用程序可以包含一个活动用于显示新邮件列表,另一个活动用来编写邮件,再一个活动来阅读邮件。当应用程序拥有多于一个活动,其中的一个会被标记为当应用程序启动的时候显示。

一个活动是Activity类的一个子类,如下所示:

public class MainActivity extends Activity {

}

Services

服务是运行在后台,执行长时间操作的组件。举个例子,服务可以是用户在使用不同的程序时在后台播放音乐,或者在活动中通过网络获取数据但不阻塞用户交互。

一个服务是Service类的子类,如下所示:

public class MyService extends Service {

}

Broadcast Receivers

广播接收器简单地响应从其他应用程序或者系统发来的广播消息。举个例子,应用程序可以发起广播来让其他应用程序知道一些数据已经被下载到设备,并且可以供他们使用。因此广播接收器会拦截这些通信并采取适当的行动。

广播接收器是BroadcastReceiver类的一个子类,每个消息以Intent对象的形式来广播。

public class MyReceiver  extends  BroadcastReceiver {

}

Content Providers

内容提供者组件通过请求从一个应用程序到另一个应用程序提供数据。这些请求由ContentResolver类的方法来处理。这些数据可以是存储在文件系统、数据库或者其他其他地方。

内容提供者是ContentProvider类的子类,并实现一套标准的API,以便其他应用程序来执行事务。

public class MyContentProvider extends  ContentProvider {

}

我们将在独立的章节中通过这些标签的细节来涵盖应用程序组件。

附件组件

有一些附件的组件用于以上提到的实体、他们之间逻辑、及他们之间连线的构造。这些组件如下:

组件描述
Fragments代表活动中的一个行为或者一部分用户界面。
Views绘制在屏幕上的UI元素,包括按钮,列表等。
Layouts控制屏幕格式,展示视图外观的View的继承。
Intents组件间的消息连线。
Resources外部元素,例如字符串资源、常量资源及图片资源等。
Manifest应用程序的配置文件。

Android 活动(Activity)

活动代表了一个具有用户界面的单一屏幕,如 Java 的窗口或者帧。Android 的活动是 ContextThemeWrapper 类的子类。

如果你曾经用 C,C++ 或者 Java 语言编程,你应该知道这些程序从 main() 函数开始。很类似的,Android 系统初始化它的程序是通过活动中的 onCreate() 回调的调用开始的。存在有一序列的回调方法来启动一个活动,同时有一序列的方法来关闭活动,如下面的活动声明周期图所示:

图片

Activity 类定义了下面的回调。你可以不用实现所有的回调方法。但了解其中的每一个非常的重要,实现这些可以保证你的应用行为如用户所期望的那样。

回调描述
onCreate()这是第一个回调,在活动第一次创建时调用
onStart()这个回调在活动为用户可见时被调用
onResume()这个回调在应用程序与用户开始可交互的时候调用
onPause()被暂停的活动无法接受用户输入,不能执行任何代码。当前活动将要被暂停,上一个活动将要被恢复时调用
onStop()当活动不在可见时调用
onDestroy()当活动被系统销毁之前调用
onRestart()当活动被停止以后重新打开时调用
package com.example.helloworld;

import android.os.Bundle;
import android.app.Activity;
import android.util.Log;

public class MainActivity extends Activity {
   String msg = "Android : ";

   /** 当活动第一次被创建时调用 */
   @Override
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      Log.d(msg, "The onCreate() event");
   }

   /** 当活动即将可见时调用 */
   @Override
   protected void onStart() {
      super.onStart();
      Log.d(msg, "The onStart() event");
   }

   /** 当活动可见时调用 */
   @Override
   protected void onResume() {
      super.onResume();
      Log.d(msg, "The onResume() event");
   }

   /** 当其他活动获得焦点时调用 */
   @Override
   protected void onPause() {
      super.onPause();
      Log.d(msg, "The onPause() event");
   }

   /** 当活动不再可见时调用 */
   @Override
   protected void onStop() {
      super.onStop();
      Log.d(msg, "The onStop() event");
   }

   /** 当活动将被销毁时调用 */
   @Override
   public void onDestroy() {
      super.onDestroy();
      Log.d(msg, "The onDestroy() event");
   }
}

Android 服务(Service)

服务是一个后台运行的组件,执行长时间运行且不需要用户交互的任务。即使应用被销毁也依然可以工作。服务基本上包含两种状态 -

状态描述
StartedAndroid的应用程序组件,如活动,通过startService()启动了服务,则服务是Started状态。一旦启动,服务可以在后台无限期运行,即使启动它的组件已经被销毁。
Bound当Android的应用程序组件通过bindService()绑定了服务,则服务是Bound状态。Bound状态的服务提供了一个客户服务器接口来允许组件与服务进行交互,如发送请求,获取结果,甚至通过IPC来进行跨进程通信。

服务拥有生命周期方法,可以实现监控服务状态的变化,可以在合适的阶段执行工作。下面的左图展示了当服务通过startService()被创建时的生命周期,右图则显示了当服务通过bindService()被创建时的生命周期:

图片

要创建服务,你需要创建一个继承自Service基类或者它的已知子类的Java类。Service基类定义了不同的回调方法和多数重要方法。你不需要实现所有的回调方法。虽然如此,理解所有的方法还是非常重要的。实现这些回调能确保你的应用以用户期望的方式实现。

回调描述
onStartCommand()其他组件(如活动)通过调用startService()来请求启动服务时,系统调用该方法。如果你实现该方法,你有责任在工作完成时通过stopSelf()或者stopService()方法来停止服务。
onBind当其他组件想要通过bindService()来绑定服务时,系统调用该方法。如果你实现该方法,你需要返回IBinder对象来提供一个接口,以便客户来与服务通信。你必须实现该方法,如果你不允许绑定,则直接返回null。
onUnbind()当客户中断所有服务发布的特殊接口时,系统调用该方法。
onRebind()当新的客户端与服务连接,且此前它已经通过onUnbind(Intent)通知断开连接时,系统调用该方法。
onCreate()当服务通过onStartCommand()和onBind()被第一次创建的时候,系统调用该方法。该调用要求执行一次性安装。
onDestroy()当服务不再有用或者被销毁时,系统调用该方法。你的服务需要实现该方法来清理任何资源,如线程,已注册的监听器,接收器等。

下面的主服务演示了每个方法的生命周期 -

package com.runoob.androidservices;

import android.app.Service;
import android.os.IBinder;
import android.content.Intent;
import android.os.Bundle;

public class HelloService extends Service {

    /** 标识服务如果被杀死之后的行为 */
    int mStartMode;

    /** 绑定的客户端接口 */
    IBinder mBinder;

    /** 标识是否可以使用onRebind */
    boolean mAllowRebind;

    /** 当服务被创建时调用. */
    @Override
    public void onCreate() {

    }

    /** 调用startService()启动服务时回调 */
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return mStartMode;
    }

    /** 通过bindService()绑定到服务的客户端 */
    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }

    /** 通过unbindService()解除所有客户端绑定时调用 */
    @Override
    public boolean onUnbind(Intent intent) {
        return mAllowRebind;
    }

    /** 通过bindService()将客户端绑定到服务时调用*/
    @Override
    public void onRebind(Intent intent) {

    }

    /** 服务不再有用且将要被销毁时调用 */
    @Override
    public void onDestroy() {

    }
}

Android 广播接收器(Broadcast Receivers)

广播接收器用于响应来自其他应用程序或者系统的广播消息。这些消息有时被称为事件或者意图。例如,应用程序可以初始化广播来让其他的应用程序知道一些数据已经被下载到设备,并可以为他们所用。这样广播接收器可以定义适当的动作来拦截这些通信。

有以下两个重要的步骤来使系统的广播意图配合广播接收器工作。

  • 创建广播接收器
  • 注册广播接收器

还有一个附加的步骤,要实现自定义的意图,你必须创建并广播这些意图。


创建广播接收器

广播接收器需要实现为BroadcastReceiver类的子类,并重写onReceive()方法来接收以Intent对象为参数的消息。

public class MyReceiver extends BroadcastReceiver {
   @Override
   public void onReceive(Context context, Intent intent) {
      Toast.makeText(context, "Intent Detected.", Toast.LENGTH_LONG).show();
   }
}

注册广播接收器

应用程序通过在AndroidManifest.xml中注册广播接收器来监听制定的广播意图。假设我们将要注册MyReceiver来监听系统产生的ACTION_BOOT_COMPLETED事件。该事件由Android系统的启动进程完成时发出。

广播接收器(Broadcast Receivers)

<application
   android:icon="@drawable/ic_launcher"
   android:label="@string/app_name"
   android:theme="@style/AppTheme" >
   <receiver android:name="MyReceiver">

      <intent-filter>
         <action android:name="android.intent.action.BOOT_COMPLETED">
         </action>
      </intent-filter>

   </receiver>
</application>

现在,无论什么时候Android设备被启动,都将被广播接收器MyReceiver所拦截,并且在onReceive()中实现的逻辑将被执行。

有许多系统产生的事件被定义为类Intent中的静态常量值。下面的表格列举了重要的系统事件。

事件常量描述
android.intent.action.BATTERY_CHANGED持久的广播,包含电池的充电状态,级别和其他信息。
android.intent.action.BATTERY_LOW标识设备的低电量条件。
android.intent.action.BATTERY_OKAY标识电池在电量低之后,现在已经好了。
android.intent.action.BOOT_COMPLETED在系统完成启动后广播一次。
android.intent.action.BUG_REPORT显示报告bug的活动。
android.intent.action.CALL执行呼叫数据指定的某人。
android.intent.action.CALL_BUTTON用户点击"呼叫"按钮打开拨号器或者其他拨号的合适界面。
android.intent.action.DATE_CHANGED日期发生改变。
android.intent.action.REBOOT设备重启。

广播自定义意图

如果你想要应用程序中生成并发送自定义意图,你需要在活动类中通过sendBroadcast()来创建并发送这些意图。如果你使用sendStickyBroadcast(Intent)方法,则意图是持久的(sticky),这意味者你发出的意图在广播完成后一直保持着。

public void broadcastIntent(View view)
{
   Intent intent = new Intent();
   intent.setAction("com.runoob.CUSTOM_INTENT");
   sendBroadcast(intent);
}

com.runoob.CUSTOM_INTENT的意图可以像之前我们注册系统产生的意图一样被注册。

<application
   android:icon="@drawable/ic_launcher"
   android:label="@string/app_name"
   android:theme="@style/AppTheme" >
   <receiver android:name="MyReceiver">

      <intent-filter>
         <action android:name="com.runoob.CUSTOM_INTENT">
         </action>
      </intent-filter>

   </receiver>
</application>

Android - 内容提供者(Content Provider)

内容提供者组件通过请求从一个应用程序向其他的应用程序提供数据。这些请求由类 ContentResolver 的方法来处理。内容提供者可以使用不同的方式来存储数据。数据可以被存放在数据库,文件,甚至是网络。

图片

有时候需要在应用程序之间共享数据。这时内容提供者变得非常有用。

内容提供者可以让内容集中,必要时可以有多个不同的应用程序来访问。内容提供者的行为和数据库很像。你可以查询,编辑它的内容,使用 insert(), update(), delete() 和 query() 来添加或者删除内容。多数情况下数据被存储在 SQLite 数据库。

内容提供者被实现为类 ContentProvider 类的子类。需要实现一系列标准的 API,以便其他的应用程序来执行事务。

public class MyApplication extends  ContentProvider {

}

内容URI

要查询内容提供者,你需要以如下格式的URI的形式来指定查询字符串:

<prefix>://<authority>/<data_type>/<id>

以下是URI中各部分的具体说明:

部分说明
prefix前缀:一直被设置为content://
authority授权:指定内容提供者的名称,例如联系人,浏览器等。第三方的内容提供者可以是全名,如:cn.programmer.statusprovider
data_type数据类型:这个表明这个特殊的内容提供者中的数据的类型。例如:你要通过内容提供者Contacts来获取所有的通讯录,数据路径是people,那么URI将是下面这样:content://contacts/people
id这个指定特定的请求记录。例如:你在内容提供者Contacts中查找联系人的ID号为5,那么URI看起来是这样:content://contacts/people/5

创建内容提供者

这里描述创建自己的内容提供者的简单步骤。

  • 首先,你需要继承类 ContentProviderbase 来创建一个内容提供者类。
  • 其次,你需要定义用于访问内容的你的内容提供者URI地址。
  • 接下来,你需要创建数据库来保存内容。通常,Android 使用 SQLite 数据库,并在框架中重写 onCreate() 方法来使用 SQLiteOpenHelper 的方法创建或者打开提供者的数据库。当你的应用程序被启动,它的每个内容提供者的 onCreate() 方法将在应用程序主线程中被调用。
  • 最后,使用<provider…/>标签在 AndroidManifest.xml 中注册内容提供者。

以下是让你的内容提供者正常工作,你需要在类 ContentProvider 中重写的一些方法:

图片

  • onCreate():当提供者被启动时调用。
  • query():该方法从客户端接受请求。结果是返回指针(Cursor)对象。
  • insert():该方法向内容提供者插入新的记录。
  • delete():该方法从内容提供者中删除已存在的记录。
  • update():该方法更新内容提供者中已存在的记录。
  • getType():该方法为给定的URI返回元数据类型。

Android 资源(Resources)访问

一个优秀的 Android 应用程序由许多东西用来构建。除了应用程序的编码,还有各种各样的资源,诸如各种静态内容,如位图,颜色,布局定义,用户界面字符串,动画等等。

这些资源一般放置在项目的 res/ 下独立子目录中。

每种资源需要放置在项目中 res/ 目录的特定子目录下。

res/ 目录在各种子目录中包含了所有的资源。下表详细的给出了在项目中 res/ 目录里面支持的资源。

目录资源类型
anim/定义动画属性的XML文件。它们被保存在res/anim/文件夹下,通过R.anim类访问
color/定义颜色状态列表的XML文件。它们被保存在res/color/文件夹下,通过R.color类访问
drawable/图片文件,如.png,.jpg,.gif或者XML文件,被编译为位图、状态列表、形状、动画图片。它们被保存在res/drawable/文件夹下,通过R.drawable类访问
layout/定义用户界面布局的XML文件。它们被保存在res/layout/文件夹下,通过R.layout类访问
menu/定义应用程序菜单的XML文件,如选项菜单,上下文菜单,子菜单等。它们被保存在res/menu/文件夹下,通过R.menu类访问
raw/任意的文件以它们的原始形式保存。需要根据名为R.raw.filename的资源ID,通过调用Resource.openRawResource()来打开raw文件
values/包含简单值(如字符串,整数,颜色等)的XML文件。这里有一些文件夹下的资源命名规范。arrays.xml代表数组资源,通过R.array类访问;integers.xml代表整数资源,通过R.integer类访问;bools.xml代表布尔值资源,通过R.bool类访问;colors.xml代表颜色资源,通过R.color类访问;dimens.xml代表维度值,通过R.dimen类访问;strings.xml代表字符串资源,通过R.string类访问;styles.xml代表样式资源,通过R.style类访问
xml/可以通过调用Resources.getXML()来在运行时读取任意的XML文件。可以在这里保存运行时使用的各种配置文件

替代资源

你的应用程序需要为特定的设备配置提供替代的资源支持。比如说,你需要为不同的屏幕分辨率提供替代的图片资源,为不同的语言提供替代的字符串资源。在运行时,Android 检测当前设备配置,并为应用程序加载合适的资源。

要为特定的配置的确定一系列替代资源,遵循如下的步骤:

  • 在res/ 下创建一个新的目录,以 <resource_name>_<config_qualifier> 的方式命名。这里的 resources_name 是上表中提到的任意资源,如布局、图片等。 qualifier 将确定个性的配置使用哪些资源。你可以查看官方文档来了解不同类型资源的一个完整 qualifier 列表。
  • 在这个目录中保存响应的替代资源。这些资源文件必须与下面例子中展示的默认资源文件名一致,然而这些文件将确定的内容进行替代。例如:虽然图片的文件名一样,但是高分辨率的屏幕,图片的分辨率也会高。

访问资源

在应用程序开发中,需要访问定义好的资源,不论是通过代码还是通过 XML 文件。下面的章节介绍如何分别在这两种场景中访问资源。

在代码访问资源

当 Android 应用程序被编译,生成一个 R 类,其中包含了所有 res/ 目录下资源的 ID。你可以使用 R 类,通过子类+资源名或者直接使用资源 ID 来访问资源。

实例

访问 res/drawable/myimage.png,并将其设置到 ImageView 上,你将使用以下代码:

ImageView imageView = (ImageView) findViewById(R.id.myimageview);
imageView.setImageResource(R.drawable.myimage);

这里第一行代码用 R.id.myimageview 来在布局文件中获取定义为 myimageview 的 ImageView。第二行用 R.drawable.myimage 来获取在 res/ 的 drawable 子目录下名为 myimage 的图片。

考虑下一个例子,其中 res/values/strings.xml 有如下定义:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string  name="hello">Hello, World!</string>
</resources>

现在你可以在 ID 为 msg 的 TextView 对象上使用资源 ID 来设置文本,具体如下:

TextView msgTextView = (TextView) findViewById(R.id.msg);
msgTextView.setText(R.string.hello);

考虑如下定义的布局 res/layout/activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="fill_parent" 
   android:layout_height="fill_parent" 
   android:orientation="vertical" >

   <TextView android:id="@+id/text"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Hello, I am a TextView" />

   <Button android:id="@+id/button"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Hello, I am a Button" />

</LinearLayout>

这个应用程序代码将为活动加载这个布局,onCreate() 方法中如下:

public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.main_activity);
}

在XML中访问

考虑下面的 XML 资源文件 res/values/strings.xml,其中包含一个颜色资源和一个字符串资源 -

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <color name="opaque_red">#f00</color>
   <string name="hello">Hello!</string>
</resources>

现在,你可以在下面的布局文件中使用这些资源来设置文本颜色和文本内容:

<?xml version="1.0" encoding="utf-8"?>
<EditText xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:textColor="@color/opaque_red"
    android:text="@string/hello" />

Android 碎片(Fragment)

碎片是活动的一部分,使得活动更加的模块化设计。我们可以认为碎片是一种子活动。

下面是关于碎片的重要知识点 -

  • 碎片拥有自己的布局,自己的行为及自己的生命周期回调。
  • 当活动在运行的时候,你可以在活动中添加或者移除碎片。
  • 你可以合并多个碎片在一个单一的活动中来构建多栏的UI。
  • 碎片可以被用在多个活动中。
  • 碎片的生命周期和它的宿主活动紧密关联。这意味着活动被暂停,所有活动中的碎片被停止。
  • 碎片可以实现行为而没有用户界面组件。
  • 碎片是 Android API 版本11中被加入到 Android API。

通过继承 Fragment 类来创建碎片。可以通过使用 元素在活动的布局文件中声明碎片来在你的活动中插入碎片。

在引入碎片之前,由于每次给定的一个时间点在屏幕上只能显示单一的活动,因此我们有一个局限。我们无法分割设备屏幕并且独立的控制不同的部分。伴随着碎片的引入,我们获得了更大的灵活性,并使得一个时间点只能在屏幕上有一个单一活动的限制被移除。现在我们可以有单一的活动,但每个活动由多个碎片组装,每个碎片有自己的布局,事件和完整的生命周期。

下面是一个典型的示例演示如何让两个由碎片定义的UI模块,在为平板设计的活动中组合,在为手持设备设计的活动中分离。

图片

当运行在在平板尺寸的设备上,这个应用程序可以在活动A中嵌入两个碎片。在手机设备屏幕上,由于没有足够的空间,活动A仅包含有文章列表的碎片,当用户点击文章时,启动包含第二个碎片的活动B来阅读文章。

碎片的生命周期

Android 的碎片拥有自己的生命周期,与 Android 的活动很相似。下面简单介绍它生命周期的不同阶段。

图片

这是在类fragment中你可以重写的方法列表:

  • onAttach(): 碎片实例被关联到活动实例。碎片和活动还没有完全初始化。通常,你在该方法中获取到活动的引用,在碎片将来的初始化工作中被使用。
  • onCreate(): 当创建碎片时,系统调用该方法。你需要初始化一些碎片的必要组件。这些组件是当碎片被暂停、停止时需要保留的,以便被恢复。
  • onCreateView(): 当碎片将要第一次绘制它的用户界面时系统调用该方法。为了绘制碎片的UI,你需要从该方法中返回一个代表碎片根布局的View组件。如果该碎片不提供用户界面,直接返回null。
  • onActivityCreated: 当宿主活动被创建,在onCreateView()方法之后调用该方法。活动和碎片实例与活动的视图层级被创建。这时,视图可以通过findViewById()方法来访问。在这个方法中,你可以实例化需要Context对象的对象。
  • onStart(): 碎片可见时调用该方法。
  • onResume(): 碎片可交互时调用该方法。
  • onPause(): 当首次表明用户将要离开碎片时系统调用该方法。通常,这里你需要提交任何的会超出用户会话的持久化的变化。
  • onStop(): 碎片将要被停止时调用。
  • onDestroyView(): 调用该方法后,碎片将要被销毁。
  • onDestroy(): 该方法被用来清理碎片的状态。但在Android平台并不保证一定被调用。

如何使用碎片?

这里介绍创建碎片的简单步骤。

  • 首先决定在活动中需要使用多少个碎片。例如,我们需要使用两个碎片来处理设备的横屏和竖屏两种模式。
  • 下一步,基于碎片数量,创建继承自类Fragment的类。类Fragment包含上面提到的回调函数。根据你的需求重写任意的方法。
  • 对应每个片段,你需要在XML文件中创建布局。这些文件中包含已定义的碎片的布局。
  • 最后,基于需求修改活动文件来定义实际的碎片替换逻辑。

碎片类型

基本的碎片可以分为如下所示的三种:

  • 单帧碎片 - 单帧碎片被如移动电话之类的手持设备使用。一个碎片如同一个视频一样显示。
  • 列表碎片 - 包含有特殊列表视图的碎片被叫做列表碎片。
  • 碎片过渡 - 与碎片事务一起使用。可以从一个碎片移动到另外一个碎片。

颜色表

Color颜色HEXRGB
LightPink浅粉红#FFB6C1255,182,193
Pink粉红#FFC0CB255,192,203
Crimson深红(猩红)#DC143C220,20,60
LavenderBlush淡紫红#FFF0F5255,240,245
PaleVioletRed弱紫罗兰红#DB7093219,112,147
HotPink热情的粉红#FF69B4255,105,180
DeepPink深粉红#FF1493255,20,147
MediumVioletRed中紫罗兰红#C71585199,21,133
Orchid暗紫色(兰花紫)#DA70D6218,112,214
Thistle蓟色#D8BFD8216,191,216
Plum洋李色(李子紫)#DDA0DD221,160,221
Violet紫罗兰#EE82EE238,130,238
Magenta洋红(玫瑰红)#FF00FF255,0,255
Fuchsia紫红(灯笼海棠)#FF00FF255,0,255
DarkMagenta深洋红#8B008B139,0,139
Purple紫色#800080128,0,128
MediumOrchid中兰花紫#BA55D3186,85,211
DarkViolet暗紫罗兰#9400D3148,0,211
DarkOrchid暗兰花紫#9932CC153,50,204
Indigo靛青/紫兰色#4B008275,0,130
BlueViolet蓝紫罗兰#8A2BE2138,43,226
MediumPurple中紫色#9370DB147,112,219
MediumSlateBlue中暗蓝色(中板岩蓝)#7B68EE123,104,238
SlateBlue石蓝色(板岩蓝)#6A5ACD106,90,205
DarkSlateBlue暗灰蓝色(暗板岩蓝)#483D8B72,61,139
Lavender淡紫色(熏衣草淡紫)#E6E6FA230,230,250
GhostWhite幽灵白#F8F8FF248,248,255
Blue纯蓝#0000FF0,0,255
MediumBlue中蓝色#0000CD0,0,205
MidnightBlue午夜蓝#19197025,25,112
DarkBlue暗蓝色#00008B0,0,139
Navy海军蓝#0000800,0,128
RoyalBlue皇家蓝/宝蓝#4169E165,105,225
CornflowerBlue矢车菊蓝#6495ED100,149,237
LightSteelBlue亮钢蓝#B0C4DE176,196,222
LightSlateGray亮蓝灰(亮石板灰)#778899119,136,153
SlateGray灰石色(石板灰)#708090112,128,144
DodgerBlue闪兰色(道奇蓝)#1E90FF30,144,255
AliceBlue爱丽丝蓝#F0F8FF240,248,255
SteelBlue钢蓝/铁青#4682B470,130,180
LightSkyBlue亮天蓝色#87CEFA135,206,250
SkyBlue天蓝色#87CEEB135,206,235
DeepSkyBlue深天蓝#00BFFF0,191,255
LightBlue亮蓝#ADD8E6173,216,230
PowderBlue粉蓝色(火药青)#B0E0E6176,224,230
CadetBlue军兰色(军服蓝)#5F9EA095,158,160
Azure蔚蓝色#F0FFFF240,255,255
LightCyan淡青色#E0FFFF224,255,255
PaleTurquoise弱绿宝石#AFEEEE175,238,238
Cyan青色#00FFFF0,255,255
Aqua浅绿色(水色)#00FFFF0,255,255
DarkTurquoise暗绿宝石#00CED10,206,209
DarkSlateGray暗瓦灰色(暗石板灰)#2F4F4F47,79,79
DarkCyan暗青色#008B8B0,139,139
Teal水鸭色#0080800,128,128
MediumTurquoise中绿宝石#48D1CC72,209,204
LightSeaGreen浅海洋绿#20B2AA32,178,170
Turquoise绿宝石#40E0D064,224,208
Aquamarine宝石碧绿#7FFFD4127,255,212
MediumAquamarine中宝石碧绿#66CDAA102,205,170
MediumSpringGreen中春绿色#00FA9A0,250,154
MintCream薄荷奶油#F5FFFA245,255,250
SpringGreen春绿色#00FF7F0,255,127
MediumSeaGreen中海洋绿#3CB37160,179,113
SeaGreen海洋绿#2E8B5746,139,87
Honeydew蜜色(蜜瓜色)#F0FFF0240,255,240
LightGreen淡绿色#90EE90144,238,144
PaleGreen弱绿色#98FB98152,251,152
DarkSeaGreen暗海洋绿#8FBC8F143,188,143
LimeGreen闪光深绿#32CD3250,205,50
Lime闪光绿#00FF000,255,0
ForestGreen森林绿#228B2234,139,34
Green纯绿#0080000,128,0
DarkGreen暗绿色#0064000,100,0
Chartreuse黄绿色(查特酒绿)#7FFF00127,255,0
LawnGreen草绿色(草坪绿_#7CFC00124,252,0
GreenYellow绿黄色#ADFF2F173,255,47
DarkOliveGreen暗橄榄绿#556B2F85,107,47
YellowGreen黄绿色#9ACD32154,205,50
OliveDrab橄榄褐色#6B8E23107,142,35
Beige米色/灰棕色#F5F5DC245,245,220
LightGoldenrodYellow亮菊黄#FAFAD2250,250,210
Ivory象牙色#FFFFF0255,255,240
LightYellow浅黄色#FFFFE0255,255,224
Yellow纯黄#FFFF00255,255,0
Olive橄榄#808000128,128,0
DarkKhaki暗黄褐色(深卡叽布)#BDB76B189,183,107
LemonChiffon柠檬绸#FFFACD255,250,205
PaleGoldenrod灰菊黄(苍麒麟色)#EEE8AA238,232,170
Khaki黄褐色(卡叽布)#F0E68C240,230,140
Gold金色#FFD700255,215,0
Cornsilk玉米丝色#FFF8DC255,248,220
Goldenrod金菊黄#DAA520218,165,32
DarkGoldenrod暗金菊黄#B8860B184,134,11
FloralWhite花的白色#FFFAF0255,250,240
OldLace老花色(旧蕾丝)#FDF5E6253,245,230
Wheat浅黄色(小麦色)#F5DEB3245,222,179
Moccasin鹿皮色(鹿皮靴)#FFE4B5255,228,181
Orange橙色#FFA500255,165,0
PapayaWhip番木色(番木瓜)#FFEFD5255,239,213
BlanchedAlmond白杏色#FFEBCD255,235,205
NavajoWhite纳瓦白(土著白)#FFDEAD255,222,173
AntiqueWhite古董白#FAEBD7250,235,215
Tan茶色#D2B48C210,180,140
BurlyWood硬木色#DEB887222,184,135
Bisque陶坯黄#FFE4C4255,228,196
DarkOrange深橙色#FF8C00255,140,0
Linen亚麻布#FAF0E6250,240,230
Peru秘鲁色#CD853F205,133,63
PeachPuff桃肉色#FFDAB9255,218,185
SandyBrown沙棕色#F4A460244,164,96
Chocolate巧克力色#D2691E210,105,30
SaddleBrown重褐色(马鞍棕色)#8B4513139,69,19
Seashell海贝壳#FFF5EE255,245,238
Sienna黄土赭色#A0522D160,82,45
LightSalmon浅鲑鱼肉色#FFA07A255,160,122
Coral珊瑚#FF7F50255,127,80
OrangeRed橙红色#FF4500255,69,0
DarkSalmon深鲜肉/鲑鱼色#E9967A233,150,122
Tomato番茄红#FF6347255,99,71
MistyRose浅玫瑰色(薄雾玫瑰)#FFE4E1255,228,225
Salmon鲜肉/鲑鱼色#FA8072250,128,114
Snow雪白色#FFFAFA255,250,250
LightCoral淡珊瑚色#F08080240,128,128
RosyBrown玫瑰棕色#BC8F8F188,143,143
IndianRed印度红#CD5C5C205,92,92
Red纯红#FF0000255,0,0
Brown棕色#A52A2A165,42,42
FireBrick火砖色(耐火砖)#B22222178,34,34
DarkRed深红色#8B0000139,0,0
Maroon栗色#800000128,0,0
White纯白#FFFFFF255,255,255
WhiteSmoke白烟#F5F5F5245,245,245
Gainsboro淡灰色(庚斯博罗灰)#DCDCDC220,220,220
LightGrey浅灰色#D3D3D3211,211,211
Silver银灰色#C0C0C0192,192,192
DarkGray深灰色#A9A9A9169,169,169
Gray灰色#808080128,128,128
DimGray暗淡的灰色#696969105,105,105
Black纯黑#0000000,0,0

ll | 海贝壳 | #FFF5EE | 255,245,238 |
| Sienna | 黄土赭色 | #A0522D | 160,82,45 |
| LightSalmon | 浅鲑鱼肉色 | #FFA07A | 255,160,122 |
| Coral | 珊瑚 | #FF7F50 | 255,127,80 |
| OrangeRed | 橙红色 | #FF4500 | 255,69,0 |
| DarkSalmon | 深鲜肉/鲑鱼色 | #E9967A | 233,150,122 |
| Tomato | 番茄红 | #FF6347 | 255,99,71 |
| MistyRose | 浅玫瑰色(薄雾玫瑰) | #FFE4E1 | 255,228,225 |
| Salmon | 鲜肉/鲑鱼色 | #FA8072 | 250,128,114 |
| Snow | 雪白色 | #FFFAFA | 255,250,250 |
| LightCoral | 淡珊瑚色 | #F08080 | 240,128,128 |
| RosyBrown | 玫瑰棕色 | #BC8F8F | 188,143,143 |
| IndianRed | 印度红 | #CD5C5C | 205,92,92 |
| Red | 纯红 | #FF0000 | 255,0,0 |
| Brown | 棕色 | #A52A2A | 165,42,42 |
| FireBrick | 火砖色(耐火砖) | #B22222 | 178,34,34 |
| DarkRed | 深红色 | #8B0000 | 139,0,0 |
| Maroon | 栗色 | #800000 | 128,0,0 |
| White | 纯白 | #FFFFFF | 255,255,255 |
| WhiteSmoke | 白烟 | #F5F5F5 | 245,245,245 |
| Gainsboro | 淡灰色(庚斯博罗灰) | #DCDCDC | 220,220,220 |
| LightGrey | 浅灰色 | #D3D3D3 | 211,211,211 |
| Silver | 银灰色 | #C0C0C0 | 192,192,192 |
| DarkGray | 深灰色 | #A9A9A9 | 169,169,169 |
| Gray | 灰色 | #808080 | 128,128,128 |
| DimGray | 暗淡的灰色 | #696969 | 105,105,105 |
| Black | 纯黑 | #000000 | 0,0,0 |

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值