Android : 画布绘制矩形和文字 让其居中显示简单应用

news2024/11/15 11:00:55

示例图:

CenterView.java

package com.example.demo;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.Log;
import android.view.View;

public class CenterView extends View {

    public CenterView(Context context) {
        super(context);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        Paint paint = new Paint();
        paint.setColor(Color.RED);
        paint.setStrokeWidth(10);//边框线大小
         /** 画矩形
         * 参数一 左边与左边框的距离, 参数二 顶部与上边框的距离,参数三,左边与右边宽的距离,参数四 顶部与下边框的距离
         * 宽度:左边到右边距离 600 - 100 =  500
         * 高度: 上面到下面距离 500 - 200 =  300
         */
        canvas.drawRect(100, 200, 600, 500, paint);

        /**画线
         * 基准线
         *  把文字放在矩形中 居中显示
         * */
        Paint paint4 = new Paint();
        paint4.setARGB(100, 120, 255, 0);
        paint4.setTextSize(100);//文字大小
        paint4.setStrokeWidth(10);//边框线大小
        //基准线
        //矩形的中心 上边距离 + 高度的一半 横
        canvas.drawLine(0, 200 + (300 / 2), 800, 200 + (300 / 2), paint4);

        //矩形的中心 左边距离 + 宽度的一半 竖 100 + (500 /2 )
        canvas.drawLine(100 + (500 / 2), 0, 100 + (500 / 2), 800, paint4);//画一条竖线

        //文字的宽度
        float textWidth = paint4.measureText("appbg");
        Log.e("TAG", "文字宽度:" + textWidth + "----画布宽度:" + getWidth() + "----画布高度:" + getHeight());

        //文字居中需要的对象
        Paint.FontMetrics fm = paint4.getFontMetrics();

        // 计算水平位置  (左边 100 + 宽度 500 - 文字宽度) /2 + 左边的一半
        float x = (600 - textWidth) / 2 + 50;
        // 矩形 宽度:左边到右边距离 600 - 100 =  500
        //矩形 高度: 上面到下面距离 500 - 200 =  300

        // 计算垂直位置 (上边 200 + 高度300)/2 - (文字的高度 :asscent(是负数) 和 descent 的高度)+高度的一半
        //500/2 +(asscent - descent) + 500/2
        float y = 500 / 2 + (fm.ascent - fm.descent) + 500 / 2;
        canvas.drawText("appbg", x, y, paint4);


    }
}

MainActivity.java

public class MainActivity extends AppCompatActivity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        setContentView(R.layout.activity_main);
 
        setContentView(new CenterView(this));
    }
 
}

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

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

相关文章

c语言用四种方式求解成绩之中最高分和最低分的差值

文章目录 一,题目二,方法1,方法一2,方法二3,方法三4,方法四 三,示例结果 一,题目 最高分最低分之差 输入n个成绩,换行输出n个成绩中最高分数和最低分数的差 输入 : 两行…

利用网络教育系统构建个性化学习平台

在现代教育中,网络教育系统作为一种创新的学习方式,为学生提供了更加个性化和灵活的学习体验。在本文中,我们将通过简单的技术代码,演示如何构建一个基础的网络教育系统,为学生提供个性化的学习路径和资源。 1. 环境…

Undo Log 、Binary Log、Redo Log之间到底有什么区别?

Undo Log 、Binary Log、Redo Log各自的作用 先抛结论:他们各自的作用是什么 Undo Log :用于保证数据库事务原子性Binary Log:用于数据库的数据备份/主从复制Redo Log:用于保证数据库事务持久性 接下来详细谈谈它们 Undo Log …

关于Java并发、JVM面试题

前言 之前为了准备面试,收集整理了一些面试题。 本篇文章更新时间2023年12月27日。 最新的内容可以看我的原文:https://www.yuque.com/wfzx/ninzck/cbf0cxkrr6s1kniv 并发 进程与线程的区别 线程属于进程,进程可以拥有多个线程。进程独享…

【项目】玩具租赁博客测试报告

目录 一、项目背景 二、项目功能 三、功能测试 一、项目背景 玩具租赁系统采用前后端分离的方法来实现,同时使用了数据库来存储相关的数据,同时将其部署到云服务器上。前端主要有十五个页面构成:用户注册、管理员注册、登录页、用户和管理…

java浅拷贝BeanUtils.copyProperties引发的RPC异常 | 京东物流技术团队

背景 近期参与了一个攻坚项目,前期因为其他流程原因,测试时间已经耽搁了好几天了,本以为已经解决了卡点,后续流程应该顺顺利利的,没想到 人在地铁上,bug从咚咚来~ 没有任何修改的服务接口,抛出…

IT安全:实时网络安全监控

了解庞大而复杂的网络环境并非易事,它需要持续观察、深入分析,并对任何违规行为做出快速反应。这就是为什么实时网络安全监控工具是任何组织 IT 安全战略的一个重要方面。 网络攻击和合规性法规是 IT 安全的两个主要驱动因素。同时,数据泄露…

Spring Cloud Gateway 常见过滤器的基本使用

目录 1. 过滤器的作用 2. Spring Cloud Gateway 过滤器的类型 2.1 内置过滤器 2.1.1 AddResponseHeader 2.1.2 AddRequestHeader 2.1.3 PrefixPath 2.1.4 RequestRateLimiter 2.1.5 Retry 2.2 自定义过滤器 1. 过滤器的作用 过滤器通常用于拦截、处理或修改数据流和事…

Springboot+vue的医疗报销系统(有报告),Javaee项目,springboot vue前后端分离项目

演示视频: Springbootvue的医疗报销系统(有报告),Javaee项目,springboot vue前后端分离项目 项目介绍: 本文设计了一个基于Springbootvue的前后端分离的医疗报销系统,采用M(model&a…

百度沧海文件存储CFS推出新一代Namespace架构

随着移动互联网、物联网、AI 计算等技术和市场的迅速发展,数据规模指数级膨胀,对于分布式文件系统作为大规模数据场景的存储底座提出了更高的要求。已有分布式文件系统解决方案存在着短板,只能适应有限的场景: >> 新型分布式…

【产品经理】axure中继器的使用——表格增删改查分页实现

笔记为个人总结笔记,若有错误欢迎指出哟~ axure中继器的使用——表格增删改查分页实现 中继器介绍总体视图视频预览功能1.表头设计2.中继器3.添加功能实现4.删除功能实现5.修改功能实现6.查询功能实现7.批量删除 中继器介绍 在 Axure RP9 中,中继器&…

IntelliJ IDEA Apache Dubbo,IDEA 官方插件正式发布!

作者:刘军 最受欢迎的 Java 集成开发环境 IntelliJ IDEA 与开源微服务框架 Apache Dubbo 社区强强合作,给广大微服务开发者带来了福音。与 IntelliJ IDEA 2023.2 版本一起,Jetbrains 官方发布了一款全新插件 - Apache Dubbo in Spring Frame…

matlab列优先与高维矩阵重构

由于matlab在列化a(:)以及reshape(a)等操作中是列优先的,所以要重构出新的高维度矩阵,通常要把reshape和permute结合起来使用。 先到 http://caffe.berkeleyvision.org/ 下载 训练好的model bvlc_reference_caffenet.caffemodel; 更多caffe使用也请参看…

C#编程艺术:Fizzler库助您高效爬取www.twitter.com音频

数据是当今数字时代的核心资源,但是从互联网上抓取数据并不容易。本文将教您如何利用C#编程艺术和Fizzler库高效爬取Twitter上的音频数据,让您轻松获取所需信息。 Twitter简介 Twitter是全球最大的社交媒体平台之一,包含丰富的音频资源。用…

机器学习系列--R语言随机森林进行生存分析(1)

随机森林(Breiman 2001a)(RF)是一种非参数统计方法,需要没有关于响应的协变关系的分布假设。RF是一种强大的、非线性的技术,通过拟合一组树来稳定预测精度模型估计。随机生存森林(RSF&#xff0…

【Pytorch】学习记录分享8——PyTorch自然语言处理基础-词向量模型Word2Vec

【Pytorch】学习记录分享7——PyTorch自然语言处理基础-词向量模型Word2Vec 1. 词向量模型Word2Vec)1. 如何度量这个单词的?2.词向量是什么样子?3.词向量对应的热力图:4.词向量模型的输入与输出![在这里插入图片描述](https://img-blog.csdni…

solidity案例详解(七)复杂众筹合约

自己原创智能合约,有作业需求可加下面的图片中的裙 1、在 Remix 中,以 Account1 完成“众筹项目”合约的编译和部署。(显示合约、函数、状态变量、结构体、事件的命名) 2、在 Remix 中,以 Account2 完成“参与众筹”合…

【架构】企业信息安全体系架构详解

企业信息安全体系架构来说,是包含技术、运维、管理3个层面。本文说的安全架构,主要集中讨论偏研发技术层面的安全架构。 安全性是软件研发技术体系,系统架构设计阶段的一个关键DFX能力,与可靠性、可服务性、性能等架构属性并列。由于安全性设计自身的特点,涉及到系统架构…

【ARMv8M Cortex-M33 系列 2.1 -- Cortex-M33 使用 .hex 文件介绍】

文章目录 HEX 文件介绍英特尔十六进制文件格式记录类型hex 示例Cortex-M 系列hex 文件的使用 HEX 文件介绍 .hex 文件通常用于微控制器编程,包括 ARM Cortex-M 系列微控制器。这种文件格式是一种文本记录,用于在编程时传递二进制信息。.hex 文件格式最常…

Python+OpenCV 零基础学习笔记(1):anaconda+vscode+jupyter环境配置

文章目录 前言相关链接环境配置:AnacondaPython配置OpenCVOpencv-contrib:Opencv扩展 Notebook:python代码笔记vscode配置配置AnacondaJupyter文件导出 前言 作为一个C# 上位机,我认为上位机的终点就是机器视觉运动控制。最近学了会Halcon发现机器视觉还…