位置: 编程技术 - 正文
推荐整理分享Android自定义带消息提醒控件(android 自定义),希望有所帮助,仅作参考,欢迎阅读内容。
文章相关热门搜索词:android自定义loading,Android自定义带标题的cardview,android自定义样式,android 自定义drawable,android 自定义,android自定义样式,android 自定义style,android 自定义,内容如对您有帮助,希望把文章链接给更多的朋友!
相信大家都玩过各类社交软件,当有消息提示的时候会有消息提醒以便用户通知用户有消息了
安卓里面能实现这种效果有2种方式
1 可以用个framelayout来控制位置
2 写个自定义View来专门为这个需求服务(今天要讲的重点)
3 网上专门有一个BadgeView来做这事情(这东西我看了一下源码,大概思路就是 该控件继承了TextView,经过各种处理之后把要设置的view的父layout改成了FrameLayout,,其实是跟第一点思路有点类的,但是这有一个问题,当你原来的父控件是相对布局也就是RelaviteLayout的时候 用这个控件就6了 位置全乱了,欢迎尝试,这东西百度一下整页都是 小弟就不放链接了昂)
小弟文采有限就不bb太多了
直接开始吧
分大概x个步骤
1 自定义属性(没自定义属性还叫自定义View??)
2 测量该控件的宽高
3 测量控件里头图片的大小,位置
4 测量消息提醒的圆或者其他奇形怪状的消息提醒x形状的位置
5 测量消息提醒字体的位置
嗯 x=5;
首先自定义View肯定有自定义属性,不然就没了哈
属性如下:
res-values-attr.xml里头
badge means 标签属性就不介绍了 见名思意
然后通过布局文件设置该属性:
记得要在命名空间加上 xmlns:custom=" (直接复制自动生成的 改一下就好了 最后的是你的项目的包名)然后通过代码取得设置的属性:
先声明全局变量:
构造方法里面:
initTextPaint()方法就是初始化字体画笔:初始化完成以后,开始测量该view的宽高的,重写onMeasure(int widthMeasureSpec, int heightMeasureSpec) 方法:代码解释:首先获得模式跟(系统默认)
如果模式是 MeasureSpec.EXACTLY 那么也就是说你已经设置了Layout_width,height为准确的数或者是match_parent 否则 则按照bitmap的大小作为该view的大小最后把你测量好的设上去 setMeasuredDimension(width, height);
测量好View的宽高之后顺便把bitmap也测量了:
代码解释: 获得宽高最短的一边作为标准:如果bitmap宽大于控件的宽 或者 高大于控件的高 则直接按照控件最小的边做缩放这么一来我们的bitmap宽高也设置好了(默认或者按照以上做缩放)
好了就画出来呗 对吧 ^_^
咋画? 重写onDraw(Canvas canvas)方法呗
我们先把目光放在drawBitmap(Canvas canvas)方法上,很简单:虽然简单 也解释一下吧。。首先测量该bitmap要画在哪个位置 (刚刚的是测量大小哦 现在才是画到View里面去哦)
首先测量该bitmap到底要画在什么位置(我这里是居中), 所以要测量出左边相当于控件来说是什么位置 上边相对于控件来说是什么位置 因为我们刚刚已经测量了bitmap的宽高 所以下边右边就直接按照bitmap的高 宽来确定了
如果要居中 左边当然就是: 控件的宽/2-bitmap的宽/2 (不懂的拿笔拿纸算一下,数学分表示这点数学题完全没难度,)
那么上边呢? 如法炮制,控件的高/2-bitmap的高/2 (同上)
最后用canvas.drawBItmap(Bitmap src,int left,int top,Paint paint)画出位图,至于最后一个为什么是Null? 小弟学艺不精 只知道null也能画出bitmap就对了^_^
好了 这么一来图片总算画好了
然后再来画我们的标记, 标记这个东西嘛。。我这里是一个红色圆 其他的形状思路也是一样的,先来讲讲思路吧
Q1 这个圆的面积是多大(重点 直接影响体验)
Q2 这个圆是啥颜色 (easy 上面不是有个标记画笔么)
Q3 这个圆在什么位置(重点 算一下就好了)
那么下面我们一个一个来解决:
A1:
圆的面积=x; x=piR平方对吧 Java已经提供了Pi 我们只要算r=多少就ok了。
好几种写法 可以写死 比如圆是整个面积的分1 8分1什么的 我一开始也是这样写的 看着还可以 但是这写法嘛 好像不太灵活 万一大小不喜欢还tm要去改源码?不干,果断不干。 所以我在自定义属性的xml里加了一个badgeRadio属性 也就是可以自己动态设置面积 其实也就是半径拉 那么这个半径如何算呢,这里以圆的面积是位图总面积的%为例:
其中badgeRadio=0.3totalArea 总面积=位图的总面积 正方形的面积不用说了吧。。w * h半径: 公式:pi*r²=位图w*h*0.3 那么r²=w*h*0.3/pi 那么r=开根号前者
r就出来了 r出来了就tm好办了 直接画圆就好了
等等 这圆该画在什么位置。。。。
嗯对 下面就来解决这个问题
在自定义属性里面我们看到了一个bradePosition来设置圆到底在哪 分别是中间 左上 左中 左下,右上,右中,右下,顶中,底中,那么我们就来算这些位置
获得半径 判断位置 画出来 圆的位置一旦出来了 字体的位置自然也就出来了 在圆的中间嘛 算法跟刚的位图一样的那么这个自定义view貌就已经全部出来了亲,图 标记 标记里面的字体 都出来了。下面就向外公布一些方法能设置所需属性就ok了 就不贴出来了
不过这里有一个 setPosition的时候 你总不能要人家setPosition(1),setPosition(2)这样吧 知道代表啥阿,所以我这里写了个枚举来表达 更直观一些
没啥难点 枚举的赋 百度一下成吨
效果图
源码传送门
版权声明:本文为博主原创文章,未经博主允许不得转载。
安卓SDK文件目录 1.add-ons附加组件,存放关于google附加的API,如googlemap、effects2.build-tools构建工具,包含了重要的编译工具,比如aapt打包工具、aidlandroid内部进程通信接口
[安卓]新闻客户端(一)Splash 这里主要是一个图片实现的动画,并且需要有一个SharedPreferences,并抽成一个工具,来判断是否第一次进入,第一次进入先进入引导页再进入主页布局Rel
[安卓]新闻客户端(二)引导页 引导页是第一次进APP才有的,他的效果是左右滑动几张图片,展现一些功能之类的,最后一张图片应该有个button,点击后计入主页面,同时在页面下部
标签: android 自定义
本文链接地址:https://www.jiuchutong.com/biancheng/370889.html 转载请保留说明!友情链接: 武汉网站建设