網站首頁 編程語言 正文
效果圖
在安卓中多種類型的動畫,有幀動畫、補間動畫、屬性動畫,除此之外,使用自定義的View結合數學公式,就可以繪制出復雜的界面或者動畫。這篇文章記錄的是仿照黑客帝國的數字雨,來看看效果吧。
實現步驟
準備工作,常量的配置信息
// 文字的顏色值 final int DEFAULT_TEXT_COLOR = Color.argb(255, 0, 255, 70); // 文字大小 final int TEXT_SIZE = 24; // 普通畫筆 Paint mPaint; // 高亮畫筆 Paint mPaintLight; // 改變文字的間隔時間 int switchInternal = interval[random.nextInt(interval.length)]; // 數字落下的速度 int speed;
構建顯示文本的內容,因為計算機都是由0和1組成,所以這里用0和1代表它的內容數據。
// 構建0和1的字符串 if (contentArray == null) { contentArray = new String[2]; contentArray[0] = "0"; contentArray[1] = "1"; }
由于是隨機顯示,所以使用隨機數獲取內容
private String getChar() { return contentArray[random.nextInt(2)]; }
由于是自定義View,所以入口就在自定義View的構造函數中。
public NumberView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); }
在init方法中對上面的配置信息進行初始化,比如創建具體的畫筆顏色,文字大小等
private void init() { mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mPaint.setARGB(255, 0, 255, 70); mPaint.setTextSize(TEXT_SIZE); a = textColor >> 24 & 0xff; r = textColor >> 16 & 0xff; g = textColor >> 8 & 0xff; b = textColor & 0xff; mPaint.setARGB(a, r, g, b); mPaintLight = new Paint(Paint.ANTI_ALIAS_FLAG); mPaintLight.setARGB(255, 140, 255, 170); mPaintLight.setTextSize(TEXT_SIZE); }
在onMeasure方法中測量View的大小,View本身大小多少,這由onMeasure()決定的。
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int widthSize = MeasureSpec.getSize(widthMeasureSpec); int widthMode = MeasureSpec.getMode(widthMeasureSpec); int heightSize = MeasureSpec.getSize(heightMeasureSpec); int heightMode = MeasureSpec.getMode(heightMeasureSpec); if (widthMode == MeasureSpec.EXACTLY) { mWidth = widthSize; } if (heightMode == MeasureSpec.EXACTLY) { mHeight = heightSize; } setMeasuredDimension((int) mWidth, (int) mHeight); }
onDraw()定義了如何繪制這個View,所以在onDraw方法中,必須要進行繪制操作,這樣才能顯示出來動畫。
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); render(canvas); rain(); } private void rain() { for (int j = 0; j < streams.length; j++) { Symbol[] symbols = (Symbol[]) streams[j]; for (int i = 0; i < symbols.length; i++) { Symbol symbol = symbols[i]; symbol.y = symbol.y >= mHeight ? 0 : symbol.y + symbol.speed; } } }
無論是怎樣的操作,自定義View總是離不開onMeasure onLayout onDraw的核心方法。比如我們要繪制一幅畫,也需要這樣設計,它的大小、位置、和繪制成什么樣。就像這些代碼的方法。 onMeasure:決定視圖的大小 onLayout:決定視圖的位置 onDraw:絕對如何畫視圖 本文章心血來潮想到了黑客帝國的動畫,就在github上參考了這個項目,參考的代碼在傳送門,致敬。
總結
原文鏈接:https://juejin.cn/post/7063251314058199053
相關推薦
- 2022-11-11 Navicat?Premium自定義?sql?標簽的創建方式_數據庫其它
- 2022-08-04 Python使用RPC例子_python
- 2022-05-08 一起來練習C++的指針_C 語言
- 2022-05-05 Python實現蟻群算法_python
- 2023-04-08 C語言字符串左旋的兩種實現方法_C 語言
- 2022-06-01 解決IIS不識別PUT和DELETE請求_win服務器
- 2023-05-10 Python中的SOLID原則實例詳解_python
- 2022-04-07 C++?string與int的相互轉換(使用C++11)_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支