android canvas-ag凯发k8国际
ag凯发k8国际
收集整理的这篇文章主要介绍了
android canvas_android自定义view之绘制虚线
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
开发中遇到需要画虚线,我们首先就会想到shapedrawable,在布局中加一个view,并给它添加一个虚线背景,是挺简单的。
android:shape="line"> android:dashgap="4dp" android:dashwidth="8dp" android:width="1dp" android:color="#ffeaebf0" /> android:layout_width="match_parent" android:layout_height="2dp" android:layout_gravity="center_vertical" android:layertype="software" android:background="@drawable/shape_dash_line" />添加虚线背景,好理解,可是android:layertype="software"是干什么的?这是因为我们现在的手机默认都是开启了硬件加速的,而dashgap不支持硬件加速,我们需要把硬件加速关了就好了。使用shapedrawable实现虚线的方式虽然简单,但是简单就意味着不灵活。比如说要求虚线是根据用户操作来判断要不要添加的,要实现动态改变虚线的粗细和颜色等样式呢,不可能一个颜色写一个shapedrawable吧,这种情况下就不如使用canvas来实现方便了。我们都知道canvas只有drawline方法,没有画虚线的方法,但是我们可以用画笔paint的setpatheffect(patheffect effect)方法,patheffect一共有五个子类:composepatheffect, cornerpatheffect,dashpatheffect, discretepatheffect, pathdashpatheffect, sumpatheffect, 其中的dashpatheffect就是可以用来实现虚线效果的,但是通过查阅资料发现它有一个弊端:不支持硬件加速!好吧,那我们用drawpath来绘制路径吧。public class dashlineview extends view { private paint mpaint; private path mpath; //虚线颜色 private int backgroundcolor; //虚线粗细 private int strokewidth; //虚线宽度 private int dashwidth; //虚线隔断宽度 private int dashspacewidth; public dashlineview(context context) { super(context); initview(); } public dashlineview(context context, @nullable attributeset attrs) { super(context, attrs); obtainattributes(context, attrs); initview(); } public dashlineview(context context, @nullable attributeset attrs, int defstyleattr) { super(context, attrs, defstyleattr); obtainattributes(context, attrs); initview(); } private void obtainattributes(context context, attributeset attrs) { typedarray ta = context.obtainstyledattributes(attrs, r.styleable.dashlineview); backgroundcolor = ta.getcolor(r.styleable.dashlineview_pt_backgroundcolor, getresources().getcolor(r.color.line)); strokewidth = ta.getint(r.styleable.dashlineview_pt_strokewidth, screenutil.dip2px(context, 1)); dashwidth = ta.getint(r.styleable.dashlineview_pt_dashwidth, screenutil.dip2px(context, 4)); dashspacewidth = ta.getint(r.styleable.dashlineview_pt_dashspacewidth, screenutil.dip2px(context, 3)); ta.recycle(); } private void initview(){ //使用isineditmode解决可视化编辑器无法识别自定义控件的问题 if (isineditmode()) { return; } mpaint = new paint(paint.anti_alias_flag); // 需要加上这句,否则画不出东西 mpaint.setstyle(paint.style.stroke); mpath = new path(); } @override protected void onmeasure(int widthmeasurespec, int heightmeasurespec) { super.onmeasure(widthmeasurespec, heightmeasurespec); //自定义的view能够使用wrap_content或者是match_parent的属性 setmeasureddimension(getmeasuredwidth(), getmeasuredheight()); } @override protected void ondraw(canvas canvas) { mpaint.setcolor(backgroundcolor); mpaint.setstrokewidth(strokewidth); mpaint.setpatheffect(new dashpatheffect(new float[] { dashwidth, dashspacewidth }, 0)); int centery = getheight() / 2; mpath.reset(); mpath.moveto(0, centery); mpath.lineto(getwidth(), centery); canvas.drawpath(mpath, mpaint); } public void setdashlinecolor(int bgcolor) { this.backgroundcolor = getresources().getcolor(bgcolor); }}我这里只提供了setdashlinecolor方法动态设置虚线的颜色,大家可以根据需求自行添加方法。/** * 虚线颜色 * @param color */ public void setlineviewcolor(int color){ mdashlineview.setdashlinecolor(color); }attr.xml
screenutil.java
public static int dip2px(context context, float dpvalue) { final float scale = context.getresources().getdisplaymetrics().density; return (int) (dpvalue * scale 0.5f); }原理上还真的是比较简单的,公司项目用到,以作记录之用。以下是实现出的效果图到这里就结束啦。往期精彩回顾:android实现短信验证码自动填充功能
android仿echo精美弹幕功能
android实现头像重叠排列功能
android仿qq个性标签功能
android仿qq侧滑删除的功能
总结
以上是ag凯发k8国际为你收集整理的android canvas_android自定义view之绘制虚线的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇:
- 下一篇: access 导入 txt sql语句_