自定義七天簽到View

来源:http://www.cnblogs.com/guanhaoran/archive/2017/07/14/7171530.html
-Advertisement-
Play Games

github傳送車走你 https://github.com/guanhaoran/signin 因為這個View 是我很早之前寫的,這些註釋也是我今天剛想往github上傳的時候 臨時加的 有的註釋可能不准確(畢竟寫了好長時間了) 但是我敢保證92%是對的 很尷尬 大家看的時候 不要全部相信註釋 ...


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的思路就好  我表示很痛苦  大家有哪裡不懂得  歡迎來問我  妹子更歡迎  哈哈哈 

喜歡的給個喜歡唄 帥哥~~~

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • js單線程 js是單線程的,這樣更有利與用戶交互以及DOM操作;有關進程與線程的詳細解釋可以點擊傳送門;儘管webworker可以實現多線程,但本質上他還屬於單線程,由webworker創建的線程都由主線程式控制制並且只能進行計算而已; js同步、非同步 同步執行:即js主線程按順序執行任務,如遇操作we ...
  • 今天,老爺機notebook開始卡了,我決定格盤重裝系統。 順便複習一下git本地命令的使用 1,配置 2先跳過一般的操作。介紹鏈接github遠程庫的操作 我的兩個鑰匙在C:\Users\bond\.ssh文件夾下,打開id_rsa.pub複製裡面所有內容,上github的ssh鑰匙設置頁面add ...
  • 螞蟻部落 提交進行中... ...
  • 從上個星期開始,耳朵就一直在生病,裡面長了個疙瘩,腫的一碰就疼,不能吃飯不能嗨 (┳_┳)……在此提醒各位小伙伴,最近天氣炎熱,一定要註意防暑上火,病來如山倒呀~ 接下來我正在喝著5塊一顆的藥學習canvas…… canvas(畫布)是html5新增的標簽元素,用來定義圖形,比如圖表和其他圖像。<c ...
  • 轉載註明來自: http://www.cnblogs.com/wujiancheng/ 一、正常情況下Activity的生命周期: Activity的生命周期大概可以歸為三部分 整個的生命周期:onCreate()可以設置所有的“全局”狀態, onDestory()可以釋放所有的資源 可見的生命周期 ...
  • 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ...
  • 轉載請標明出處:http://blog.csdn.net/zhaoyanjun6/article/details/62896784 本文出自 "【趙彥軍的博客】" Fiddler 裡面的斷點調試有2種方式。 一種用工具欄中的按鈕來設置斷點,特點是會攔截所有的請求。 一種用命令行的形式來設置斷點 , ...
  • 轉載請標明出處:http://blog.csdn.net/zhaoyanjun6/article/details/74439165 本文出自 "【趙彥軍的博客】" Fiddler 也可以支持對手機應用進行 http 抓包的 。 1、啟動Fiddler,打開菜單欄中的 Tools Fiddler Op ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...