Android 绘制虚线

发布时间:2021-09-25 23:43:18

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


声明shape,其中dashGap是虚线的间隔宽度,dashWidth是实线的间隔宽度,stroke翻译过来是名词,画


android:shape="line" >
android:width="1dp"
android:dashGap="3dp"
android:dashWidth="3dp"
android:color="#ffececec" />



然后可以在layout文件中直接使用

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

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


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

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




android:left="-300dp"
android:right="-300dp">
android:drawable="@drawable/dash_line"
android:fromDegrees="90"
android:toDegrees="90"
android:visible="true" />



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


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建议并传下来的值


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的空白,依次重复。


相关文档

  • QQ说说女生超拽
  • 作物种植保险合同模板
  • 苹果电脑u盘新建文件夹
  • 手机进黑客怎么办
  • 表彰大会的讲话1000字
  • 最新高三下学期班主任工作总结范文
  • HTTP状态码及请求头
  • 2020湖南岳阳中考成绩查询网址:
  • 2018七夕节上映电影2018七夕情人节适合看什么电影
  • 我拥有,我快乐。
  • Android VSync信号产生过程源码分析
  • 1.7 界面原型设计
  • 小学美术绘画素材图片
  • mate30呼吸灯怎么设置
  • 旅行社的宣传广告词大全
  • 分手的说说大全48句
  • 绽放青春放飞梦想演讲稿范文
  • 表亲关系证明范文
  • 生产部门承包经营合同范本
  • 秋季小学第二周国旗下讲话稿
  • js校验只能为正整数
  • 堆优化的Dijkstra
  • 肥牛炒菜的做法
  • 关于陶泥的作文
  • 如何正确吹风扇
  • 高三家长会班主任发言材料
  • 校长教学质量上的讲话
  • Flume之flume-ng
  • java关键字Serializable的使用
  • 颜真卿与柳公权的楷书有什么区别
  • 猜你喜欢

  • 【精品文档】初一寒假日记300字_听音乐-精选word文档 (1页)
  • 关于债务人借钱不还的法律问题
  • 浅议当前基层消防部队体能训练存在的问题
  • 潍坊圣荣电声科技有限公司(企业信用报告)- 天眼查
  • 放飞梦想展翅翱翔的散文
  • 火焰切割机项目工作总结汇报
  • 20XX年经典猴年祝福语
  • 康熙字典六画的字
  • 英德市锦源农牧产品发展有限公司望埠养殖场企业信用报告-天眼查
  • 国家秘书资格考试模拟试卷:选择题(有答案)
  • 2013年江苏省宿迁市剑桥国际学校高二数学教案3.2《古典概型》(苏教版必修3)
  • 2019年最新供电公司年度个人总结范文工作总结文档【五篇】
  • 人教版七年级下册数学同步导学案:7.1.2直角平面坐标系第二课时
  • 当前我国经济形势及热点问题(厉以宁)
  • 大班环保垃圾分类说课稿范文
  • 2014西藏自治区事业单位考试公共基础最新考试试题库
  • 现代教学论在钢琴教学改革中的运用
  • 格言名句成语典故蕴含的哲学道理
  • 2014-2019年中国氨基酸注射液医院用药市场研究报告
  • 广州版小学二年级下册美术教案汇总
  • 美国留学必带哪些行李呢
  • 北京市海淀区2010年中考一模化学试卷及答案
  • 《射频通信电路》 第七章 射频放大电路
  • 九年级语文上册第四单元十四小说家谈小说*题课件苏教.ppt..
  • 黑马程序员c语言学习---第一个程序
  • 二年级下册数学优质课件-第8单元第2课时 解决问题 人教新课标版
  • IDEA上传项目到gitee前的准备及详细过程
  • 学习专业理念与师德的心得体会
  • 小学数学人教2011课标版二年级用竖式计算有余数除法教学设计 (2)
  • 我国污染土壤修复技术及产业现状_赵金艳
  • 公路管理段工作责任
  • 怀孕四个月胎盘低置怎么办,怀孕四个月胎盘低置怎么纠正,怀孕四个月胎盘低怎么做能恢复
  • 一个人心好累的伤感说说:表情可以掩饰,但难受不会说谎
  • 天津市高二语文寒假作业(10)
  • 千万别活成自己最讨厌的样子
  • 八年级地理下册西北地区和青藏地区复*资料
  • 2 磁盘文件管理
  • 中学生代表环保倡议书范文
  • 经典的秋天的诗句精选
  • 苏教版小学二年级数学下册期末计算题大全35
  • 组织政治知觉对知识型员工组织承诺的影响——基于组织公*感的效应分析
  • 安顺苏鑫装饰工程有限公司企业信用报告-天眼查
  • 电脑版