Android自定义View实现shape图形绘制

发布时间 - 2026-01-10 22:15:12    点击率:

概述

之前曾写过一篇文章介绍了Android中drawable使用Shape资源,通过定义drawable中的shape资源能够绘制简单的图形效果,如矩形,椭圆形,线形和圆环等。后来我在项目中正好遇到这样一个需求,要在特定的位置上显示一条垂直的虚线。正当我胸有成竹的把上面的资源文件放入进去的时候,我才发现它并不能符合我的要求。使用shape画出的垂直虚线,其实就是将一条水平的线,旋转90度。但这样做的弊端就是,该View有效区域为旋转90度后与原来位置相重合的区域,还不能随意的改动,这样的效果根本没法使用。于是我就想到使用自定义view来绘制我想要的结果。

1.画一条水平虚线

代码如下所示:

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

public class CustView extends View{

  private Paint mPaint; //定义画笔

  public CustView(Context context, AttributeSet attrs) {
    super(context, attrs);

    //初始化画笔
    initPaint();
    setLayerType(View.LAYER_TYPE_SOFTWARE, mPaint); //4.0以上关闭硬件加速,否则虚线不显示
  }

  private void initPaint() {
    mPaint = new Paint();
    mPaint.setAntiAlias(true); //设置抗锯齿的效果
    mPaint.setStyle(Paint.Style.STROKE); //设置画笔样式为描边
    mPaint.setStrokeWidth(3); //设置笔刷的粗细度
    mPaint.setColor(Color.RED); //设置画笔的颜色
    mPaint.setPathEffect(new DashPathEffect(new float[]{5,5,5,5}, 1)); //设置画笔的路径效果为虚线效果
  }

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

    canvas.drawLine(0, 0, 100, 0, mPaint);
  }
}

布局文件中引用如下:

<com.test.CustView
  android:layout_width="100dp"
  android:layout_height="10dp"
  android:layout_marginTop="10dp" />

说明:在自定义View的代码中,onDraw方法中执行的drawLine方法,全名如下:

public void drawLine (float startX, float startY, float stopX, float stopY, Paint paint)

startX:起始端点x坐标
startY:起始端点y坐标
stopX:终止端点x坐标
stopY:终止端点y坐标

上面四个左边的值均以相对位置计算,即与左边控件的相对位置,如果左边没有控件则手机屏幕左边框的相对位置计算。
canvas.drawLine(0, 0, 100, 0, mPaint);表示的是相对左边为x,y坐标为0的位置开始,向右画出100px的虚线。

去掉Button按钮后,相对位置开始以屏幕左边框计算,如图所示:

还有一点需要注意的是,stopX和stopY的值,不能超过该控件在xml中layout_width和layout_height的值,否则将会以值最小的为基准,超出的长度无效。

2.画一条垂直虚线

与上面代码一致,只需要修改至下面一处:

canvas.drawLine(0, 0, 0, 100, mPaint);

3.画一个实心圆

1).首先设置画笔样式为实心

mPaint.setStyle(Paint.Style.FILL); //设置画笔样式为填充

2).在画布中画圆

canvas.drawCircle(50, 50, 50, mPaint);

同样X和Y的值,不能超过该控件在xml中layout_width和layout_height的值。

4.画一个圆环

同样只需稍微修改一下代码:

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

    canvas.drawCircle(50, 50, 50, mPaint); //画一个外圆
    mPaint.setColor(Color.WHITE);      //重新设置画笔颜色
    canvas.drawCircle(50, 50, 30, mPaint); //画一个内圆
  }

5.画一个矩形

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

    RectF rect = new RectF(0, 0, 80, 60);
    canvas.drawRect(rect, mPaint);
  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# Android  # View  # shape  # Android开发 OpenGL ES绘制3D 图形实例详解  # Android开发之OpenGL绘制2D图形的方法分析  # Android openGl 绘制简单图形的实现示例  # Android编程开发之在Canvas中利用Path绘制基本图形(圆形  # 矩形  # 椭圆  # 三角形等)  # Android编程之canvas绘制各种图形(点  # 直线  #   #   # 文字  # 多边形  # 曲线  # 圆角矩形)  # Android开发实现各种图形绘制功能示例  # Android自定义控件绘制基本图形基础入门  # android绘制几何图形的实例代码  # Android shape 绘制图形的实例详解  # Android中常见的图形绘制方式总结  # 画一  # 的是  # 自定义  # 画出  # 不能超过  # 我就  # 我在  # 只需  # 要在  # 胸有成竹  # 这样做  # 这样一个  # 一处  # 只需要  # 所示  # 并不能  # 还不能  # 会以  # 需要注意  # 写过 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 深圳防火门网站制作公司,深圳中天明防火门怎么编码?  Laravel Octane如何提升性能_使用Laravel Octane加速你的应用  Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】  如何挑选优质建站一级代理提升网站排名?  动图在线制作网站有哪些,滑动动图图集怎么做?  如何获取PHP WAP自助建站系统源码?  Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用  Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲  大学网站设计制作软件有哪些,如何将网站制作成自己app?  如何在橙子建站中快速调整背景颜色?  Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制  Laravel如何实现用户密码重置功能?(完整流程代码)  iOS UIView常见属性方法小结  如何快速选择适合个人网站的云服务器配置?  Laravel定时任务怎么设置_Laravel Crontab调度器配置  黑客如何利用漏洞与弱口令入侵网站服务器?  Laravel storage目录权限问题_Laravel文件写入权限设置  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  node.js报错:Cannot find module &#39;ejs&#39;的解决办法  Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧  免费网站制作appp,免费制作app哪个平台好?  html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】  Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧  详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点  如何在云主机上快速搭建网站?  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  php 三元运算符实例详细介绍  java获取注册ip实例  如何获取免费开源的自助建站系统源码?  奇安信“盘古石”团队突破 iOS 26.1 提权  Laravel如何处理表单验证?(Requests代码示例)  佛山企业网站制作公司有哪些,沟通100网上服务官网?  JS碰撞运动实现方法详解  Laravel如何实现文件上传和存储?(本地与S3配置)  JS实现鼠标移上去显示图片或微信二维码  北京网站制作的公司有哪些,北京白云观官方网站?  EditPlus中的正则表达式实战(5)  如何用低价快速搭建高质量网站?  Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤  历史网站制作软件,华为如何找回被删除的网站?  如何基于PHP生成高效IDC网络公司建站源码?  太平洋网站制作公司,网络用语太平洋是什么意思?  如何快速上传自定义模板至建站之星?  ChatGPT 4.0官网入口地址 ChatGPT在线体验官网  Java垃圾回收器的方法和原理总结  Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程  如何确认建站备案号应放置的具体位置?  Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】  高端网站建设与定制开发一站式解决方案 中企动力