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的更多相关文章

  1. Android 自定义View修炼-打造完美的自定义侧滑菜单/侧滑View控件

    一.概述 在App中,经常会出现侧滑菜单,侧滑滑出View等效果,虽然说Android有很多第三方开源库,但是实际上 咱们可以自己也写一个自定义的侧滑View控件,其实不难,主要涉及到以下几个要点: ...

  2. C#微信公众号开发 -- (七)自定义菜单事件之VIEW及网页(OAuth2.0)授权

    通俗来讲VIEW其实就是我们在C#中常用的a标签,可以直接在自定义菜单URL的属性里面写上需要跳转的链接,也即为单纯的跳转. 但更多的情况下,我们是想通过VIEW来进入指定的页面并进行操作. 举一个简 ...

  3. 实用控件分享:自定义逼真相机光圈View

    最近手机界开始流行双摄像头,大光圈功能也应用而生.所谓大光圈功能就是能够对照片进行后期重新对焦,其实现的原理主要是对拍照期间获取的深度图片与对焦无穷远的图像通过算法来实现重新对焦的效果. 在某双摄手机 ...

  4. 自定义加载loading view动画组件的使用。

    在github上找的一个有点酷炫的loading动画https://github.com/Fichardu/CircleProgress 我写写使用步骤 自定义view(CircleProgress  ...

  5. android 自定义ViewGroup和对view进行切图动画实现滑动菜单SlidingMenu

    示意图就不展示了,和上一节的一样,滑动菜单SlidingMenu效果如何大家都比较熟悉,在这里我简单说明一下用自定义ViewGroup来实现. 实现方法:我们自定义一个ViewGroup实现左右滑动, ...

  6. 自定义视图(继承View)

    前言 Android提供了丰富的控件,但是有时候还是不能满足自己的需求,这时候就需要自定义视图了,自定义视图分为几种,一种为继承为View的,一种为继承于ViewGroup的.继承于View的需要我们 ...

  7. ActionBar官方教程(7)自定义操作项的view,如何得到它及处理它的事件

    Adding an Action View An action view is a widget that appears in the action bar as a substitute for ...

  8. android 自定义ViewGroup和对view进行切图动画实现滑动菜单SlidingMenu[转]

    http://blog.csdn.net/jj120522/article/details/8095852 示意图就不展示了,和上一节的一样,滑动菜单SlidingMenu效果如何大家都比较熟悉,在这 ...

  9. android自定义View_3——Optimizing the View

    前言:现在你已经有了一个自定义的view了,并且支持手势和过度动画等属性,现在你要确认这个view 有够快的速度,为了使其在UI上不会显得迟钝或是卡停,你要保证view动画,能每秒最好有60帧. 一: ...

随机推荐

  1. LINQ基础(三)

    一.并行LINQ System.Linq名称空间中包含的类ParallelEnumerable可以分解查询的工作,使其分布在多个线程上. 尽管Enumerable类给IEnumerable<T& ...

  2. Windows 修改电脑属性(一)

    修改电脑属性里的注册信息 修改电脑属性的注册信息 运行注册表的方法:开始→运行→regedit→确定 1.CPU型号可以注册表编辑器中定位到下面的位置: HKEY_LOCAL_MACHINE\HARD ...

  3. 简单vue项目脚手架(vue+webpack2.0+vuex+vue-router)

    github地址 使用技术栈 webpack(^2.6.1) webpack-dev-server(^2.4.5) vue(^2.3.3) vuex(^2.3.1) vue-router(^2.5.3 ...

  4. 浅析DES与AES、RSA三种典型加密算法的比较

    DES与AES的比较 自DES 算法公诸于世以来,学术界围绕它的安全性等方面进行了研究并展开了激烈的争论.在技术上,对DES的批评主要集中在以下几个方面: 1.作为分组密码,DES 的加密单位仅有64 ...

  5. 渗透测试工具Nmap从初级到高级

    Nmap是一款网络扫描和主机检测的非常有用的工具. Nmap是不局限于仅仅收集信息和枚举,同时可以用来作为一个漏洞探测器或安全扫描器.它可以适用于winodws,linux,mac等操作系统.Nmap ...

  6. 安装python2.7

    系统的yum程序使用的是python2.6,不能够卸载系统所带的python环境.python2.7的安装命令如下 tar vjxf Python-2.7.1.tar.bz2 cd Python-2. ...

  7. .NET 随记

    1. goto 常用于 switch语句中2. 字符串相加用 StringBuilder的Append()方法性能好3. str.Trim(',') 清除字符串后的","4. st ...

  8. RMAN备份与恢复(二)--常用操作学习

    (1)连接目标数据库 在RMAN中可以建立与目标数据库或恢复目录数据库的连接.与目标数据库连接时,用户须具有sysdba系统权限,以保证可以进行数据库的备份.修复与恢复工作. 可以在操作系统命令提示符 ...

  9. 浅谈js中的正则表达式

    很多时候多会被正则表达式搞的晕头转向,最近抽出时间对正则表达式进行了系统的学习,整理如下: 正则表达式的创建 两种方法,一种是直接写,由包含在斜杠之间的模式组成:另一种是调用RegExp对象的构造函数 ...

  10. Haoop MapReduce 的Partition和reduce端的二次排序

    先贴一张原理图(摘自hadoop权威指南第三版) 实际中看了半天还是不太理解其中的Partition,和reduce端的二次排序,最终根据实验来结果来验证自己的理解 1eg 数据如下 20140101 ...