安卓应用采用View组件进行界面布局,可以通过两种方式进行布局,分别是XML文件和Java代码。

其中采用XML文件进行布局是较好的方式,因为这样可以将XML文件和Java代码分开编写,使得项目结构变得更加清晰。

  • 简单的图片浏览器

下面是一个XML文件和Java代码混用的案例,编写一个简单的图片浏览器。

首先编写一个LinearLayout的布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"tools:context=".MainActivity"android:id="@+id/root"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"></LinearLayout>

布局文件的内容非常简单,其中比较重要的是id属性,我们在java代码里面需要通过id来获取这个线性布局容器。

接着,我们定义一个MainActivity类,并且给线性布局容器添加一个ImageView容器来显示图片,ImageView容器也是可以添加按钮监控的,在重载的onClick()方法中,我们需要编写替换下一张图片的代码。

public class MainActivity extends Activity {// 定义一个访问图片的数组int[] images = new int[]{R.drawable.ic_launcher_background, R.drawable.ic_launcher_foreground};int currentImage = 0;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 加载布局文件setContentView(R.layout.main);// 获取线性布局容器LinearLayout linearLayout = (LinearLayout) findViewById(R.id.root);// 创建ImageView组件ImageView imageView = new ImageView(this);// 将ImageView组件添加到线性布局容器中linearLayout.addView(imageView);// 初始化时显示第一张图片imageView.setImageResource(images[0]);// 给ImageView添加按键监控imageView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 替换为下一张图片imageView.setImageResource(images[++currentImage % images.length]);}});}
}

最后获得的效果就是,界面正上方有一个显示图片的区域,当我们点击该图片的时候,显示的图片就会改变。

在安卓应用中,View组件只是一个空白的矩形区域,没有任何内容,对于android的其他UI组件来说,他们都继承了View组件,然后在View组件提供的空白区域上绘制外观。当andorid提供的UI组件不能满足我们的需求的时候,我们也可以通过继承View来自定义组件。

  • 跟随手指的小球

我们首先需要创建一个DrawView容器,然后重写onDraw()方法和onTouchEvent()方法,前者用于绘制小球,后者用于获取当前触碰的坐标,用于更新小球位置。

public class DrawView extends View {// 定义初始坐标public float currentX = 50;public float currentY = 50;// 定义并创建画笔Paint paint = new Paint();public DrawView(Context context) {super(context);}// 重载onDraw()方法,当组件将要绘制他的内容时回调该方法进行绘制@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);// 设置画笔颜色paint.setColor(Color.RED);// 绘制小球canvas.drawCircle(currentX, currentY, 15, paint);}// 为该组件的触碰事件重写事件处理方法@Overridepublic boolean onTouchEvent(MotionEvent event) {super.onTouchEvent(event);// 获取当前坐标currentX = event.getX();currentY = event.getY();// 通知当前组件重绘自己invalidate();// 返回true表明该处理方法已经处理该事件return true;}
}

接着在LinearLayout容器中添加DrawView容器即可

public class CustomViewActivity extends Activity {@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);// 获取线性布局容器LinearLayout linearLayout = findViewById(R.id.root);// 创建DrawView组件DrawView drawView = new DrawView(this);// 设置自定义组件的最小宽度和高度drawView.setMinimumWidth(300);drawView.setMinimumHeight(500);linearLayout.addView(drawView);}
}

运行程序可以发现小球会根据触碰的坐标更新位置。

安卓SDK提供了很多布局管理器,他们都是ViewGroup的子类。

  • 计算器界面

使用GridLayout可以编写一个计算器界面

首先编写布局XML文件,布局文件中包含文本框和按钮部分

<?xml version="1.0" encoding="utf-8"?>
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:rowCount="6"android:columnCount="4"android:id="@+id/calculator"><!-- 定义一个横跨4列的文本框 --><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_columnSpan="4"android:textSize="50sp"android:layout_marginLeft="2pt"android:layout_marginRight="2pt"android:padding="3pt"android:layout_gravity="right"android:background="#eee"android:textColor="#000"android:text="0" /><!-- 定义一个横跨4列的按钮 --><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_columnSpan="4"android:text="清除"/></GridLayout>

接着在Java代码中加载GridLayout布局,并且添加按钮控件

public class CalculatorActivity extends Activity {GridLayout gridLayout;// 定义16个按钮的文本String[] chars = new String[] {"7", "8", "9", "÷","4", "5", "6", "×","1", "2", "3", "﹣",".", "0", "=", "﹢"};@SuppressLint("MissingInflatedId")@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.calculator);gridLayout = (GridLayout) findViewById(R.id.calculator);// 加载16个按钮for(int i=0; i<chars.length; i++){Button bn = new Button(this);bn.setText(chars[i]);// 设置按钮的字号大小bn.setTextSize(40);// 设置按钮四周的空白区域bn.setPadding(5, 35, 5, 35);// 指定该组件所在的行GridLayout.Spec rowSpec = GridLayout.spec(i/4 + 2);// 指定该组件所在的列GridLayout.Spec colSpec = GridLayout.spec(i % 4);GridLayout.LayoutParams params = new GridLayout.LayoutParams(rowSpec, colSpec);// 指定该组件占满父容器params.setGravity(Gravity.FILL);gridLayout.addView(bn, params);}}
}

运行后就呈现出一个占满整个屏幕的计算器界面。

【安卓学习笔记】界面编程入门相关推荐

  1. 安卓学习笔记3——登录界面UI

    安卓学习笔记3--登录界面UI 一.登录界面UI 1.根据需求写UI 2.主活动 3.主活动调用的读写文件的工具类 4.效果展示 二.总结与改进 不足: 1.密码分割采用字符串:当密码和用户名包含该字 ...

  2. 2020年安卓学习笔记目录

    文章目录 一.讲课笔记 二.安卓案例 三.安卓实训项目 四.学生安卓学习博客 五.安卓课后作业 (一)界面设计练习 1.制作登录界面 2.制作部队管理界面 3.制作灭火救援界面 4.制作交付界面 5. ...

  3. Hadoop学习笔记(1) ——菜鸟入门

     Hadoop学习笔记(1) --菜鸟入门 Hadoop是什么?先问一下百度吧: [百度百科]一个分布式系统基础架构,由Apache基金会所开发.用户能够在不了解分布式底层细节的情况下.开发分布式 ...

  4. 安卓学习笔记07:事件处理、窗口跳转与传递数据

    文章目录 零.学习目标 一.三个基本控件 1.标签控件(TextView) 2.编辑框控件(EditText) 3.按钮控件(Button) 二.安卓事件处理机制 (一)安卓事件处理概述 (二)安卓事 ...

  5. 逐梦旅程学习笔记 DirectX开发入门02:旋转的彩色立方体

    本文是 系列笔记DirectX部分的第2篇,上一篇参见 逐梦旅程学习笔记 DirectX开发入门01:应用程序基本框架 这个示例增加了一些实际的内容,首先是绘制一个颜色随机变幻的彩色立方体,其二是显示 ...

  6. 学习笔记之编程达到一个高的境界就是自制脚本语言(图)

    学习笔记之编程达到一个高的境界就是自制脚本语言(图) 编程达到一个高的境界就是自制脚本语言,通过这可以精通编程里面的高深的技术,如编译原理.语言处理器.编译器与解释器,这些都是代表一个程序员实力的技术 ...

  7. 【学习笔记】Mininet 入门

    [学习笔记]Mininet入门实战 课程介绍 Mininet是由一些虚拟的终端节点.交换机.路由器连接而成的一个网络仿真器,它采用轻量级的虚拟化技术使得系统可以和真实网络相媲美. Mininet可以很 ...

  8. python可视化窗口编程-Python可视化界面编程入门

    Python可视化界面编程入门具体实现代码如所示: (1)普通可视化界面编程代码入门: import sys from PyQt5.QtWidgets import QWidget,QApplicat ...

  9. ufldl学习笔记与编程作业:Multi-Layer Neural Network(多层神经网络+识别手写体编程)...

    ufldl学习笔记与编程作业:Multi-Layer Neural Network(多层神经网络+识别手写体编程) ufldl出了新教程,感觉比之前的好,从基础讲起,系统清晰,又有编程实践. 在dee ...

  10. Qt图形界面编程入门(4)

    构造函数和析构函数 构造函数是一个与类同名的特殊的公有成员函数. 创建类对象时构造函数会被调用,且只调用一次/ 构造函数无返回类型. ·  默认构造函数格式: 类名(){.......} Accoun ...

最新文章

  1. python标准函数有哪些_python基本语法有哪些?
  2. arm 饱和指令_ARM平台下NEON使用方法详解
  3. java stream 取某个字段_java8的函数式编程和stream使用心得
  4. Python json pickle模块
  5. matlab 代码开头,诸位大神请帮我讲解一下每个程序开头这些行的意思
  6. 组件间数据交互||父组件向子组件传值-基本使用|| 父组件向子组件传值-props属性名规则
  7. python multiprocessing — 基于进程的并行
  8. ASP.NET AJAX(服务器回调)
  9. c语言 函数的参数传递示例_C语言中带有示例的remove()函数
  10. java流数据base64,Base64数据的流解码
  11. 工作7年开发小哥转行测试:只有努力向前奔跑,才能得到你要的~
  12. linux下载并安装JDK流程
  13. 数独程序求解世界最难数独——JAVA版
  14. 一文看懂常见域名后缀的含义
  15. 服务器虚拟主机推荐,免费的虚拟主机推荐
  16. 2019大学生电子设计竞赛
  17. IRP IO_STACK_LOCATION 《寒江独钓》内核学习笔记(1)
  18. 如何快速合并PDF文件?几个方法教你合并PDF
  19. 2017ICPCECIC MJF wants to work
  20. pyinstaller安装配置--别踩这些keng

热门文章

  1. zipJS 前端压缩使用
  2. 使用NanoHttpd在Android上实现HttpServer
  3. gnuplot 等高线脚本
  4. 最全的Android单元测试教程
  5. SAP ABAP ASSIGNED 用法
  6. Android存入mysql数据库中文乱码解决方法的超级坑
  7. [附源码]Python计算机毕业设计大学生社团管理系统
  8. Quorum?Quorum!
  9. JS中“创建对象”及“通过原型创建对象”浅析
  10. 河南专升本公共英语语法考点分析---非谓语动词