android自定义签到,自定义七天签到View

github传送车走你

https://github.com/guanhaoran/signin

因为这个View 是我很早之前写的,这些注释也是我今天刚想往github上传的时候 临时加的  有的注释可能不准确(毕竟写了好长时间了)  但是我敢保证92%是对的  很尴尬   大家看的时候   不要全部相信注释

首先这篇博客是为了让对自定义View不是很熟悉的同学借鉴之用,希望路过的各位大佬勿喷,先看下GIF省着枯燥

1049474-20170714165619775-1831419207.gif

首先这是一个纯手写的一个自定义View,包括动画也全在里边,代码不是很复杂,可以去github下载下来看一眼,就一个继承View的signin类

signin的4个属性方法

1) setSignInEvent(List 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) 这个方法

这个方法主要用于各个图形和动画的绘制路径,这里边才是最主要的 大家要自己看这个

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值