• 自定义七天签到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的思路就好  我表示很痛苦  大家有哪里不懂得  欢迎来问我  妹子更欢迎  哈哈哈 

    喜欢的给个喜欢呗 帅哥~~~

  • 相关阅读:
    计算机网路基础
    [python基础] python 2与python 3之间的区别 —— 默认中文字符串长
    [python基础] 同时赋值多个变量与变量值交换
    [python基础] python 2与python 3的区别,一个关于对象的未知的坑
    [python基础] python 2与python 3之间的区别 —— 不同数据类型间的运算
    [python基础] 浮点数乘法的误差问题
    关于HTMLTestRunner的中断与实时性问题
    [python自动化] 关于python无法修改全局变量的问题
    关于RFC2544中的Cut-Through和Store-and-Forward模式
    google filament pbr
  • 原文地址:https://www.cnblogs.com/guanhaoran/p/7171530.html
Copyright © 2020-2023  润新知