【安卓学习笔记】界面编程入门
安卓应用采用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);}}
}
运行后就呈现出一个占满整个屏幕的计算器界面。
【安卓学习笔记】界面编程入门相关推荐
- 安卓学习笔记3——登录界面UI
安卓学习笔记3--登录界面UI 一.登录界面UI 1.根据需求写UI 2.主活动 3.主活动调用的读写文件的工具类 4.效果展示 二.总结与改进 不足: 1.密码分割采用字符串:当密码和用户名包含该字 ...
- 2020年安卓学习笔记目录
文章目录 一.讲课笔记 二.安卓案例 三.安卓实训项目 四.学生安卓学习博客 五.安卓课后作业 (一)界面设计练习 1.制作登录界面 2.制作部队管理界面 3.制作灭火救援界面 4.制作交付界面 5. ...
- Hadoop学习笔记(1) ——菜鸟入门
Hadoop学习笔记(1) --菜鸟入门 Hadoop是什么?先问一下百度吧: [百度百科]一个分布式系统基础架构,由Apache基金会所开发.用户能够在不了解分布式底层细节的情况下.开发分布式 ...
- 安卓学习笔记07:事件处理、窗口跳转与传递数据
文章目录 零.学习目标 一.三个基本控件 1.标签控件(TextView) 2.编辑框控件(EditText) 3.按钮控件(Button) 二.安卓事件处理机制 (一)安卓事件处理概述 (二)安卓事 ...
- 逐梦旅程学习笔记 DirectX开发入门02:旋转的彩色立方体
本文是 系列笔记DirectX部分的第2篇,上一篇参见 逐梦旅程学习笔记 DirectX开发入门01:应用程序基本框架 这个示例增加了一些实际的内容,首先是绘制一个颜色随机变幻的彩色立方体,其二是显示 ...
- 学习笔记之编程达到一个高的境界就是自制脚本语言(图)
学习笔记之编程达到一个高的境界就是自制脚本语言(图) 编程达到一个高的境界就是自制脚本语言,通过这可以精通编程里面的高深的技术,如编译原理.语言处理器.编译器与解释器,这些都是代表一个程序员实力的技术 ...
- 【学习笔记】Mininet 入门
[学习笔记]Mininet入门实战 课程介绍 Mininet是由一些虚拟的终端节点.交换机.路由器连接而成的一个网络仿真器,它采用轻量级的虚拟化技术使得系统可以和真实网络相媲美. Mininet可以很 ...
- python可视化窗口编程-Python可视化界面编程入门
Python可视化界面编程入门具体实现代码如所示: (1)普通可视化界面编程代码入门: import sys from PyQt5.QtWidgets import QWidget,QApplicat ...
- ufldl学习笔记与编程作业:Multi-Layer Neural Network(多层神经网络+识别手写体编程)...
ufldl学习笔记与编程作业:Multi-Layer Neural Network(多层神经网络+识别手写体编程) ufldl出了新教程,感觉比之前的好,从基础讲起,系统清晰,又有编程实践. 在dee ...
- Qt图形界面编程入门(4)
构造函数和析构函数 构造函数是一个与类同名的特殊的公有成员函数. 创建类对象时构造函数会被调用,且只调用一次/ 构造函数无返回类型. · 默认构造函数格式: 类名(){.......} Accoun ...
最新文章
- python标准函数有哪些_python基本语法有哪些?
- arm 饱和指令_ARM平台下NEON使用方法详解
- java stream 取某个字段_java8的函数式编程和stream使用心得
- Python json pickle模块
- matlab 代码开头,诸位大神请帮我讲解一下每个程序开头这些行的意思
- 组件间数据交互||父组件向子组件传值-基本使用|| 父组件向子组件传值-props属性名规则
- python multiprocessing — 基于进程的并行
- ASP.NET AJAX(服务器回调)
- c语言 函数的参数传递示例_C语言中带有示例的remove()函数
- java流数据base64,Base64数据的流解码
- 工作7年开发小哥转行测试:只有努力向前奔跑,才能得到你要的~
- linux下载并安装JDK流程
- 数独程序求解世界最难数独——JAVA版
- 一文看懂常见域名后缀的含义
- 服务器虚拟主机推荐,免费的虚拟主机推荐
- 2019大学生电子设计竞赛
- IRP IO_STACK_LOCATION 《寒江独钓》内核学习笔记(1)
- 如何快速合并PDF文件?几个方法教你合并PDF
- 2017ICPCECIC MJF wants to work
- pyinstaller安装配置--别踩这些keng