自定义控件绘图篇(一)基本几何图形绘制

在Android开发中,自定义控件是一种强大的技术,它允许开发者创建具有独特外观和行为的UI组件。通过自定义控件,你可以实现标准组件库中没有的功能和设计。自定义控件通常涉及两个主要方面:布局和绘图。本回答将重点介绍如何在自定义控件中进行基本的绘图操作,特别是如何绘制基本的几何图形。

1. 绘图基础

在Android中,绘图主要通过Canvas类完成。Canvas提供了一系列方法来绘制点、线、矩形、圆、路径等。为了在自定义控件中绘图,你需要创建一个继承自View的类,并重写onDraw(Canvas canvas)方法,在其中进行绘图操作。

2. 创建自定义View

首先,创建一个自定义View类,继承自View

Java

1import android.content.Context;
2import android.graphics.Canvas;
3import android.graphics.Color;
4import android.graphics.Paint;
5import android.util.AttributeSet;
6import androidx.annotation.Nullable;
7
8public class CustomView extends View {
9
10    private Paint mPaint;
11
12    public CustomView(Context context) {
13        super(context);
14        init();
15    }
16
17    public CustomView(Context context, @Nullable AttributeSet attrs) {
18        super(context, attrs);
19        init();
20    }
21
22    public CustomView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
23        super(context, attrs, defStyleAttr);
24        init();
25    }
26
27    private void init() {
28        mPaint = new Paint();
29        mPaint.setColor(Color.RED);
30        mPaint.setStyle(Paint.Style.FILL);
31    }
32
33    @Override
34    protected void onDraw(Canvas canvas) {
35        super.onDraw(canvas);
36        // 在这里进行绘图操作
37    }
38}

3. 绘制基本几何图形

接下来,在onDraw()方法中,我们可以使用CanvasPaint来绘制不同的几何图形。

绘制矩形

Java

1@Override
2protected void onDraw(Canvas canvas) {
3    super.onDraw(canvas);
4    canvas.drawRect(50, 50, getWidth() - 50, getHeight() - 50, mPaint);
5}
绘制圆形
Java
1@Override
2protected void onDraw(Canvas canvas) {
3    super.onDraw(canvas);
4    float centerX = getWidth() / 2;
5    float centerY = getHeight() / 2;
6    float radius = Math.min(centerX, centerY) - 50;
7    canvas.drawCircle(centerX, centerY, radius, mPaint);
8}
绘制椭圆

Java

1@Override
2protected void onDraw(Canvas canvas) {
3    super.onDraw(canvas);
4    canvas.drawOval(50, 50, getWidth() - 50, getHeight() - 50, mPaint);
5}
绘制线
 

Java

1@Override
2protected void onDraw(Canvas canvas) {
3    super.onDraw(canvas);
4    canvas.drawLine(50, 50, getWidth() - 50, getHeight() - 50, mPaint);
5}
绘制点
Java
1@Override
2protected void onDraw(Canvas canvas) {
3    super.onDraw(canvas);
4    for (int i = 0; i < 10; i++) {
5        int x = (int) (Math.random() * getWidth());
6        int y = (int) (Math.random() * getHeight());
7        canvas.drawPoint(x, y, mPaint);
8    }
9}

4. 结合使用

你可以结合使用上述方法来绘制更复杂的图形。例如,绘制一个带有边框的彩色矩形:

Java
1@Override
2protected void onDraw(Canvas canvas) {
3    super.onDraw(canvas);
4    mPaint.setStyle(Paint.Style.FILL);
5    canvas.drawRect(50, 50, getWidth() - 50, getHeight() - 50, mPaint);
6
7    mPaint.setStyle(Paint.Style.STROKE);
8    mPaint.setStrokeWidth(5);
9    mPaint.setColor(Color.BLACK);
10    canvas.drawRect(50, 50, getWidth() - 50, getHeight() - 50, mPaint);
11}

通过以上步骤,你可以开始探索更高级的绘图功能,如路径、文本、位图等,进一步扩展你的自定义控件的能力。

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

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

相关文章

哪个品牌的加密软件稳定方便使用?

一、什么是企业加密软件&#xff1f; 企业加密软件是一种用于保护企业内部数据安全的工具。在数字化时代&#xff0c;随着数据量的爆炸式增长&#xff0c;信息安全和隐私保护变得愈发重要。企业加密软件作为保障数据安全的关键工具&#xff0c;受到越来越多用户的青睐。 企业…

昆虫学(书籍学习资料)

包括昆虫分类&#xff08;上下册&#xff09;、昆虫生态大图鉴等书籍资料。

调和均值

文章目录 调和均值的定义和公式调和均值的几何解释调和均值的应用调和均值与算术平均和几何平均的比较示例 调和均值的定义和公式 调和均值是一种特殊的平均数&#xff0c;适用于处理涉及比率或速度的数据。对于一组正数 x 1 , x 2 , … , x n x_1, x_2, \ldots, x_n x1​,x2…

Java中的AQS

Java中的AbstractQueuedSynchronizer&#xff08;AQS&#xff09;是Java并发框架的核心组件之一&#xff0c;它位于java.util.concurrent.locks包下。AQS为Java的锁和其他同步工具提供了基础架构&#xff0c;它使用模板设计模式和一种称为“CLH锁”的算法来实现高效的线程同步。…

如何使用 SwiftUI 构建 visionOS 应用

文章目录 前言WindowsVolumes沉浸式空间结论 前言 Apple Vision Pro 即将推出&#xff0c;现在是看看 SwiftUI API 的完美时机&#xff0c;这使我们能够将我们的应用程序适应 visionOS 提供的沉浸式世界。苹果表示&#xff0c;构建应用程序的最佳方式是使用 Swift 和 SwiftUI。…

2024年软件测试岗必问的100+个面试题【含答案】

一、基础理论 1、开场介绍 介绍要领&#xff1a;个人基本信息、工作经历、之前所做过的工作及个人专长或者技能优势。扬长避短&#xff0c;一定要口语化&#xff0c;语速适中。沟通好的就多说几句&#xff0c;沟通不好的话就尽量少说两句。举例如下&#xff1a; 面试官你好&…

Java中Predicate(谓词),方法引用,以及正则的一些讲解

1.Predicate接口简述 FunctionalInterface public interface Predicate<T> {boolean test(T t);default Predicate<T> and(Predicate<? super T> other) {Objects.requireNonNull(other);return (t) -> test(t) && other.test(t);}default Pred…

速盾:cdn加速效果

CDN&#xff08;Content Delivery Network&#xff09;即内容分发网络&#xff0c;是一种通过在全球多个节点服务器上缓存网站的静态资源&#xff0c;并将用户请求导向离用户最近的服务器节点&#xff0c;从而提供更快速的访问体验的技术。 在传统的网络架构中&#xff0c;用户…

鸿蒙 HarmonyOs 网络请求 快速入门

官方文档&#xff1a; ArkUI简介-ArkUI&#xff08;方舟UI框架&#xff09;-应用框架 | 华为开发者联盟 (huawei.com) 一、通过原有的http组件进行网络请求&#xff08;方式一&#xff09; 1.1 HttpRequestOptions的操作 名称类型描述methodRequestMethod请求方式&#xff…

12款超良心好用APP推荐,每一款都值得下载!

AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/分享是奉献的果实&#xff0c;分享是快乐的前提。每天给小伙伴们分享自己认可的软件&#xff0c;也是莫大的幸福&#xff0c;今天获得12款好用的软…

class类和style内联样式的绑定

这里的绑定其实就是v-bind的绑定&#xff0c;如代码所示&#xff0c;div后面的引号就是v-bind绑定&#xff0c;然后大括号将整个对象括起来&#xff0c;对象内先是属性&#xff0c;属性后接的是变量&#xff0c;这个变量是定义在script中的&#xff0c;后通过这个变量&#xff…

flutter:监听路由的变化

问题 当从路由B页面返回路由A页面后&#xff0c;A页面需要进行数据刷新。因此需要监听路由变化 解决 使用RouteObserver进行录音监听 创建全局变量&#xff0c;不在任何类中 final RouteObserver<PageRoute> routeObserver RouteObserver<PageRoute>();在mai…

flask-apscheduler 定时任务被执行两次

定时任务没有被多次调用&#xff0c;事实上如果多次调用的话&#xff0c;flask-apscheduler会抛出异常。 但一开始任务还是按时执行一次&#xff0c;重启flask或者修改部分代码后&#xff0c;就发送定时任务一次执行两次了。 之所以会发生这种情况&#xff0c;是因为在debug模…

面试-微服务篇

springcloud组件有哪些&#xff1f; eureka、ribbon负载均衡、feign、hystrix、zuul/gateway网关 nacos、ribbon、feign、sentinel、gateway 服务注册和发现是什么意思&#xff1f;springcloud如何实现服务注册发现&#xff1f; 微服务中必须要使用的组件&#xff0c;考察我们使…

LeetCode刷题记录:(15)三角形最小路径和

知识点&#xff1a;倒叙的动态规划 题目传送 解法一&#xff1a;二维动态规划【容易理解】 class Solution {public int minimumTotal(List<List<Integer>> triangle) {int n triangle.size();if (n 1) {return triangle.get(0).get(0);}// dp[i][j]:走到第i层第…

[240705] 美光或将助力英伟达 RTX 50系列领先 AMD | 中国领跑生成式人工智能专利竞赛

目录 美光或将助力英伟达 RTX 50系列领先 AMD中国领跑生成式人工智能专利竞赛 美光或将助力英伟达 RTX 50系列领先 AMD &#x1f4e2; 美光近日公布了其下一代显存 GDDR7 的性能数据&#xff0c;显示出在游戏性能方面高达30%的提升&#xff0c;这对于即将推出的显卡来说无疑是…

白骑士的C语言教学基础篇 1.2 C语言基础语法

系列目录 上一篇&#xff1a;白骑士的C语言教学基础篇 1.1 C语言介绍 在这一篇内容中&#xff0c;我们将介绍C语言的基础语法&#xff0c;包括C语言的程序结构、数据类型与变量、常量与运算符。 C语言程序结构 C语言程序的基本结构包括头文件、主函数和语句。一个简单的C语言…

Java+前后端分离架构+ MySQL8.0.36产科信息管理系统 产科电子病历系统源码

Java前后端分离架构 MySQL8.0.36产科信息管理系统 产科电子病历系统源码 产科信息管理系统—住院管理 数字化产科住院管理是现代医院管理中的重要组成部分&#xff0c;它利用数字化技术优化住院流程&#xff0c;提升医疗服务质量和效率。以下是对数字化产科住院管理的详细阐述…

【Spring Boot】统一异常处理

目录 统一异常处理一. 概念二. 全局异常处理三. 处理特定异常 统一异常处理 一. 概念 其实统一异常是运用了AOP&#xff08;对某一类事情的集中处理&#xff09;的思维&#xff0c;简单概括就是在我们进行前后端数据交互的时候&#xff0c;抛出的任何的异常都能够自动捕获然后…

uniapp微信接口回调 response.sendRedirect nginx 报404错误

如题 参考 uniapp打包H5时,访问index.html页面白屏报错net::ERR_ABORTED 404 - 简书 nginx中修改 配置文件 location / { try_files $uri $uri/ /index.html; root html; index index.html index.htm; } uniapp里配置 重新载入