github传送车走你
https://github.com/guanhaoran/signin
因为这个View 是我很早之前写的,这些注释也是我今天刚想往github上传的时候 临时加的 有的注释可能不准确(毕竟写了好长时间了) 但是我敢保证92%是对的 很尴尬 大家看的时候 不要全部相信注释
首先这篇博客是为了让对自定义View不是很熟悉的同学借鉴之用,希望路过的各位大佬勿喷,先看下GIF省着枯燥
首先这是一个纯手写的一个自定义View,包括动画也全在里边,代码不是很复杂,可以去github下载下来看一眼,就一个继承View的signin类
signin的4个属性方法
1) setSignInEvent(List<String> data) //添加数据
2) setsignInEvent() //签到自动加一天 ---带动画效果
3)setCurrent(int i) //设置几天是第一天签到 如果是第一天 输入 1 以此类推
4)setSignInClear //清除签到天数
说一下主要实现方法
1-控件大小发生改变调用如下方法
viewpadding 是将写死的值 转换成控件的padding值
textMarginTop 是将默认写死的值转换成 第一天,第二天......第七天. 转换成距离六边形的margin值
signInBallRaio 是根据控件高度 生成六边形占据控件 的多少倍
signInRectHeight 在占据六边形的 基础上 在缩小多少倍 (其中的值 可以去代码中看)
signInBgRectF 是填充屏幕的一天黑色矩形线
剩下的 都是一些计算值 可以去代码中看
@Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); viewPadding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, DEF_PADDING, getResources().getDisplayMetrics()); int textMarginTop = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, TEXT_MARGIN_TOP, getResources().getDisplayMetrics()); viewWidth = w; viewHeight = h; signInBallRadio = (int) (viewHeight * SIGN_IN_BALL_SCALE / 2); signInRectHeight = (int) (signInBallRadio * SIGN_BG_RECT_SCALE); signInBgRectF = new RectF(0, viewHeight * SECTION_SCALE - signInBallRadio - signInRectHeight, viewWidth, viewHeight * SECTION_SCALE - signInBallRadio); circleY = (int) (signInBgRectF.top + signInRectHeight / 2); descY = (int) (viewHeight * SECTION_SCALE + textMarginTop); //计算各个点 图形的位置 calcucateCirclePoints(viewData); }
2-view的测量
测量主要就是注意一下MeasureSpec.getMode()的这个方法,大家不要忘记写了
具体用法可以百度一下 用法很简单 ,下面代码就属于很通用的一个代码
一定不要忘记还有个super,.onMeasure()这个方法
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int heightMode = MeasureSpec.getMode(heightMeasureSpec); int newHeight; //如果不是精准模式 就使用默认的高度 具体用法请百度 MeasureSpec.getMode() if (heightMode == MeasureSpec.AT_MOST || heightMode == MeasureSpec.UNSPECIFIED) { newHeight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, DEF_HEIGHT, getResources().getDisplayMetrics()); heightMeasureSpec = MeasureSpec.makeMeasureSpec(newHeight, MeasureSpec.EXACTLY); } super.onMeasure(widthMeasureSpec, heightMeasureSpec); }
3-一个字-画
具体的用法全部中文注释方便大家观察 这里就不详细介绍了 大家可以去代码里看看(就几行代码 嘻嘻~~~)
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); //签到横线 drawSignInBgRect(canvas); //black circle // drawSignInNormalCircle(canvas); //绘制正常的签到六边形 drawSignInNormalSexangle(canvas); //选择第几天之前的矩形 drawSignInPbRect(canvas); //绘制旧的矩形 drawSignInPbOldRect(canvas); //select circle // drawSignInCheck(canvas); //选择的六边形 drawSignInSexangle(canvas); //签到之前的六边形 drawSignOldSignInSexangle(canvas); //绘制文字 drawTextDesc(canvas); //绘制礼物图标 如果不用 可以注释掉 drawBitmap(canvas); }
礼物图标 部分方法块
//礼物图标 使用方法 可以百度一下 bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.img_signpage_gift); // bitmap = zoomImg(bitmap,CALCULATE_BITMAP_W_H,CALCULATE_BITMAP_W_H); srcBitmap = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
这个自定义签到的View 最主要的代码块是在 onSizeChanged() 中的 calcucateCirclePoints(viewData) 这个方法
这个方法主要用于各个图形和动画的绘制路径,这里边才是最主要的 大家要自己看这个
感觉自己写的乱遭的,初学view的同学不要向我学习,当时项目太紧 写完我也就没有整理 感觉很乱大家看一些自定义View的思路就好 我表示很痛苦 大家有哪里不懂得 欢迎来问我 妹子更欢迎 哈哈哈
喜欢的给个喜欢呗 帅哥~~~