智能手机操作系统
对于智能手机大家都不陌生,现在大多数人使用的都是智能手机。而智能手机操作系统,就是智能手机所使用的系统,它和计算机的操作系统类似。目前,智能手机操作系统主要包括Android、iOS、Windows Mobile、Windows Phone、BlackBerry、Symbian、PalmOS和Linux等。
2017年第一季度各智能手机操作系统占中国的市场份额如图所示。现在市场上最流行的就是Android和iOS。
Android发展史
2003年安迪鲁宾成立Android公司,2005年谷歌收购Android公司,2008年Android1.1版本发布, 2010年推出Android2.2版本(冻酸奶),2017年Google的I/O大会宣布安卓设备超过20亿部。
Android的主要版本
到目前为止已经经历了十多个版本变化,从版本1.5开始版本的编号都是根据甜点命名的,下面的就是每个版本所对应的甜点,并且版本是根据26个字母进行排列的。这些版本都是开源的,免费使用的。
Android系统架构层
Android系统架构从下到上可以分为Linux Kernel和Android Runtime、Application Framework以及Applications四层,其中Libraries与Android Runtime在同一层。 1、Applications(应用层)是用Java语言编写的运行在Android平台上的程序,如Google默认提供的通讯录、SMS、日历、地图及浏览器等程序。作为Android开发人员,通常需要做的就是编写在应用层上运行的应用程序,例如,现在大火的王者荣耀、贪吃蛇大作战等程序。 2、Application Framework(应用程序框架) 无论是Android提供的应用程序还是开发人员自己编写的应用程序,都需要使用Application Framework(应用程序框架)。通过使用Application Framework,不仅可以大幅度简化代码的编写,而且可以提高程序的复用性。 3、Libraries(库)和Android Runtime(Android运行时) 本层主要由两部分组成,一部分是Android提供的一组C/C++库,为平台的不同组件所使用。开发人员通过Application Framework来使用这些库所提供的不同功能。另一部分是Android运行时,包括核心库和Dalvik虚拟机两部分。核心库中提供了Java语言核心库中包含的大部分功能,虚拟机负责运行程序。Dalvik虚拟机专门针对移动设备进行编写,不仅效率更高,而且占用内存更少。 4、Linux Kernel(Linux内核心) Android的核心系统服务依赖于Linux内核,包括安全性、内存管理、进程管理、网络协议栈和驱动模型等。另外,Linux内核同时也是硬件和软件栈之间的抽象层,而Android更多的是需要一些与移动设备相关的驱动程序,如照相机驱动、蓝牙驱动和USB接口驱动等。
Android开发概述
1、Android是Google开发的操作系统 2、Android开发是移动应用开发的表现之一
完整项目最精简流程
首先是安卓客户端在手机上看到的内容,安卓客户端要调用网络接口,接口再去获取数据库的数据,那么数据库再把数据返回给接口,接口再把数据返回给客户端,最后在客户端进行展现。这是最精简的一个流程,当然也会有丰富的,比如插入数据的缓存、服务器的部署。
Android开发工具
Eclipse曾经是作为一个很热门的开发工具,当Google自己推出Android Studio之后,这个时代就变了把Eclipse废弃掉了。现在在公司中都是使用Android Studio进行开发的,并且Google已经停止了对Eclipse的继续支持,尽管Eclipse还可以继续进行开发但是对于新的ATT、DDI、MMS已经不在继续跟踪和支持了。 1、下载安装JDK 2、Android Studio 在后面的课程会加入如何使用Eclipse和Android Studio的使用,主要是根据She平台的使用。
智能手机操作系统
对于智能手机大家都不陌生,现在大多数人使用的都是智能手机。而智能手机操作系统,就是智能手机所使用的系统,它和计算机的操作系统类似。目前,智能手机操作系统主要包括Android、iOS、Windows Mobile、Windows Phone、BlackBerry、Symbian、PalmOS和Linux等。
2017年第一季度各智能手机操作系统占中国的市场份额如图所示。现在市场上最流行的就是Android和iOS。
Android发展史
2003年安迪鲁宾成立Android公司,2005年谷歌收购Android公司,2008年Android1.1版本发布, 2010年推出Android2.2版本(冻酸奶),2017年Google的I/O大会宣布安卓设备超过20亿部。
Android的主要版本
到目前为止已经经历了十多个版本变化,从版本1.5开始版本的编号都是根据甜点命名的,下面的就是每个版本所对应的甜点,并且版本是根据26个字母进行排列的。这些版本都是开源的,免费使用的。
Android系统架构层
Android系统架构从下到上可以分为Linux Kernel和Android Runtime、Application Framework以及Applications四层,其中Libraries与Android Runtime在同一层。 1、Applications(应用层)是用Java语言编写的运行在Android平台上的程序,如Google默认提供的通讯录、SMS、日历、地图及浏览器等程序。作为Android开发人员,通常需要做的就是编写在应用层上运行的应用程序,例如,现在大火的王者荣耀、贪吃蛇大作战等程序。 2、Application Framework(应用程序框架) 无论是Android提供的应用程序还是开发人员自己编写的应用程序,都需要使用Application Framework(应用程序框架)。通过使用Application Framework,不仅可以大幅度简化代码的编写,而且可以提高程序的复用性。 3、Libraries(库)和Android Runtime(Android运行时) 本层主要由两部分组成,一部分是Android提供的一组C/C++库,为平台的不同组件所使用。开发人员通过Application Framework来使用这些库所提供的不同功能。另一部分是Android运行时,包括核心库和Dalvik虚拟机两部分。核心库中提供了Java语言核心库中包含的大部分功能,虚拟机负责运行程序。Dalvik虚拟机专门针对移动设备进行编写,不仅效率更高,而且占用内存更少。 4、Linux Kernel(Linux内核心) Android的核心系统服务依赖于Linux内核,包括安全性、内存管理、进程管理、网络协议栈和驱动模型等。另外,Linux内核同时也是硬件和软件栈之间的抽象层,而Android更多的是需要一些与移动设备相关的驱动程序,如照相机驱动、蓝牙驱动和USB接口驱动等。
Android开发概述
1、Android是Google开发的操作系统 2、Android开发是移动应用开发的表现之一
完整项目最精简流程
首先是安卓客户端在手机上看到的内容,安卓客户端要调用网络接口,接口再去获取数据库的数据,那么数据库再把数据返回给接口,接口再把数据返回给客户端,最后在客户端进行展现。这是最精简的一个流程,当然也会有丰富的,比如插入数据的缓存、服务器的部署。
Android开发工具
Eclipse曾经是作为一个很热门的开发工具,当Google自己推出Android Studio之后,这个时代就变了把Eclipse废弃掉了。现在在公司中都是使用Android Studio进行开发的,并且Google已经停止了对Eclipse的继续支持,尽管Eclipse还可以继续进行开发但是对于新的ATT、DDI、MMS已经不在继续跟踪和支持了。 1、下载安装JDK 2、Android Studio 在后面的课程会加入如何使用Eclipse和Android Studio的使用,主要是根据She平台的使用。
智能手机操作系统
对于智能手机大家都不陌生,现在大多数人使用的都是智能手机。而智能手机操作系统,就是智能手机所使用的系统,它和计算机的操作系统类似。目前,智能手机操作系统主要包括Android、iOS、Windows Mobile、Windows Phone、BlackBerry、Symbian、PalmOS和Linux等。
2017年第一季度各智能手机操作系统占中国的市场份额如图所示。现在市场上最流行的就是Android和iOS。
Android发展史
2003年安迪鲁宾成立Android公司,2005年谷歌收购Android公司,2008年Android1.1版本发布, 2010年推出Android2.2版本(冻酸奶),2017年Google的I/O大会宣布安卓设备超过20亿部。
Android的主要版本
到目前为止已经经历了十多个版本变化,从版本1.5开始版本的编号都是根据甜点命名的,下面的就是每个版本所对应的甜点,并且版本是根据26个字母进行排列的。这些版本都是开源的,免费使用的。
Android系统架构层
Android系统架构从下到上可以分为Linux Kernel和Android Runtime、Application Framework以及Applications四层,其中Libraries与Android Runtime在同一层。 1、Applications(应用层)是用Java语言编写的运行在Android平台上的程序,如Google默认提供的通讯录、SMS、日历、地图及浏览器等程序。作为Android开发人员,通常需要做的就是编写在应用层上运行的应用程序,例如,现在大火的王者荣耀、贪吃蛇大作战等程序。 2、Application Framework(应用程序框架) 无论是Android提供的应用程序还是开发人员自己编写的应用程序,都需要使用Application Framework(应用程序框架)。通过使用Application Framework,不仅可以大幅度简化代码的编写,而且可以提高程序的复用性。 3、Libraries(库)和Android Runtime(Android运行时) 本层主要由两部分组成,一部分是Android提供的一组C/C++库,为平台的不同组件所使用。开发人员通过Application Framework来使用这些库所提供的不同功能。另一部分是Android运行时,包括核心库和Dalvik虚拟机两部分。核心库中提供了Java语言核心库中包含的大部分功能,虚拟机负责运行程序。Dalvik虚拟机专门针对移动设备进行编写,不仅效率更高,而且占用内存更少。 4、Linux Kernel(Linux内核心) Android的核心系统服务依赖于Linux内核,包括安全性、内存管理、进程管理、网络协议栈和驱动模型等。另外,Linux内核同时也是硬件和软件栈之间的抽象层,而Android更多的是需要一些与移动设备相关的驱动程序,如照相机驱动、蓝牙驱动和USB接口驱动等。
Android开发概述
1、Android是Google开发的操作系统 2、Android开发是移动应用开发的表现之一
完整项目最精简流程
首先是安卓客户端在手机上看到的内容,安卓客户端要调用网络接口,接口再去获取数据库的数据,那么数据库再把数据返回给接口,接口再把数据返回给客户端,最后在客户端进行展现。这是最精简的一个流程,当然也会有丰富的,比如插入数据的缓存、服务器的部署。
Android开发工具
Eclipse曾经是作为一个很热门的开发工具,当Google自己推出Android Studio之后,这个时代就变了把Eclipse废弃掉了。现在在公司中都是使用Android Studio进行开发的,并且Google已经停止了对Eclipse的继续支持,尽管Eclipse还可以继续进行开发但是对于新的ATT、DDI、MMS已经不在继续跟踪和支持了。 1、下载安装JDK 2、Android Studio 在后面的课程会加入如何使用Eclipse和Android Studio的使用,主要是根据She平台的使用。
Eclipse流程
1、点击菜单栏的File->New->Android Application Project,然后按照下图进行参数配置,点击Next进入下一步
2、出现左图时选择“Empty Activity”,点击“Next”进入右图界面,点击“Finish”结束
3、运行“Hello World”项目。选中左侧树形菜单根节点“HW”,点击菜单栏“Run”菜单中的“Run”按钮,在弹出的窗口中选择“Android Application”点击“OK”,运行成功的界面如图所示
Android Studio流程
1、点击Flie->New->New Module
2、选择Phone & Table Module,这是手机和平板的开发
3、创建Phone & Tablet Module
4、选择空的项目
5、这里的名字无须修改,点击Finish,完成创建
6、运行程序,确定运行的是HelloWord程序,AVD,点击绿色三角运行程序
She流程
1、创建一个安卓项目
2、先打开AVD(httpd-dev-server->vnc_lite.html->AVD)
3、等待启动。
4、返回new terminal,点击build
5、点击run,运行程序
6、在AVD中点击Android Example程序
布局管理器
一个页面上元素会有很多,会有很多的组件摆放在同一个页面上,这些元素的相互之间摆放的位置是如何确定的?他们之间的联系是谁来管理他们的?那么我们就是通过布局管理器来实现的。我们主要讲解两个布局,一个是线性布局还有一个是相对布局,当然在安卓体系中布局方式也是不止这两种还有包括帧布局、基本不用的绝对布局、网格布局。线性布局和相对布局是使用最为频繁,在百分之九十九的情况下用这两种就可以了,其他布局也一般不会使用,所以我们从最实际的角度出发,只讲这两个布局。
线性布局
最常用属性:android:id(给控件设置id,通过标识找到)、android:layout_width(设置宽度)、android:layout_height(设置高度)、android:background(设置背景,背景可以是颜色、图片、自定义的xml文件)、android:layout_margin(设置外边距)、android:layout_padding(设置内边距)、android:orientation(线性布局以列或行来显示内部子元素),这些属性不仅是LinearLayout常用的包括RelativeLayout、控件都会使用这些属性,除了android:orientation只有在特殊属性中使用。
1、创建一个安卓工程
2、打开activity_main.xml文件,这里使用的是相对布局。(在android->src->res->layout->activity_main.xml)
3、修改为线性布局,将RelativeLayout修改为LinearLayout
4、删除文件中TextView中的内容重新写
5、根布局修改为了线性布局,在里面继续写子元素也是线性布局
<LinearLayout
android:id="@+id/a"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#000000">
</LinearLayout>
标识为a,宽度和高度匹配父控件,垂直摆放,背景颜色为黑色
6、运行程序查看结果先打开AVD(httpd-dev-server->vnc_lite.html->AVD),再build,最后run,在AVD中找到程序Android Example
7、修改高度和宽度为20dp,安卓中的单位为dp
<LinearLayout
android:id="@+id/a"
android:layout_width="20dp"
android:layout_height="20dp"
android:orientation="vertical"
android:background="#000000">
</LinearLayout>
8、运行程序、先将之前的程序在AVD上删除,点击uninstall
10、运行程序,先build再run
11、写一个View,View是所有view的父件,无论是TextView、buttonView等
View的宽度和高度都是匹配父控件的,父控件的宽度和高度为20dp,背景颜色为红色,所以运行的效果是红色挡住黑色
<View android:layout_width="match_parent" android:layout_height="match_parent" android:background="#FF0033"/>
12、运行程序,先删除上一个程序的app,再运行当前程序(uninstall->build->run)
13、设置一个内边距为10dp,父控件的宽度和高度改为200dp
android:padding="10dp"
14、运行效果(uninstall->build->run)
15、再写一个线性布局,水平排列,宽度为父控件的宽度,因为上一个子控件占用了200dp所以这个控件只占用剩下的宽度,高度为200dp,背景颜色为蓝色
<LinearLayout
android:layout_width="match_parent"
android:layout_height="200dp"
android:orientation="horizontal"
android:background="#0066FF">
</LinearLayout>
16、运行效果(uninstall->build->run)
17、在父类控件中加入垂直排列,既然是垂直排列,蓝色的宽度就是整个屏幕了
android:orientation="vertical"
18、运行效果(uninstall->build->run)
19、让各个子控件之间距离10dp,有两个种方法,第一种是在蓝色控件中加入marginTop,距离上个控件
android:layout_marginTop="10dp"
20、运行效果(uninstall->build->run)
21、第二种方法是在黑色的控件中加入marginBottom,距离下个控件10dp
android:layout_marginBottom="10dp"
22、运行效果(uninstall->build->run)
相对布局
除了上节课所讲的线性布局所列出来的宽度、高度、id,相对布局同样也具有,除此之外,我们还要学习一些相对布局所特有的属性,android:layout_toLeftOf(在谁的左边)、android:layout_toRigthOf(在谁的右边)、android:layout_alignBottom(跟谁的底部对齐)、android:layout_alignParentBottom(跟父控件底部对齐)、android:layout_below(在谁的下面)相对布局是参照的概念,我参照你,你参照我的。
1、创建一个安卓工程
2、打开activity_main.xml。(在android->src->res->layout->activity_main.xml)
3、打开安卓模拟器(httpd-dev-server->vnc_lite.html->AVD)
4、先添加一个宽度和高度都为100dp,背景为黑色的正方形
<View
android:id="@+id/a"
android:layout_width="100dp"
android:layout_height="100dp"
android:background="#000000" />
5、运行效果,build->run,黑色正方形默认在左上角
6、使黑色方块在模拟器的左下角,在父控件的底部,默认左侧
android:layout_alignParentBottom="true"
7、运行效果,先删除之前运行的程序,再运行新的程序(uninstall->build->run)
8、使黑色方块在右下方
android:layout_alignParentRight="true"
9、运行效果(uninstall->build->run)
10、添加一个红色的方块在黑色的右侧
<View
android:id="@+id/b"
android:layout_width="100dp"
android:layout_height="100dp"
android:background="#FF0033"
android:layout_toRightOf="@id/a"/>
11、运行效果(uninstall->build->run)
12、使红色的方块在黑色的下面
android:layout_below="@id/a"
13、运行效果(uninstall->build->run)
14、线性布局和相对布局相结合,可以相互嵌套
<LinearLayout
android:id="@+id/c"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="100dp"
android:layout_below="@id/b"
android:background="#0066FF">
</LinearLayout>
15、运行效果(uninstall->build->run)
布局管理器
一个页面上元素会有很多,会有很多的组件摆放在同一个页面上,这些元素的相互之间摆放的位置是如何确定的?他们之间的联系是谁来管理他们的?那么我们就是通过布局管理器来实现的。我们主要讲解两个布局,一个是线性布局还有一个是相对布局,当然在安卓体系中布局方式也是不止这两种还有包括帧布局、基本不用的绝对布局、网格布局。线性布局和相对布局是使用最为频繁,在百分之九十九的情况下用这两种就可以了,其他布局也一般不会使用,所以我们从最实际的角度出发,只讲这两个布局。
线性布局
最常用属性:android:id(给控件设置id,通过标识找到)、android:layout_width(设置宽度)、android:layout_height(设置高度)、android:background(设置背景,背景可以是颜色、图片、自定义的xml文件)、android:layout_margin(设置外边距)、android:layout_padding(设置内边距)、android:orientation(线性布局以列或行来显示内部子元素),这些属性不仅是LinearLayout常用的包括RelativeLayout、控件都会使用这些属性,除了android:orientation只有在特殊属性中使用。
1、创建一个安卓工程
2、打开activity_main.xml文件,这里使用的是相对布局。(在android->src->res->layout->activity_main.xml)
3、修改为线性布局,将RelativeLayout修改为LinearLayout
4、删除文件中TextView中的内容重新写
5、根布局修改为了线性布局,在里面继续写子元素也是线性布局
<LinearLayout
android:id="@+id/a"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#000000">
</LinearLayout>
标识为a,宽度和高度匹配父控件,垂直摆放,背景颜色为黑色
6、运行程序查看结果先打开AVD(httpd-dev-server->vnc_lite.html->AVD),再build,最后run,在AVD中找到程序Android Example
7、修改高度和宽度为20dp,安卓中的单位为dp
<LinearLayout
android:id="@+id/a"
android:layout_width="20dp"
android:layout_height="20dp"
android:orientation="vertical"
android:background="#000000">
</LinearLayout>
8、运行程序、先将之前的程序在AVD上删除,点击uninstall
10、运行程序,先build再run
11、写一个View,View是所有view的父件,无论是TextView、buttonView等
View的宽度和高度都是匹配父控件的,父控件的宽度和高度为20dp,背景颜色为红色,所以运行的效果是红色挡住黑色
<View android:layout_width="match_parent" android:layout_height="match_parent" android:background="#FF0033"/>
12、运行程序,先删除上一个程序的app,再运行当前程序(uninstall->build->run)
13、设置一个内边距为10dp,父控件的宽度和高度改为200dp
android:padding="10dp"
14、运行效果(uninstall->build->run)
15、再写一个线性布局,水平排列,宽度为父控件的宽度,因为上一个子控件占用了200dp所以这个控件只占用剩下的宽度,高度为200dp,背景颜色为蓝色
<LinearLayout
android:layout_width="match_parent"
android:layout_height="200dp"
android:orientation="horizontal"
android:background="#0066FF">
</LinearLayout>
16、运行效果(uninstall->build->run)
17、在父类控件中加入垂直排列,既然是垂直排列,蓝色的宽度就是整个屏幕了
android:orientation="vertical"
18、运行效果(uninstall->build->run)
19、让各个子控件之间距离10dp,有两个种方法,第一种是在蓝色控件中加入marginTop,距离上个控件
android:layout_marginTop="10dp"
20、运行效果(uninstall->build->run)
21、第二种方法是在黑色的控件中加入marginBottom,距离下个控件10dp
android:layout_marginBottom="10dp"
22、运行效果(uninstall->build->run)
相对布局
除了上节课所讲的线性布局所列出来的宽度、高度、id,相对布局同样也具有,除此之外,我们还要学习一些相对布局所特有的属性,android:layout_toLeftOf(在谁的左边)、android:layout_toRigthOf(在谁的右边)、android:layout_alignBottom(跟谁的底部对齐)、android:layout_alignParentBottom(跟父控件底部对齐)、android:layout_below(在谁的下面)相对布局是参照的概念,我参照你,你参照我的。
1、创建一个安卓工程
2、打开activity_main.xml。(在android->src->res->layout->activity_main.xml)
3、打开安卓模拟器(httpd-dev-server->vnc_lite.html->AVD)
4、先添加一个宽度和高度都为100dp,背景为黑色的正方形
<View
android:id="@+id/a"
android:layout_width="100dp"
android:layout_height="100dp"
android:background="#000000" />
5、运行效果,build->run,黑色正方形默认在左上角
6、使黑色方块在模拟器的左下角,在父控件的底部,默认左侧
android:layout_alignParentBottom="true"
7、运行效果,先删除之前运行的程序,再运行新的程序(uninstall->build->run)
8、使黑色方块在右下方
android:layout_alignParentRight="true"
9、运行效果(uninstall->build->run)
10、添加一个红色的方块在黑色的右侧
<View
android:id="@+id/b"
android:layout_width="100dp"
android:layout_height="100dp"
android:background="#FF0033"
android:layout_toRightOf="@id/a"/>
11、运行效果(uninstall->build->run)
12、使红色的方块在黑色的下面
android:layout_below="@id/a"
13、运行效果(uninstall->build->run)
14、线性布局和相对布局相结合,可以相互嵌套
<LinearLayout
android:id="@+id/c"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="100dp"
android:layout_below="@id/b"
android:background="#0066FF">
</LinearLayout>
15、运行效果(uninstall->build->run)
概述
这节课主要讲的是TextView组件,通过几个效果来带大家认识这个组件。第一个是文字大小、颜色这些基本属性的设置;第二个是通常使用一段文本,内容显示不下使用...;第三个是中划线和下划线;最后一个是跑马灯的效果,就是一段文字一直在巡回跑。通过这四个效果,大家常用的属性就都可以掌握了。
演示
1、创建新的android工程
2、打开AVD
http-dev-server->vnc_lite.html->ADV
3、将布局修改为线性布局管理器,添加TextView组件,设置id为tv1,高和宽为内容自身大小,文字为松鼠学苑,字体颜色为蓝色,字体大小为24sp
<TextView
android:id="@+id/tv1"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="松鼠学苑"
android:textColor="#0000FF"
android:textSize="24sp"/>
运行:build->run...run android app
4、添加一个id为TextView的组件,宽度为50dp,高度为自身内容高度,android: maxLines为控制行数,行数为1,android:ellipsize="end"为省略号在结尾
<TextView
android:id="@+id/tv2"
android:layout_height="wrap_content"
android:layout_width="50dp"
android:text="松鼠学苑"
android:maxLines="1"
android:ellipsize="end"
android:textColor="#0000FF"
android:textSize="24sp"/>
运行:注意要先删除上一个工程
uninstall...uninstall and ...->build->run... run android app
5、添加中划线,在activity_main.xml中添加TextView组件,id为3;通过java代码实现锯齿效果,R表错是因为不识别R,编译的时候可以正常运行 activity_main.xml:
<TextView
android:id="@+id/tv3"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="松鼠学苑"
android:textColor="#0000FF"
android:textSize="24sp"/>
HelloAndroidActivity.java:
private TextView mTv3;
mTv3 = (TextView)findViewById(R.id.tv3);
mTv3.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG);
mTv3.getPaint().setAntiAlias(true); //消除锯齿效果
6、添加下划线,在activity_main.xml中添加id为4的TextView组件;在HelloAndroidActivity.java中添加效果 activity_main.xml:
<TextView
android:id="@+id/tv4"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="松鼠学苑"
android:textColor="#0000FF"
android:textSize="24sp"/>
7、跑马灯效果,
<TextView
android:id="@+id/tv5"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="松鼠学苑松鼠学苑松鼠学苑松鼠学苑松鼠学苑松鼠学苑松鼠学苑"
android:textColor="#0000FF"
android:textSize="24sp"
android:singleLine="true" //单行显示
android:ellipsize="marquee" //跑马灯效果
android:marqueeRepeatLimit="marquee_forever" //循环次数
android:focusable="true" //获得焦点
android:focusableInTouchMode="true" />
重点总结
TextView及其子类,当字符内容太长显示不下时可以省略号代替未显示的字符;省略号可以在显示区域的起始,中间,结束位置,或者以跑马灯的方式显示文字(textview的状态为被选中)。
其实现只需在xml中对textview的ellipsize属性做相应的设置即可。
android:ellipsize="start" 省略号在开头
android:ellipsize="middle" 省略号在中间
android:ellipsize="end" 省略号在结尾
android:ellipsize="marquee" 跑马灯显示
概述
Button继承自TextView,它其实是TextView的子类。这节课主要讲Button的基本属性文字大小、颜色;还有一些自定义背景形状。那我们在实际开发中我们设计师设计出的按钮都不是那些直角的,颜色可以就可以的,都会略带一些圆角,这些我们要如何制作一个Button呐?接下来,我们会通过代码带大家一起制作。还有自定义按压效果,在按钮按下去,会有一个按下去的效果,按下去可能颜色会变深了,这个效果可以通过xml文件制作出来,不需要任何的图片。最后一个是给Button设置一个点击事件,既然Button是继承TextView的,所以TextView也有点击事件,基本上所有的控件都包含点击事件。
演示
1、添加Button按钮,使用的是相对布局,按钮的文字为按钮1,id为btn_1,按钮高度为自身内容的高度,按钮的宽度为父类的宽度,文字的大小为20sp,文字颜色为蓝色,按钮的背景颜色为红色,按钮的高度和宽度可以随意设置大小
<Button
android:id="@+id/btn_1"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:text="按钮1"
android:textSize="20sp"
android:textColor="#0066FF"
android:background="#FF0000"/>
2、给按钮添加圆角,在activity_main.xml中添加一个Button组件,id为2,背景可以是xml文件,所以创建一个xml文件,在xml文件设置四个角为圆角,圆角的弧度为5dp,填充颜色为橙色 创建新的xml,在drawable-hdpi点击右键选择new file,命名为bg_btn2.xml activity_main.xml:
<Button
android:id="@+id/btn_2"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:text="按钮2"
android:textSize="20sp"
android:textColor="#0066FF"
android:background="@drawable/bg_btn2"
android:layout_below="@id/btn_1"
android:layout_marginTop="10dp"/>
bg_btn2.xml:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid
android:color="#FF9900"
/>
<corners
android:radius="5dp"
/>
</shape>
3、这个按钮是只有描边,中间是空白的,在activity_main.xml先添加一个Button组件,之后创建bg_btn3.xml文件,在xml文件中设置stroke描边为1dp,描边的颜色为橙色,四个角还是为圆角 activity_main.xml:
<Button
android:id="@+id/btn_3"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:text="按钮3"
android:textSize="20sp"
android:textColor="#0066FF"
android:background="@drawable/bg_btn3"
android:layout_below="@id/btn_2"
android:layout_marginTop="10dp"/>
bg_btn3.xml:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<stroke
android:width="1dp"
android:color="#FF9900">
</stroke>
<corners
android:radius="5dp"
/>
</shape>
4、添加按压效果,在activity_main.xml中添加Button组件,创建bg_btn4.xml,并在bg_btn4.xml中设置按压效果,android:state_pressed="true"是按压时,按压时颜色为橙色,圆角,android:state_pressed="false"是不按压的效果,不按压时颜色为红色,圆角 activity_main.xml:
<Button
android:id="@+id/btn_4"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:text="按钮4"
android:textSize="20sp"
android:textColor="#0066FF"
android:background="@drawable/bg_btn4"
android:layout_below="@id/btn_3"
android:layout_marginTop="10dp"/>
bg_btn4.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<shape>
<solid android:color="#FF9900"/>
<corners android:radius="5dp"/>
</shape>
</item>
<item android:state_pressed="false">
<shape>
<solid android:color="#FF0000"/>
<corners android:radius="5dp"/>
</shape>
</item>
</selector>
5、添加一个点击事件,先在activity_main.xml中添加一个Button组件,点击效果是bg_btn4,添加点击事件,事件方法为showToast,Toast是在界面上弹出的提示信息,过一两秒之后又会消失;在HelloAndroidActivity.java中的HelloAndroidActivity下添加showToast方法,弹出的信息是松鼠学苑,Toast.LENGTH_SHORT为1秒 activity_main.xml:
<Button
android:id="@+id/btn_5"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:text="按钮5"
android:textSize="20sp"
android:textColor="#0066FF"
android:background="@drawable/bg_btn4"
android:onClick="showToast"
android:layout_below="@id/btn_4"
android:layout_marginTop="10dp"/>
HelloAndroidActivity.java:
public void showToast(View view){
Toast.makeText(this, "松鼠学苑", Toast.LENGTH_SHORT).show();
}
6、还有另一种方式完成点击事件,这个方法是比较常用的,在Button4中进行演示,组件Button不用修改,直接通过java代码实现。 HelloAndroidActivity.java:
private Button mBtn3; //声明控件
mBtn3 = (Button)findViewById(R.id.btn_4); //找到控件
mBtn3.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(HelloAndroidActivity.this, "松鼠学苑", Toast.LENGTH_SHORT).show(); //this不在是HelloAndroidActivity了,要改成HelloAndroidActivity.this
}
});
概述
这节课来讲RadioButton,那RadioButton长什么样子呐?通常来讲在一个App中选择性别男和女,这个就是一个Radiobutton来实现的。因为这是在一组中选一个,一组中单选就是用RadioButton,当然要结合RadioGroup结合使用。首先讲一些常用的属性。还有自定义的样式,我们毕竟要根据实际的设计稿来自定义RadioButton样式。最后监听事件,如何监听RadioButton选中事件,我们才能获得当前选中的值。
演示
1、添加一个RadioButton组件,id为1,文字内容为男,橙色,左边的圆圈可以选中
<RadioButton
android:id="@+id/rb_1"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="男"
android:textSize="20sp"
android:textColor="#FF6600"/>
2、做一个男女单选,使用RadioGroup组件,因为RadioGroup可以水平和垂直,这里设置成垂直,因为这两个在一个组中,只能单选
<RadioGroup
android:id="@+id/rg_1"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:orientation="vertical">
<RadioButton
android:id="@+id/rb_1"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="男"
android:textSize="20sp"
android:textColor="#FF6600"/>
<RadioButton
android:id="@+id/rb_2"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="女"
android:textSize="20sp"
android:textColor="#FF6600"/>
</RadioGroup>
3、添加一个开始自动选中效果,自动选中男
android:checked="true"
4、自定义效果,新建radiobutton.xml文件作为背景效果,选中是深色橙色背景,未选中是橙色描边,android:button="@null"为去掉默认的圆圈,android:gravity="center"文字居中,android:state_checked是否选中 activity_main.xml:
<RadioGroup
android:id="@+id/rg_2"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:orientation="vertical"
android:layout_below="@id/rg_1">
<RadioButton
android:id="@+id/rb_3"
android:layout_height="30dp"
android:layout_width="60dp"
android:text="男"
android:button="@null"
android:checked="true"
android:gravity="center"
android:background="@drawable/radiobutton"
android:textSize="20sp"
android:textColor="#000"/>
<RadioButton
android:id="@+id/rb_4"
android:layout_height="30dp"
android:layout_width="60dp"
android:text="女"
android:button="@null"
android:gravity="center"
android:layout_marginTop="5dp"
android:background="@drawable/radiobutton"
android:textSize="20sp"
android:textColor="#000"/>
</RadioGroup>
radiobutton.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="true">
<shape>
<solid android:color="#AA6600"/>
<corners android:radius="5dp"/>
</shape>
</item>
<item android:state_checked="false">
<shape>
<stroke android:color="#FF9900"
android:width="1dp"/>
<corners android:radius="5dp"/>
</shape>
</item>
</selector>
5、添加监听事件,在第一组radiogroup中添加 HelloAndroidActivity.java:
private RadioGroup mrg1;
mrg1 = (RadioGroup)findViewById(R.id.rg_1);
mrg1.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener(){
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
// TODO Auto-generated method stub
RadioButton radiobutton = (RadioButton)group.findViewById(checkedId);
Toast.makeText(HelloAndroidActivity.this,radiobutton.getText(), Toast.LENGTH_SHORT).show();
}
});
概述
这节课开始学习图片控件,再次之前已经讲过Button的控件和TextView,Button还有其他衍生类控件,比如说:ToggleButton、Switch(开关)。这两个就不再这里详细的讲解了,利用之前的学习基础,学习这两个控件是比较简单的,还有就是在实际开发中这两个控件的使用频率比较少,所以大家有兴趣的可以自己研究下。我们会讲下ImageView的常用属性。
演示
1、添加一个ImageView控件,背景颜色为橙色,background可以是颜色和图片,这里使用src添加图片,src可以看作内容,将需要的图片上传到drawable
<ImageView
android:id="@+id/iv_1"
android:layout_height="200dp"
android:layout_width="300dp"
android:background="#FF9900"
android:src="@drawable/src" />
2、让图片铺满,使用scaleType,X轴和Y轴都撑满,但是设置fitXY有可能出现图片拉伸
android:scaleType="fitXY"
3、按照图片的比例放置
<ImageView
android:id="@+id/iv_2"
android:layout_height="100dp"
android:layout_width="200dp"
android:background="#FF9900"
android:src="@drawable/src"
android:scaleType="fitCenter"
android:layout_below="@id/iv_1"
android:layout_marginTop="10dp" />
4、按图片的比例覆盖控件,多余的图片被裁剪到
<ImageView
android:id="@+id/iv_3"
android:layout_height="100dp"
android:layout_width="200dp"
android:background="#FF9900"
android:src="@drawable/src"
android:scaleType="centerCrop"
android:layout_below="@id/iv_2"
android:layout_marginTop="10dp" />
重点
scaleType属性: fitXY:撑满控件,宽高比可能发生改变 fitCenter:保持宽高比缩放,直至能够完全显示 centerCrop:保持宽高比缩放,直至完全覆盖控件,裁剪显示
概述
学习第三章还是UI组件,是UI组件中的弹出组件,把它拎出来单独给大家讲解。首先,来学习Toast,在之前的学习中也用到了Toast,在屏幕的下方出现一个提示信息,在一秒钟或者两秒钟消失。现在就详细的讲解一下Toast的使用方法,Toast是一个消息提示组件;设置显示的位置,之前使用的是默认的位置,当然我们可以自定义设置在屏幕中的哪个位置显示;自定义显示内容,之前是显示了一个文本,这也是我们最为常用的,那假设我们显示一个图片加文本要如何做到,也是我们今天要讲的内容;最后是Toast的一个简单封装,这里的封装只是一个入门级的,希望在以后可以找到更适合自己的封装方法。
演示
1、先将基本框架写好,activity_main.xml使用的是线性布局管理器,先列出三个button组件,分别做默认、改变位置、带图片(自定义)的演示;HelloAndroidActivity.java中先声明,在findViewById找到相对应的Button,使用Switch循环语句,在做演示的时候就可以直接在switch中添加 activity_main.xml:
android:orientation="vertical"
<Button
android:id="@+id/btn_toast_1"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:text="默认"/>
<Button
android:id="@+id/btn_toast_2"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:text="改变位置"/>
<Button
android:id="@+id/btn_toast_3"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:text="带图片(自定义)"/>
HelloAndroidActivity.java:
private Button mbtnToast1;
private Button mbtnToast2;
private Button mbtnToast3;
mbtnToast1 =(Button) findViewById(R.id.btn_toast_1);
mbtnToast2 =(Button) findViewById(R.id.btn_toast_2);
mbtnToast3 =(Button) findViewById(R.id.btn_toast_3);
OnClick OnClick = new OnClick();
mbtnToast1.setOnClickListener(OnClick);
mbtnToast2.setOnClickListener(OnClick);
mbtnToast3.setOnClickListener(OnClick);
class OnClick implements View.OnClickListener{
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch(v.getId())
{
case R.id.btn_toast_1:
break;
case R.id.btn_toast_2:
break;
case R.id.btn_toast_3:
break;
}
}
}
2、默认Toast
Toast.makeText(getApplicationContext(), "默认", Toast.LENGTH_LONG).show();
3、Toast显示的位置居中,makeText的返回值是Toast,定义一个toastCenter,给toastCenter设置setGravity,最后调用show方法 HelloAndroidActivity.java:
Toast toastCenter = Toast.makeText(getApplicationContext(), "Toast居中", Toast.LENGTH_LONG);
toastCenter.setGravity(Gravity.CENTER, 0 ,0);
toastCenter.show();
4、自定义效果带图片, 先将准备好的图片上传到drawable-xxhdpi,创建一个activity_toast.xml自定义效果,分为两部分,图片和文字;在HelloAndroidActivity.java中先定义一个Toast,创建视图,视图通过LayoutInflater,view中有ImageView和TextView,分别找到并设置图片和文字 activity_toast.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="200dp"
android:layout_height="200dp"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
android:background="#99000000" //黑色带透明度的,后六位是颜色,前两位是透明度
android:gravity="center" //居中显示>
<ImageView
android:id="@+id/iv_toast"
android:layout_height="100dp"
android:layout_width="100dp"
android:scaleType="fitCenter"/>
<TextView
android:id="@+id/tv_toast"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp"
android:textColor="#FFFFFF"
android:layout_marginTop="10dp"/>
</LinearLayout>
HelloAndroidActivity.java:
Toast toastCustom = new Toast(getApplicationContext());
LayoutInflater inflater = LayoutInflater.from(HelloAndroidActivity.this);
View view = inflater.inflate(R.layout.activity_toast,null);
ImageView imageView = (ImageView)view.findViewById(R.id.iv_toast);
TextView textView = (TextView)view.findViewById(R.id.tv_toast);
imageView.setImageResource(R.drawable.src);
textView.setText("自定义Toast");
toastCustom.setView(view);
toastCustom.show();
5、如果连续按同一个按钮,Toast显示是连续的排队状态,等第一个显示完了,第二个才开始显示,在实际开发中是需要后一个将前面的抵消掉,不管点多少下,都以最后一下为准,而不是一直在等,那如何来做呐? 首先封装一个简单的类,创建一个until包,在包下创建ToastUntil.java,在添加一个Button组件,运行之后,连续点十几次按钮不会等20几秒的 ToastUntil.java:
package com.kinginsai.template.android.until;
import android.content.Context;
import android.widget.Toast;
public class ToastUntil{
public static Toast mToast;
public static void showMsg(Context context,String msg){
if(mToast == null){
mToast = Toast.makeText(context,msg,Toast.LENGTH_LONG);
}else{
mToast.setText(msg);
}
mToast.show();
}
}
activity_main.xml:
<Button
android:id="@+id/btn_toast_4"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:text="ToastUntil"/>
HelloAndroidActivity.java:
private Button mbtnToast4;
mbtnToast4 =(Button) findViewById(R.id.btn_toast_4);
mbtnToast4.setOnClickListener(OnClick);
case R.id.btn_toast_4:
ToastUntil.showMsg(getApplicationContext(), "包装过的Toast");
break;
概述
学习第三章还是UI组件,是UI组件中的弹出组件,把它拎出来单独给大家讲解。首先,来学习Toast,在之前的学习中也用到了Toast,在屏幕的下方出现一个提示信息,在一秒钟或者两秒钟消失。现在就详细的讲解一下Toast的使用方法,Toast是一个消息提示组件;设置显示的位置,之前使用的是默认的位置,当然我们可以自定义设置在屏幕中的哪个位置显示;自定义显示内容,之前是显示了一个文本,这也是我们最为常用的,那假设我们显示一个图片加文本要如何做到,也是我们今天要讲的内容;最后是Toast的一个简单封装,这里的封装只是一个入门级的,希望在以后可以找到更适合自己的封装方法。
演示
1、先将基本框架写好,activity_main.xml使用的是线性布局管理器,先列出三个button组件,分别做默认、改变位置、带图片(自定义)的演示;HelloAndroidActivity.java中先声明,在findViewById找到相对应的Button,使用Switch循环语句,在做演示的时候就可以直接在switch中添加 activity_main.xml:
android:orientation="vertical"
<Button
android:id="@+id/btn_toast_1"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:text="默认"/>
<Button
android:id="@+id/btn_toast_2"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:text="改变位置"/>
<Button
android:id="@+id/btn_toast_3"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:text="带图片(自定义)"/>
HelloAndroidActivity.java:
private Button mbtnToast1;
private Button mbtnToast2;
private Button mbtnToast3;
mbtnToast1 =(Button) findViewById(R.id.btn_toast_1);
mbtnToast2 =(Button) findViewById(R.id.btn_toast_2);
mbtnToast3 =(Button) findViewById(R.id.btn_toast_3);
OnClick OnClick = new OnClick();
mbtnToast1.setOnClickListener(OnClick);
mbtnToast2.setOnClickListener(OnClick);
mbtnToast3.setOnClickListener(OnClick);
class OnClick implements View.OnClickListener{
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch(v.getId())
{
case R.id.btn_toast_1:
break;
case R.id.btn_toast_2:
break;
case R.id.btn_toast_3:
break;
}
}
}
2、默认Toast
Toast.makeText(getApplicationContext(), "默认", Toast.LENGTH_LONG).show();
3、Toast显示的位置居中,makeText的返回值是Toast,定义一个toastCenter,给toastCenter设置setGravity,最后调用show方法 HelloAndroidActivity.java:
Toast toastCenter = Toast.makeText(getApplicationContext(), "Toast居中", Toast.LENGTH_LONG);
toastCenter.setGravity(Gravity.CENTER, 0 ,0);
toastCenter.show();
4、自定义效果带图片, 先将准备好的图片上传到drawable-xxhdpi,创建一个activity_toast.xml自定义效果,分为两部分,图片和文字;在HelloAndroidActivity.java中先定义一个Toast,创建视图,视图通过LayoutInflater,view中有ImageView和TextView,分别找到并设置图片和文字 activity_toast.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="200dp"
android:layout_height="200dp"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
android:background="#99000000" //黑色带透明度的,后六位是颜色,前两位是透明度
android:gravity="center" //居中显示>
<ImageView
android:id="@+id/iv_toast"
android:layout_height="100dp"
android:layout_width="100dp"
android:scaleType="fitCenter"/>
<TextView
android:id="@+id/tv_toast"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp"
android:textColor="#FFFFFF"
android:layout_marginTop="10dp"/>
</LinearLayout>
HelloAndroidActivity.java:
Toast toastCustom = new Toast(getApplicationContext());
LayoutInflater inflater = LayoutInflater.from(HelloAndroidActivity.this);
View view = inflater.inflate(R.layout.activity_toast,null);
ImageView imageView = (ImageView)view.findViewById(R.id.iv_toast);
TextView textView = (TextView)view.findViewById(R.id.tv_toast);
imageView.setImageResource(R.drawable.src);
textView.setText("自定义Toast");
toastCustom.setView(view);
toastCustom.show();
5、如果连续按同一个按钮,Toast显示是连续的排队状态,等第一个显示完了,第二个才开始显示,在实际开发中是需要后一个将前面的抵消掉,不管点多少下,都以最后一下为准,而不是一直在等,那如何来做呐? 首先封装一个简单的类,创建一个until包,在包下创建ToastUntil.java,在添加一个Button组件,运行之后,连续点十几次按钮不会等20几秒的 ToastUntil.java:
package com.kinginsai.template.android.until;
import android.content.Context;
import android.widget.Toast;
public class ToastUntil{
public static Toast mToast;
public static void showMsg(Context context,String msg){
if(mToast == null){
mToast = Toast.makeText(context,msg,Toast.LENGTH_LONG);
}else{
mToast.setText(msg);
}
mToast.show();
}
}
activity_main.xml:
<Button
android:id="@+id/btn_toast_4"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:text="ToastUntil"/>
HelloAndroidActivity.java:
private Button mbtnToast4;
mbtnToast4 =(Button) findViewById(R.id.btn_toast_4);
mbtnToast4.setOnClickListener(OnClick);
case R.id.btn_toast_4:
ToastUntil.showMsg(getApplicationContext(), "包装过的Toast");
break;
概述
如上图所示,这个就是三种ProgressBar就是进度加载的过程,没有明确目的的就一直在转,有明确目标的是进度条。
如上图所示,这个是ProgressDialog,一个对话框显示正在加载一个圈在转,提示正在加载,这是一种ProgressDialog。
如上图所示,另一种是显示下载进度的,这里面其实进度条,这可是使用在许多场景下,下面还可以设置一些Button。
演示
1、一个默认的ProgressBar
android:orientation="vertical"
<ProgressBar
android:id="@+id/pd1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
2、ProgressBar的style有很多种
<ProgressBar
android:id="@+id/pd2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@android:style/Widget.ProgressBar"
/>
3、转圈是无状态的,不知道加载到什么时候,一直在转;进度条是有明确状态的,总长度是父类控件,style是水平状态,最大值是100,一级进度是10,二级进度30
<ProgressBar
android:id="@+id/pd3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@android:style/Widget.ProgressBar.Horizontal"
android:max="100"
android:progress="10"
android:secondaryProgress="30"
/>
4、之前的样式都是老样式4.0之前的样式,其他属性都是一样的,只是换了一下style,这个style也可以自己定义
<ProgressBar
android:id="@+id/pd4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@android:style/Widget.Material.ProgressBar.Horizontal"
android:max="100"
android:progress="10"
android:secondaryProgress="30"
/>
5、模拟进度条加载,使用pd3,比较明显,加载到30 activity_main.xml:
<ProgressBar
android:id="@+id/pd3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@android:style/Widget.ProgressBar.Horizontal"//android是系统自带的效果
android:max="100"
android:progress="10"
android:secondaryProgress="30"
/>
HelloAndroidActivity.java:
private ProgressBar mpd3;
mpd3 = (ProgressBar)findViewById(R.id.pd3);
mpd3.setProgress(30);//加载到30
6、添加一个按钮,点击这个按钮进度条开始加载到100,在pd3上做修改,将二级进度删除 activity_main.xml:
<ProgressBar
android:id="@+id/pd4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@android:style/Widget.Material.ProgressBar.Horizontal"
android:max="100"
android:progress="10"
/>
<Button
android:id="@+id/btn_start"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:text="模拟进度"/>
HelloAndroidActivity.java:
package com.kinginsai.template.android;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.Toast;
public class HelloAndroidActivity extends Activity {
private ProgressBar mpd3;
private Button mbtnstart;
/**
* Called when the activity is first created.
*
* @param savedInstanceState
* If the activity is being re-initialized after
* previously being shut down then this Bundle contains the data it most
* recently supplied in onSaveInstanceState(Bundle). <b>Note: Otherwise it is null.</b>
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mpd3 = (ProgressBar)findViewById(R.id.pd3);
mbtnstart = (Button)findViewById(R.id.btn_start);
mbtnstart.setOnClickListener(new View.OnClickListener() {//设置点击事件
@Override
public void onClick(View v) {
handler.sendEmptyMessage(0);//发送一个空消息到Handler
}
});
}
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (mpd3.getProgress() < 100) {//ProgressBar当前进度如果小于100
handler.postDelayed(runnable, 500);//小于100的时候发送一个消息,延迟500毫秒发送消息,发送之后就执行runnable
} else {
Toast.makeText(HelloAndroidActivity.this,"加载完成", Toast.LENGTH_LONG).show();//其他就弹出Toast,显示加载完成
}
}
};
Runnable runnable = new Runnable() {
@Override
public void run() {
mpd3.setProgress(mpd3.getProgress()+5);//Progress加5
handler.sendEmptyMessage(0);//送空消息回去到Handler
}
};
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(com.kinginsai.template.android.R.menu.main, menu);
return true;
}
}
7、自定义转圈效果,先将图片上传到drawable-xxhdpi,使图片转起来,实现这个的方法有很多种,我们只将下如何使用ProgressBar使图片转起来,先在drawable创建一个bg_progressbar.xml存放效果,通过indeterminateDrawable属性完成
activity_main.xml:
<ProgressBar
android:id="@+id/pd5"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@android:style/Widget.ProgressBar"
android:indeterminateDrawable="@drawable/bg_progressbar"
/>
bg_progressbar.xml:
<?xml version="1.0" encoding="utf-8"?>
<animated-rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/progressbar"
android:pivotX="50%"//在x轴的50%为中心点转
android:pivotY="50%"//在y轴的50%为中心点转
>
</animated-rotate>
8、也可以不通过indeterminateDrawable属性,通过style完成,不止ProgressBar组件可以通过style修改自定义效果,其他组件在自定义效果的时候也可以,打开style.xml
activity_main.xml:
<ProgressBar
android:id="@+id/pd5"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/MyProgressBar"
/>
style.xml:
<style name="MyProgressBar">
<item name="android:indeterminateDrawable">@drawable/bg_progressbar</item>
</style>
9、演示progressdialog,添加一个按钮组件,点击按钮之后触发progressdialog,添加一个人为中断progressdialog事件,显示cancel activity_main.xml:
<Button
android:id="@+id/btn_progress_dialog1"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:text="ProgressDialog1"
android:textAllCaps="false"/>
HelloAndroidActivity.java:
private Button mbtnpd1;
mbtnpd1 = (Button)findViewById(R.id.btn_progress_dialog1);
mbtnpd1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
ProgressDialog progressdialog = new ProgressDialog(HelloAndroidActivity.this);
progressdialog.setTitle("提示");
progressdialog.setMessage("正在加载");
progressdialog.setOnCancelListener(new DialogInterface.OnCancelListener(){//人为返回事件监听
@Override
public void onCancel(DialogInterface dialog) {
// TODO Auto-generated method stub
Toast.makeText(HelloAndroidActivity.this, "cancel...", Toast.LENGTH_LONG).show();
}
});
progressdialog.show();
}
});
10、之前是点击其他区域是可以隐藏或者取消progressdialog,添加setCancelable属性就禁止返回,必须等待加载完成之后才可以继续操作
progressdialog.setCancelable(false);
11、演示进度条类型的progressdialog,添加一个button按钮,使用setProgressStyle属性更改为进度条形式,默认max为100,可以自定义设置 activity_main.xml:
<Button
android:id="@+id/btn_progress_dialog2"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:text="ProgressDialog2"
android:textAllCaps="false"/>
HelloAndroidActivity.java:
private Button mbtnpd2;
mbtnpd2.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
ProgressDialog progressdialog = new ProgressDialog(HelloAndroidActivity.this);
progressdialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressdialog.setTitle("提示");
progressdialog.setMessage("正在下载...");
progressdialog.show();
}
});
不可不会的Activity和Fragment
Activity之前已经接触过了,可以简单的理解为当我们在APP上看到的每一个界面,这每一个界面都需要一个Activity,而Activity并不是界面,只能说一个界面需要一个Activity。Fragment是碎片化的界面,一个Activity可以包含有多个Fragment,Fragment是不能独立存在的,必须依赖Activity受Activity管理的。
Activity的创建三部曲
- 1、新建类继承Activity或其子类
- 2、新创建的Activity在AndroidManifest中声明,不声明是无法使用的,也无法跳转到新建的Activity
- 3、创建layout并在Activity的onCreate中设置 并非所有的创建一定要按照以上三个步骤操作,如果只有第一步也行,第一步Activity就已经存在了,但是这个Activity存在的意义就没有,既不能跳转过去,也不能跳过新建Activity。所以第二步也要存在,第三步可以跳过,不给新建的Activity设置布局,通常情况下是需要设置布局的,也有不设置布局的,可以把新建的Activity作为父类等等。
演示
1、新建Activity,在src/main/java/com/kinginsai/template/android目录下新建TextActivity
2、在AndroidManifest.xml中声明
<activity android:name="com.kinginsai.template.android.TextActivity"/>
3、新建layout布局,在res/layout目录下,命名为activity_text.xml,添加一个TextView组件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="松鼠学苑" />
</RelativeLayout>
4、在Activity中设置布局
package com.kinginsai.template.android;
import android.app.Activity;
import android.os.Bundle;
public class TextActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_text);
}
}
5、在activity_main.xml中添加一个button组件,点击按钮之后跳转
<Button
android:id="@+id/btn"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:text="button" />
6、在主Activity中添加跳转
private Button mbtn;
mbtn = (Button)findViewById(R.id.btn);
mbtn.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//跳转到TextView演示界面
Intent intent = new Intent(HelloAndroidActivity.this,TextActivity.class);
startActivity(intent);
}
});
7、运行程序
8、程序的上方Android Example是导航栏,要修改在AndroidManifest中添加label属性
不可不会的Activity和Fragment
Activity之前已经接触过了,可以简单的理解为当我们在APP上看到的每一个界面,这每一个界面都需要一个Activity,而Activity并不是界面,只能说一个界面需要一个Activity。Fragment是碎片化的界面,一个Activity可以包含有多个Fragment,Fragment是不能独立存在的,必须依赖Activity受Activity管理的。
Activity的创建三部曲
- 1、新建类继承Activity或其子类
- 2、新创建的Activity在AndroidManifest中声明,不声明是无法使用的,也无法跳转到新建的Activity
- 3、创建layout并在Activity的onCreate中设置 并非所有的创建一定要按照以上三个步骤操作,如果只有第一步也行,第一步Activity就已经存在了,但是这个Activity存在的意义就没有,既不能跳转过去,也不能跳过新建Activity。所以第二步也要存在,第三步可以跳过,不给新建的Activity设置布局,通常情况下是需要设置布局的,也有不设置布局的,可以把新建的Activity作为父类等等。
演示
1、新建Activity,在src/main/java/com/kinginsai/template/android目录下新建TextActivity
2、在AndroidManifest.xml中声明
<activity android:name="com.kinginsai.template.android.TextActivity"/>
3、新建layout布局,在res/layout目录下,命名为activity_text.xml,添加一个TextView组件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="松鼠学苑" />
</RelativeLayout>
4、在Activity中设置布局
package com.kinginsai.template.android;
import android.app.Activity;
import android.os.Bundle;
public class TextActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_text);
}
}
5、在activity_main.xml中添加一个button组件,点击按钮之后跳转
<Button
android:id="@+id/btn"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:text="button" />
6、在主Activity中添加跳转
private Button mbtn;
mbtn = (Button)findViewById(R.id.btn);
mbtn.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//跳转到TextView演示界面
Intent intent = new Intent(HelloAndroidActivity.this,TextActivity.class);
startActivity(intent);
}
});
7、运行程序
8、程序的上方Android Example是导航栏,要修改在AndroidManifest中添加label属性
概述
1.生命周期中各个方法的含义和作用
- (1)onCreate:create表示创建,这是Activity生命周期的第一个方法,也是我们在android开发中接触的最多的生命周期方法。它本身的作用是进行Activity的一些初始化工作,比如使用setContentView加载布局,对一些控件和变量进行初始化等。但也有很多人将很多与初始化无关的代码放在这,其实这是不规范的。此时Activity还在后台,不可见。所以动画不应该在这里初始化,因为看不到……
- (2)onStart:start表示启动,这是Activity生命周期的第二个方法。此时Activity已经可见了,但是还没出现在前台,我们还看不到,无法与Activity交互。其实将Activity的初始化工作放在这也没有什么问题,放在onCreate中是由于官方推荐的以及我们开发的习惯。
- (3)onResume:resume表示继续、重新开始,这名字和它的职责也相同。此时Activity经过前两个阶段的初始化已经蓄势待发。Activity在这个阶段已经出现在前台并且可见了。这个阶段可以打开独占设备
- (4)onPause:pause表示暂停,当Activity要跳到另一个Activity或应用正常退出时都会执行这个方法。此时Activity在前台并可见,我们可以进行一些轻量级的存储数据和去初始化的工作,不能太耗时,因为在跳转Activity时只有当一个Activity执行完了onPause方法后另一个Activity才会启动,而且android中指定如果onPause在500ms即0.5秒内没有执行完毕的话就会强制关闭Activity。从生命周期图中发现可以在这快速重启,但这种情况其实很罕见,比如用户切到下一个Activity的途中按back键快速得切回来。
- (5)onStop:stop表示停止,此时Activity已经不可见了,但是Activity对象还在内存中,没有被销毁。这个阶段的主要工作也是做一些资源的回收工作。
- (6)onDestroy:destroy表示毁灭,这个阶段Activity被销毁,不可见,我们可以将还没释放的资源释放,以及进行一些回收工作。
- (7)onRestart:restart表示重新开始,Activity在这时可见,当用户按Home键切换到桌面后又切回来或者从后一个Activity切回前一个Activity就会触发这个方法。这里一般不做什么操作。
通过上面的了解我们发现其实Activity中的方法大都是两两对应的,只有onRestart方法散发着单身狗的清香。 那么相邻的方法之间有什么区别呢?
2.onCreate和onStart之间有什么区别?
- (1)可见与不可见的区别。前者不可见,后者可见。
- (2)执行次数的区别。onCreate方法只在Activity创建时执行一次,而onStart方法在Activity的切换以及按Home键返回桌面再切回应用的过程中被多次调用。因此Bundle数据的恢复在onStart中进行比onCreate中执行更合适。
- (3)onCreate能做的事onStart其实都能做,但是onstart能做的事onCreate却未必适合做。如前文所说的,setContentView和资源初始化在两者都能做,然而想动画的初始化在onStart中做比较好。
3.onStart方法和onResume方法有什么区别?
- (1)是否在前台。onStart方法中Activity可见但不在前台,不可交互,而在onResume中在前台。
- (2)职责不同,onStart方法中主要还是进行初始化工作,而onResume方法,根据官方的建议,可以做开启动画和独占设备的操作。
4.onPause方法和onStop方法有什么区别?
- (1)是否可见。onPause时Activity可见,onStop时Activity不可见,但Activity对象还在内存中。
- (2)在系统内存不足的时候可能不会执行onStop方法,因此程序状态的保存、独占设备和动画的关闭、以及一些数据的保存最好在onPause中进行,但要注意不能太耗时。
5.onStop方法和onDestroy方法有什么区别?
onStop阶段Activity还没有被销毁,对象还在内存中,此时可以通过切换Activity再次回到该Activity,而onDestroy阶段Acivity被销毁
6.为什么切换Activity时各方法的执行次序是onPause→onCreate→onStart→onResume→onStop而不是onPause→onStop→onCreate→onStart→onResume
- (1)一个Activity或多或少会占有系统资源,而在官方的建议中,onPause方法将会释放掉很多系统资源,为切换Activity提供流畅性的保障,而不需要再等多两个阶段,这样做切换更快。
- (2)按照生命周期图的表示,如果用户在切换Activity的过程中再次切回原Activity,是在onPause方法后直接调用onResume方法的,这样比onPause→onStop→onRestart→onStart→onResume要快得多。
7.与生命周期密切相关的onSaveInstanceState方法和onRestoreInstanceState方法在什么时候执行?
通过阅读源码会发现,当targetSdkVersion小于3时onSaveInstanceState是在onPause方法中调用的,而大于3时是在onStop方法中调用的。 而onRestoreInstanceState是在onStart之后、onResume之前调用的。
Activity的几种跳转:
一:显式调用方法
方法一:
Intent intent=new Intent(本类,将要跳转的类);
startActivity(intent);
方法二:
Intent intent2=new Intent();
intent2.setClass(本类,另外将要跳转的类); (intent2.setClass(MainActivity.this,shoyeActivity.class);)
startActivity(intent2);
方法三:(此方式可用于打开其它的应用)
Intent intent2=new Intent();
intent2.setClassName(this,“将要跳转界面的名字”);
startActivity(intent2);
方法四:
Intent intent2=new Intent();
intent2.setComponent(new ComponentName(MainActivity.this, OtherActivity.class));
startActivity(intent2);
二:隐式调用方法(只要action、category、data和将要跳转到的Activity在AndroidManifest.xml中设置的匹配就OK)
<activity
android:name="com.saiermeng.intent.SecondActivity"
android:label="@string/title_activity_second" >
<intent-filter >
<action android:name="com.saiermeng.intent.open02"/>
//在data中设置了哪些,则哪些必须匹配,没设置的可以任意写
<data android:scheme="http"
android:host="www.saiermeng.com"
android:port="8080"
android:path="/java"
></data>
//因为startActivity()方法中内置了该类别,索引必须加上此类别,否则android.intent.category.DEFAULT无法跳转
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
三:跳转到另一个Activity后,当返回时能返回数据
-
1.在跳转的Activity端,调用startActivityForResult(intent2, 2),跳转到下一个Activity,其中第一个参数为传入的意图对象,第二个为设置的请求码;
-
2.跳转到第二个Activity后,调用setResult(10, intent)方法可返回上一个Activity,其中第一个参数为结果码,第二个为传入的意图对象;
-
3.在第一个Activity通过onActivityResult()方法获得返回的数据。
Activity之间的数据传递
1、向目标Activity传递数据:
Intent intent=new Intent(this,Main2Activity.class);
//可传递多种类型的数据
intent.putExtra("name","张三");
intent.putExtra("age",12);
startActivity(intent);
2、在目标Activity中取出数据
Intent intent=getIntent();
//用getXxxExtra()取出对应类型的数据。取出String只需要指定key
String name=intent.getStringExtra("name");
//取出int要指定key,还要设置默认值,当intent中没有该key对应的value时,返回设置的默认值
int age=intent.getIntExtra("age",0);
学苑网课中心
松鼠学苑发展历程
主营业务
She教研解决方案
1、远端浏览器,从Google、GitHub、Maven等获取技术资源不再有羁绊。
2、基于Devfile的、一键式、无差别构建,基于账号的隔离独享环境,基于浏览器的全新开发模式,让你和你的 小伙伴的软件工程环境精准的一致,而且能随心所欲的创建一个新的属于你的环境。
3、全系列、分步骤镜像,让你的大数据能够从任一成功阶段继续,从裸Linux到Zookeeper、Hadoop、Tez、 Hive、Spark、Oozie、HBase,到Kafka、Flink、Ambari,All in One的Jupyter,最新版本的TensorFlow, 使用你擅长的任一语言,Python、Java、Scala、R、Julia。
4、无需任何配置,只要bind任一端口,你的应用便自动地expose出去,自动配置域名。
She平台架构
She是构建在docker/k8s之上、用于软件开发调试的大数据平台,平 台本身是架构在大数据集群之上的分布式系统,包括三层:计算资源管 理层、She核心调度层、应用层,应用层集合了所有课程环境,Devfile 和Workspace是其中两个核心概念:
1.Devfile是开展某项软件类开发任务所需环境的定义,那么将这个草稿 建设起来的就是Workspace,即Workspace是物理的、而Devfile是逻辑 的、是静态的:Workspace包括了物理上运行的各容器或物理机实体、端 口、命名等一干看得见摸得着的资源,所以Devfile定义了某个实训任务 的资源需求情况,如CPU、GPU、Memory、Disk等,而运行中的Work space的则实际占有了这些资源,因此,从这个意义上看,具体的实训 任务决定了She平台的硬件配置需求。
2.Devfile是She平台的预置环境,即其对应的Workspace中已经安装了 一系列版本号确定的工具,这些工具集的选择是根据这项开发任务的通 用需求而定的,是通用的;但是我们可以根据需要卸载、升级、安装相 应工具。
HFS三节点集群拓扑结构
为了降低实训成本,我们以三节点为例搭建HFS集群,但这个集群理论上可以水平扩展到10万点的规模。