【安卓学习笔记】界面编程入门

news2025/1/14 18:05:03

安卓应用采用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;

    @Override
    protected 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() {
            @Override
            public 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()方法,当组件将要绘制他的内容时回调该方法进行绘制
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        // 设置画笔颜色
        paint.setColor(Color.RED);
        // 绘制小球
        canvas.drawCircle(currentX, currentY, 15, paint);
    }

    // 为该组件的触碰事件重写事件处理方法

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        super.onTouchEvent(event);
        // 获取当前坐标
        currentX = event.getX();
        currentY = event.getY();
        // 通知当前组件重绘自己
        invalidate();
        // 返回true表明该处理方法已经处理该事件
        return true;
    }
}

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

public class CustomViewActivity extends Activity {

    @Override
    protected 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列的文本框 -->
    <TextView
        android: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列的按钮 -->
    <Button
        android: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")
    @Override
    protected 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);
        }


    }
}

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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/156283.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

git仓库清理瘦身解决 .git文件夹过大的问题

git仓库清理找了很多资料和方案都没有很完美执行成功的&#xff1b;现在找到一个完美方案&#xff0c;分享给大家&#xff1b;希望能帮助大家 问题 1、gitlab代码开发了仓库开发了五年了&#xff0c;代码只有10M&#xff1b;clone的时候要700多兆很浪费时间 2、创建分支和切换…

Java泛型通配符的使用

目录 泛型在继承方面的体现 类A是类B的父类&#xff0c;G和G二者不具有子父类关系&#xff0c;二者是并列关系 类A是类B的父类&#xff0c;A是B的父类 通配符的使用 类A是类B的父类&#xff0c;G和G是没有关系的&#xff0c;二者共同父类是:G 使用通配符后&#xff0c;数…

Linux学习记录——칠 git、gdb部分基础知识以及进度条小程序

文章目录一、/r/n二、简单理解缓冲区概念三、进度条四、了解git五、初步学会使用gdb1、背景知识2、部分简单指令一、/r/n 在写小程序之前&#xff0c;我们先看一下/r和/n的区别。 /n我们遇到过&#xff0c;它叫做换行符。/r并不知道是什么符号。实际应用中&#xff0c;/n可以起…

鲍春健:从“走进客户”奔向“成为客户”

站在当下来看&#xff0c;小鹅通的服务力的特殊性在于其可以穿透三层&#xff0c;即以自身的服务力赋能客户的服务力。其中&#xff0c;一层是客户&#xff1b;一层是客户的服务&#xff1b;一层是客户的客户。 作者|斗斗 出品|产业家 累计终端用户数达8.2亿、最高日活14…

mysql系列之索引(待续)

目录一、索引简述1、什么叫索引2、索引的优缺点3、索引的使用场景二、索引的算法1、线性查找 Linear Search2、二分查找 Binary Search3、二叉查找树 Binary Search Tree4、平衡二叉树 AVL Tree5、B树6、B树三、B树和B树的理解1、B树和B树的区别2、数据库为什么使用B树而不是B树…

第二章.线性回归以及非线性回归—一元线性回归,代价函数,相关系数,决定系数

第二章.线性回归以及非线性回归 2.1 一元线性回归 1.概念&#xff1a; 1).自变量&#xff1a; 被用来进行预测的变量&#xff0c;相当于输入 2).因变量&#xff1a; 被预测的变量&#xff0c;相当于输出 3).回归分析&#xff1a; 用来建立方程模拟两个或者多个变量之间如何关…

从零开始学习Maven

maven Maven是apache公司开发的基于项目对象模型&#xff08;POM&#xff09; 可以通过一些描述信息来管理项目的构建、报告和文档的软件管理工具。 Maven 是用来管理项目&#xff0c;进行项目构建的一个软件。 java编写 项目构建流程&#xff1a; 1. 导入jar包 2. 配置文…

【MyBatis】RC隔离级别下,MyBatis 一级缓存、二级缓存造成的不一致情况

前言 数据库的MVCC 及 锁机制保证了数据的隔离、一致性。而建立在数据库之上的缓存&#xff0c;都会破坏掉数据库的一致性保障。本文探索在RC隔离级别下&#xff0c;MyBatis 一级缓存、二级缓存造成的坑。顺便复习一下 Spock 的用法&#xff0c;更加体验到了 Groovy 清爽的语法…

insert唯一索引加锁流程

MySQL版本&#xff1a;8.0.29 测试表&#xff1a; 测试数据&#xff1a; 开始测试&#xff1a; 事务1执行 加锁分析&#xff1a; mysql> SELECT * FROM performance_schema.data_locks\G *************************** 1. row ***************************ENGINE: INNO…

Express 中使用JWT进行登录验证

cookie 篇 : Node.js 中 cookie的验证登录 | session 篇 : Node.js 中 session验证登录 在前面讲过了两种验证登录的方式&#xff0c;其一是cookie&#xff0c;其二是session&#xff1b;那么在讲JWT之前先来简单的回顾这两种方式区别&#xff1b;cookie和sessi…

Java笔记023-包装类、String类、字符串的特性、String类、StringBuffer类、StringBuilder类

常用类包装类包装类的分类1、针对八种基本定义相应的引用类型-包装类2、有了类的特点&#xff0c;就可以调用类中的方法基本数据类型包装类booleanBooleancharCharacterbyteByteshortShortintIntegerlongLongfloatFloatdoubleDouble包装类和基本数据的转换演示包装类和基本数据…

LInux目录结构

文章目录Linux的目录结构Linux的目录结构Linux路径的描述方式目录各功能介绍HOME目录和工作目录Linux的目录结构 Linux的目录结构 Linux的目录结构是一个树型结构。 Windows 系统可以拥有多个盘符, 如 C盘、D盘、E盘 Linux没有盘符这个概念, 只有一个根目录 /, 所有文件都在…

【UE4 第一人称射击游戏】37-拾取副武器“M4A1”

上一篇&#xff1a;【UE4 第一人称射击游戏】36-切换武器时改变UI本篇效果&#xff1a;在拾取副武器“M4A1”前&#xff0c;点击键盘2键是无法切换武器的&#xff0c;当拾取武器后&#xff0c;点击键盘2键可以切换武器&#xff08;目前仅是右下角的图标和文字实现了切换&#x…

VBA小模板,一个不放回的抽奖用的例子

1 问题 一个不放回的抽奖用VBA怎么写&#xff0c;下面用一个类似对对碰/ 翻牌子的游戏&#xff08;抽到的奖励不放回&#xff0c;可抽的东西越来越少&#xff09;来举例说明 1.1 首先要回顾下几个经典的随机模型 古典概型&#xff0c;重点就是每次抽奖的各个奖品&#xff0c;概…

宇视门禁一体机接线图

宇视门禁一体机接线图宇视门禁一体机带反馈信号电磁锁接线图门禁的GND线通用&#xff0c;可以连到同一根线上&#xff0c;也可以分开连简单整理如图一体机线颜色和功能对应表颜色线路绿色RS485_A粉色RS485_B黑色GND蓝色WIEGAND_OUT_D0白色WIEGAND_OUT_D1灰色WIEGAND_IN_D0棕色W…

测试面试真题|工作2年,从小厂到大厂,薪资翻倍是怎样的体验?

最近&#xff0c;霍格沃兹测试学院学员 C 同学成功拿下某互联网大厂年薪 30W 测试开发岗位 Offer&#xff0c;顺利完成从手工测试工程师到测试开发的逆袭&#xff0c;薪资翻倍&#xff08;涨幅 100%&#xff09;&#xff0c;并获得了学院颁发的优秀学员奖学金。C 同学工作刚满 …

【3D目标检测】Delving into Localization Errors for Monocular 3D Object Detection

目录概述细节错误分析概述 本文是基于单目图像的3D目标检测方法。 【2021】【MonoDLE】 研究的问题: 核心问题&#xff1a;如何提高基于单目图像的3D目标检测的效果。作者量化了每个子任务的整体影响&#xff0c;观察到以下现象 观察一&#xff1a;定位误差是制约目标检测性…

变异凯撒题解

题目变异凯撒&#xff0c;说明没有使用一般的凯撒加密看到一个密码&#xff0c;我们可以找一下规律首先密文不完全是字母&#xff0c;但是经典凯撒加密的密文一定都是字母&#xff0c;说明这个题目可能是ASCLL码表偏移&#xff0c;而不是字母表偏移经典凯撒加密是字母和字母的偏…

SSM纯注解后台代码整合(Spring+SpringMvc+Mybatis)

SSM后台整合&#xff08;SpringSpringMvcMybtis事务Rest风格统一结果封装统一异常处理拦截器&#xff09; 文章目录1 基础环境搭建1.1 建表1.2 创建web项目1.3 导入依赖坐标&#xff08;pom.xml&#xff09;1.4 包路径的创建1.5 在pojo包下编写book实体类1.6 在webapp包下导入静…

很多人还不知道中视频计划手机上发布多端横竖屏视频的方法

如果说你刚开始接触中视频&#xff0c;你必须要学会的小知识。 横屏视频是16&#xff1b;9的视频&#xff0c;一般是手机横向拍摄的视频。 上传这样的视频有两种方法。第一种是需要用到电脑&#xff0c;第二种就是我今天要分享的这种&#xff0c;没有电脑&#xff0c;我们用手…