Android 绘制虚线

Android自定义view的方式绘制虚线 Android自定义view绘制虚线最近项目中有个需求,通过自定义view的方式绘制虚线别的不多说先看一眼效果这个需求在我们的开发中应该是一个很常见的需求了吧,有人会说有更简单的实现方式,对,但是你试过么,比如网上提到的这种方式代码如下这里写图片描述 看样子好像已经成功了,最后在把这个作为background加进去,结果在真机上跑一圈,发现显示的竟然是一条实线,在好几台手机上试都是这样,都是一条 阅读详情

###水平虚线
如果需要完成水平虚线,可以这样处理。

  • 声明shape,其中dashGap是虚线的间隔宽度,dashWidth是实线的间隔宽度,stroke翻译过来是名词,画
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="line" >
    <stroke
        android:width="1dp"
        android:dashGap="3dp"
        android:dashWidth="3dp"
        android:color="#ffececec" />
    <size android:height="1dp"/>
</shape>
  • 然后可以在layout文件中直接使用
<View
    android:layout_width="match_parent"
    android:layout_height="2dp"
    android:contentDescription="@string/contentDescription"
    android:layerType="software"
    android:background="@drawable/dash_line" />

###竖直虚线
按照上面的实现思路,把水平线直接转换为竖直线就可以,实现上并没有什么难点

<View
    android:layout_width="2dp"
    android:layout_height="match_parent"
    android:contentDescription="@string/contentDescription"
    android:layerType="software"
    android:background="@drawable/dash_line" />

然后运行,你会很惊讶的发现,居然啥也显示不出来,这是弄啥咧?然后慌张的打开Stack Overflow,然后惊奇的发现,竖直虚线需要在水平虚线基础上旋转90

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:left="-300dp"
        android:right="-300dp">
        <rotate
            android:drawable="@drawable/dash_line"
            android:fromDegrees="90"
            android:toDegrees="90"
            android:visible="true" />
    </item>
</layer-list>

shape准备好以后,直接拿过来使用即可

<View
    android:layout_width="4dp"
    android:layout_height="match_parent"
    android:layout_marginBottom="5dp"
    android:layout_marginTop="5dp"
    android:background="@drawable/dash_vertical_line"
    android:contentDescription="@string/app_name"
    android:layerType="software" />

这样很轻松就把水平虚线转换成了竖直虚线,但是上面的实现方式会遇到如下问题:

在小米1S真机上显示不出来,原因是不支持LAYER_TYPE_SOFTWARE

##解决方案
针对上面的问题,可以通过最原始的canvas画线来解决,因为代码比较简单,这里直接给出code即可。

###自定义DashView实现

public class VerticalDashView extends View {

    private Paint mDashPaint;

    private Rect mRect;

    public VerticalDashView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    @SuppressLint({ "InlinedApi", "NewApi" })
    private void init() {
        
        if (Build.VERSION.SDK_INT >= 11) {
            setLayerType(View.LAYER_TYPE_SOFTWARE, null);
        }

        final DisplayMetrics metrics = getResources().getDisplayMetrics();

        float width = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 1, metrics);
        float dashGap = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 3, metrics);
        float dashWidth = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 3, metrics);

        mDashPaint = new Paint();
        mDashPaint.setColor(0xffececec);
        mDashPaint.setStyle(Style.STROKE);
        mDashPaint.setStrokeWidth(width);
        mDashPaint.setAntiAlias(true);
        //DashPathEffect是Android提供的虚线样式API,具体的使用可以参考下面的介绍
        mDashPaint.setPathEffect(new DashPathEffect(new float[] { dashWidth, dashGap }, 0));

        mRect = new Rect();
    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);
        //取出线条的位置(位置的定义放在XML的layout中,具体如下xml文件所示)
        mRect.left = left;
        mRect.top = top;
        mRect.right = right;
        mRect.bottom = bottom;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        float x0 = (mRect.right - mRect.left) / 2f;
        float y0 = 0;
        float x1 = x0;
        float y1 = y0 + mRect.bottom - mRect.top;
        
        canvas.drawLine(x0, y0, x1, y1, mDashPaint);
    }
}

###Layout使用
上面提及取出线条的位置,这里的定位就是通过XML的这个layout来定位的,而onLayout()方法中后面四个非常重要的int型方位参数就是父View建议并传下来的值

<com.xxxx.android.view.VerticalDashView
    android:layout_width="4dp"
    android:layout_height="match_parent"
    android:layout_marginBottom="5dp"
    android:layout_marginTop="5dp" />

mRect成员变量保存上面Layout中定义的位置,然后再onDraw()方法中画出View即可。
###补充说明(DashPathEffect)

此处输入图片的描述

DashPathEffect是PathEffect类的一个子类,可以使paint画出类似虚线的样子,并且可以任意指定虚实的排列方式.
代码中的float数组,必须是偶数长度,且>=2,指定了多少长度的实线之后再画多少长度的空白.
如本代码中,绘制长度5的实线,再绘制长度10的空白,再绘制长度15的实线,再绘制长度20的空白,依次重复。

Android自定义View实现绘制虚线的方法详解 前言 说实话当第一次看到这个需求的时候,第一反应就是Canvas只有drawLine方法,并没有drawDashLine方法啊!这咋整啊,难道要我自己做个遍历不断的drawLine?不到1秒,我就放弃这个想法了,因为太恶心了。方法肯定是有的,只不过我不知道而已。 绘制方法 最简单的方法是利用ShapeDrawable,比如说你想用虚线要隔开两个控件,就可以在这两个控件中加个View,然后给它个虚线背景。 嗯,理论上就是这样子的,实现上也很简单。 <!-- drawable 文件 --> <?xml version=1.0 encoding=utf-8?> <shape xmlns:a 立即下载

相关推荐

zynq-7000学习笔记(八)——USB摄像头图像采集

PC平台:WINDOWS 10 64位 Xilinx设计开发套件:Xilinx_vivado_sdk_2015.4 开发板:Zed Board USB摄像头:罗技 C270(720P) linux源码:2016_R1 一、配置linux,支持UVC       如果是中星微的ZC3XX系列的芯片,则要进到GSPCA把ZC3XX的驱动选上

luotong86的专栏 1万+

Android中Paint画图(线、虚线、矩形、多边形、圆形、曲线、半圆、三角形、旋转文字)

线 private void drawLine(Canvas canvas, float startX,float startY,float stopX,float stopY, float width,int color){ Paint paint = new Paint(); paint.setAntiAlias(true);//抗锯齿 paint.setStyle(Pai

aidou1314的博客 9444

安装keil5(MDK)及导入pack包教程

首先说明的是我安装的Keil版本为Keil V5.29.0.0 1、安装软件 右键管理员权限运行安装包 设置安装路径以及pack的存放路径 随意输入First Name和E-mail 安装驱动 完成软件安装,然后可以先关闭弹出的Pack Install(一会再添加) 2、激活一下软件 打开桌面的Keil File → License Management(我之前注册过了) 右...

hrx-@@ 10万+

菜鸟学android——paint画虚线的问题

看了网上很多答案,教

sollian的专栏 1万+

西电微原课设——矩阵式键盘数字密码锁设计

内容要求:根据设定好的密码,采用4x4矩阵键盘实现密码的输入功能。当密码输入正确之后,锁就打开(绿灯亮),10秒之后,锁自动关闭(红灯亮);如果连续输入三次密码不正确,就锁定按键5秒钟,同时发出报警(黄灯闪),5秒后,解除按键锁定,恢复密码输入。...

Polaris的博客 1万+

数据结构与算法 —— 最短路径Dijkstra算法(迪杰斯特拉)详细图解以及python实现

前两章我们讲到了关于图的基本知识,和广度/深度优先搜索。本章,我们将介绍加权图和最短路径的相关知识。最短路径和最小生成树是图论中常见的问题。最短路径是指在一个图中找到两个节点之间的最短路径,最小生成树是指在一个图中找到一个连通子图,使得所有节点都能够互相到达,且总权值最小。最短路径算法常见的有floyd算法(弗洛伊德算法)和 dijkstra算法(迪杰斯特拉)。本文只介绍dijkstra算法。最短路径运用非常广泛,比如在导航系统中,确定两个地点间哪条路线最短;

‘’ 2万+

Android 虚线边框

可以参考链接: Android 虚线边框 链接

Lyc_S的博客 1030

嵌入式STM32控制电梯面板

嵌入式STM32控制电梯面板 用点阵来显示电梯向上还是向下运动,用数码管来显示楼层数(由于灯阵显示楼层数比较困难故用数码管代替)。当按下对应的按钮,就可以去到对应层数,可上升可下降。 #include "stm32f10x.h" #include "stm32f10x_exti.h" #include "stm32f10x_it.h" #define uint unsigned int #define KEY1 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_10) #define

code_init_的博客 2111

android自定义虚线,Android 绘制虚线

Android 绘制虚线AndroidView简单需求先来看看这么一个需求水平虚线如果需要完成上面的水平虚线,可以这样处理。声明shape,其中dashGap是虚线的间隔宽度,dashWidth是实线的间隔宽度,stroke翻译过来是名词,画android:shape="line">android:width="1dp"android:dashGap="3dp"android:dashWid...

weixin_39598568的博客 775

NeRF-Pytorch(训练自己的数据集过程全记录+环境配置+COLMAP+问题解决)

写于2025/1/26,在用NeRF训练自己的数据集过程中该踩的坑都踩过了,发现网上并没有详细完整写这些问题解决过程的帖子,遂自己进行一个全记录和复盘。 整篇文章包括:NeRF训练环境配置;COLMAP三维重建过程(直接给出代码,规避一些bug);在训练时候出现的问题。 本篇文章仅针对llff格式数据集。

m0_62577716的博客 1774

Altium Designer应用技巧1: 功能模块的复用方法

Altium Designer应用技巧1: 功能模块的复用方法      我们在使用Altium Designer进行电路图设计时,常会遇到功能模块的复用问题,例如我们经常需要将12V以DC-DC的方式转换成5V,这在很多线路板上都会应用到。现在我们普通的做法是,每个板子都重新绘制一遍,像这样DC-DC的电路,很浪费时间。那么如何采用提高工作效率呢?我们可以采取Altium Desi

snmplink的博客 1万+

android虚线边框_android 绘制虚线效果

有的时候我们需要一种虚线效果,比如图片的边框,愤怒的小鸟的飞翔路径,那么怎么绘制这些虚线呢?方法很多,目前我觉得好的有两种:一、自己创建模式,一个点一个点的绘制。二、用Android提供的 DashPathEffect 类来创建模式绘制。下面我要演示的就是第二种方法,用Android提供给我的API来绘制。由于是开发项目的一个小块,下面只能给出部分截图:效果如上面。下面看一下核心绘图代码:publ...

weixin_39918690的博客 1165

NR PUCCH(二)PUCCH format 2/3/4

继续看PUCCH2/3/4:PUCCH format 0和1所携带的信息bits少,UCI bits2bits,信息bit需要经过编码等过程下面分别来看。

ModemProtocol的博客 537

安卓开发之使用DashPathEffect来绘制虚线

原理:主要用到了PathEffect的子类 DashPathEffect方法:给画笔Paint对象设置绘制路径时的特效:.setPathEffect效果:DashPathEffect 构造方法的参数决定了绘制的路径效果:public DashPathEffect( float[] intervals, float phase )intervals是一个float数组,且其长度必须是偶

cxmscb的博客 1万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Android绘制虚线

Android绘制虚线的两种方式 1.自定义view 看到网上很多人说用drawLine绘制,但是其实根本就没有效果,真正效果的是drawPath这个方法,话不多说直接上代码 public class DotView extends View { private Paint mLinePaint; private Paint mPaint; private Path mPath; private Context context; public DotView

chengduxinxigong的博客 3058

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

android 绘制虚线效果

有的时候我们需要一种虚线效果,比如图片的边框,愤怒的小鸟的飞翔路径,那么怎么绘制这些虚线呢?方法很多,目前我觉得好的有两种: 一、自己创建模式,一个点一个点的绘制。 二、用Android提供的 DashPathEffect 类来创建模式绘制。 下面我要演示的就是第二种方法,用Android提供给我的API来绘制。 由于是开发项目的一个小块,下面只能给出部分截图: 绘制

dylancao的专栏 1228

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

android绘制虚线

自定义view绘制虚线 在某些手机上绘制虚线无效,始终显示为实线。

gengbaolong的博客 2272

Android百度地图SDK上绘制虚线

由于业务需要,需要在轨迹中某段绘制虚线,但到v2.3.1为止,SDK只提供了绘制实线的功能。 为此,只能通过数学方法,手动绘制。原理是将一段直线进行分拆,然后绘制奇数段,最后构成一段虚线 Step1.通过三角形相似的方法,确定出各个分段点的经纬度 final Point[] points=new Point[10]; Point start

leorowe的专栏 5028

Android绘制虚线变为实线,踩坑之旅

#问题 先上原来代码中画虚线的代码 PathEffect effects = new DashPathEffect(new float[]{5, 5}, 1); mPaint.setPathEffect(effects); canvas.drawLine(a, b,c, b, mPaint); 绘制出来之后一直都是实线,怎么修改都是这样,然后在网上搜也一直没有找到合适的答案,后来发现了一篇一样问...

lebulangzhen的博客 1041

PathEffect的应用:android 绘制虚线效果

有的时候我们需要一种虚线效果,比如图片的边框,愤怒的小鸟的飞翔路径,那么怎么绘制这些虚线呢?方法很多,目前我觉得好的有两种: 一、自己创建模式,一个点一个点的绘制。 二、用Android提供的 DashPathEffect 类来创建模式绘制。 下面我要演示的就是第二种方法,用Android提供给我的API来绘制。 由于是开发项目的一个小块,下面只能给出部分截图: 绘制虚线效果" titl

crissJs的专栏 753

Android虚线绘制,图形硬件加速

问题: 至于如何绘制虚线就不多说了,网上比比皆是,谈下这次开发碰到的问题: 1.从Android3.0开始,Android 2D的绘制流程就设计为能够更好地支持硬件加速。使用GPU的View在Canvas上进行画的操作时都会使用硬件加速。但是这样当我们定义shape绘制虚线时候,会发现绘制的并不是虚线而是一条实现。 当时搜了下解决办法,毫不犹豫直接在application属性上标记 问

runninghui的专栏 2652

Android中绘制虚线

利用shape绘制虚线 真机调试时可能会出现虚线变实线的现象 在manifest文件对应的activity节点中设置 android:hardwareAccelerated="false" 即可 xml version="1.0" encoding="utf-8"?> shape xmlns:android="http://schemas.android.

liangfeng093的博客 329

android自定义虚线,Android自定义view的方式绘制虚线

Android自定义view绘制虚线最近项目中有个需求,通过自定义view的方式绘制虚线别的不多说先看一眼效果这个需求在我们的开发中应该是一个很常见的需求了吧,有人会说有更简单的实现方式,对,但是你试过么,比如网上提到的这种方式代码如下这里写图片描述看样子好像已经成功了,最后在把这个作为background加进去,结果在真机上跑一圈,发现显示的竟然是一条实线,在好几台手机上试都是这样,都是一条实线...

weixin_31421601的博客 982

android canvas_Android自定义View之绘制虚线

开发中遇到需要画虚线,我们首先就会想到ShapeDrawable,在布局中加一个View,并给它添加一个虚线背景,是挺简单的。 android:shape="line"> android:dashGap="4dp" android:dashWidth="8dp" android:width="1dp" a...

weixin_39622399的博客 586
上一篇: Android 多渠道打包方案问题记录及解决方案
下一篇: Android Dex 64k Method Size Limit
linroidh
博客等级 码龄16年 15粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值