自定义七天签到View
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的思路就好 我表示很痛苦 大家有哪里不懂得 欢迎来问我 妹子更欢迎 哈哈哈
喜欢的给个喜欢呗 帅哥~~~
自定义七天签到View的更多相关文章
- Android 自定义View修炼-打造完美的自定义侧滑菜单/侧滑View控件
一.概述 在App中,经常会出现侧滑菜单,侧滑滑出View等效果,虽然说Android有很多第三方开源库,但是实际上 咱们可以自己也写一个自定义的侧滑View控件,其实不难,主要涉及到以下几个要点: ...
- C#微信公众号开发 -- (七)自定义菜单事件之VIEW及网页(OAuth2.0)授权
通俗来讲VIEW其实就是我们在C#中常用的a标签,可以直接在自定义菜单URL的属性里面写上需要跳转的链接,也即为单纯的跳转. 但更多的情况下,我们是想通过VIEW来进入指定的页面并进行操作. 举一个简 ...
- 实用控件分享:自定义逼真相机光圈View
最近手机界开始流行双摄像头,大光圈功能也应用而生.所谓大光圈功能就是能够对照片进行后期重新对焦,其实现的原理主要是对拍照期间获取的深度图片与对焦无穷远的图像通过算法来实现重新对焦的效果. 在某双摄手机 ...
- 自定义加载loading view动画组件的使用。
在github上找的一个有点酷炫的loading动画https://github.com/Fichardu/CircleProgress 我写写使用步骤 自定义view(CircleProgress ...
- android 自定义ViewGroup和对view进行切图动画实现滑动菜单SlidingMenu
示意图就不展示了,和上一节的一样,滑动菜单SlidingMenu效果如何大家都比较熟悉,在这里我简单说明一下用自定义ViewGroup来实现. 实现方法:我们自定义一个ViewGroup实现左右滑动, ...
- 自定义视图(继承View)
前言 Android提供了丰富的控件,但是有时候还是不能满足自己的需求,这时候就需要自定义视图了,自定义视图分为几种,一种为继承为View的,一种为继承于ViewGroup的.继承于View的需要我们 ...
- ActionBar官方教程(7)自定义操作项的view,如何得到它及处理它的事件
Adding an Action View An action view is a widget that appears in the action bar as a substitute for ...
- android 自定义ViewGroup和对view进行切图动画实现滑动菜单SlidingMenu[转]
http://blog.csdn.net/jj120522/article/details/8095852 示意图就不展示了,和上一节的一样,滑动菜单SlidingMenu效果如何大家都比较熟悉,在这 ...
- android自定义View_3——Optimizing the View
前言:现在你已经有了一个自定义的view了,并且支持手势和过度动画等属性,现在你要确认这个view 有够快的速度,为了使其在UI上不会显得迟钝或是卡停,你要保证view动画,能每秒最好有60帧. 一: ...
随机推荐
- python_day5--->递归函数,二分法查找
li = [1, 5, 6, 7, 12, 22, 33, 44, 55, 66, 77, 88, 99, 111, 222, 333]def er(num,li): if len(li) ==0: ...
- Thinkphp5使用阿里大于短信验证
现在各种平台登录验证很多时候会使用短信验证,快捷安全,有很多平台提供短信验证服务,相比较而言阿里大于价格比较便宜,快捷,所以在在千锋日常的php教学中多以此为例来说明短信验证的使用.下面我们在tp5中 ...
- Tips_of_JS 之 利用JS实现水仙花数的寻找与实现斐波那契数列
一.水仙花数 1.啥是水仙花数? 水仙花数是指一个 n 位正整数 ( n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身.(例如:1^3 + 5^3+ 3^3 = 153) 2.利用JS实现对水 ...
- JavaSE教程-03深入探究原码,反码,补码-扩展
1.原码,反码,补码的基础概念和计算方法 在搞清楚为什么计算机要使用补码之前,我们先搞清楚一个基本知识点,就是原码,反码,补码的计算方式. 对于一个数,计算机要使用一定的编码方式进行存储,原码,反码, ...
- python爬虫从入门到放弃(八)之 Selenium库的使用
一.什么是Selenium selenium 是一套完整的web应用程序测试系统,包含了测试的录制(selenium IDE),编写及运行(Selenium Remote Control)和测试的并行 ...
- Python3实现简单的http server
前端的开发的html给我们的时候,由于内部有一些ajax请求的.json的数据,需要在一个web server中查看,每次放到http服务器太麻烦.还是直接用python造一个最方便. 最简单的,直接 ...
- 禅道---Bug管理模块
禅道官网:http://www.cnezsoft.com/ 简介: 开源免费的项目管理软件.集产品管理.项目管理.测试管理一体以及事物管理组织管理的功能 使用原因: 开源 方便跟踪管理Bug 使用简单 ...
- Spring学习(8)--- @Autowired注解(一)
可以将@Autowired注解为“传统”的setter方法 package com.mypackage; import org.springframework.beans.factory.annota ...
- Mybatis中javaType和jdbcType对应和CRUD例子
JDBC Type Java Type CHAR String VARCHAR String LONGVARCHAR String NUMERIC java.math.BigDecimal DECIM ...
- MVC在VIEW中动态控制htmlAttributes的方法
@{ IDictionary<string, object> dic = new Dictionary<string, object>(); dic.Add("cla ...