Android群英傳筆記系列二view的繪製(一)

来源:http://www.cnblogs.com/xy95/archive/2016/10/31/6016051.html
-Advertisement-
Play Games

b.定義兩個畫筆,並對畫筆進行初始化內容: c.重寫onDraw函數:這裡要註意下save函數和restore函數之間的區別,前者是保存畫布的狀態,然後經過onDraw函數後,會對畫布進行一些操作,比如旋轉之類,這裡是添加文字,而後者是對操作後的畫布進行保存。 d.在佈局中引用自定義textview ...


 .view的繪製
1.  使用方法:通過繼承view並重寫它的onDraw()方法來完成繪圖。
2.  具體實現:
a.先定義一個Canvas對象,這個對象類似於一個花板,定義方法如下:Canvas canvas=new Canvas(bitmap);
b.我們可以看到在定義Canvas對象時,我們傳入了一個bitmap對象,那麼這個bitmap的作用是什麼呢?其實bitmap的作用是存儲所有繪製在Canvas上的像素信息。比如:
canvas.drawBitmap(bitmap1,0,0,null);
canvas.drawBitmap(bitmap2,0,0,null);
Canvas mCanvas=new Canvas(bitmap2);
mCanvas.drawXXX();
上面這段代碼的含義是,將bitmap2,裝載到另一個Canvas對象中,然後在其他地方使用Canvas對象對裝載bitmap2的Canvas對象進行繪圖。
c.實際上我們繪圖,並不是直接繪製在onDraw()方法指定的那塊布上,而是通過改變bitmap,然後讓view重繪,從而顯示改變之後的bitmap。
3.自定義view的常用函數:
onFinishInflate():從xml載入組件後回調
onSizeChanged():組件大小改變時回調
onMeasure():回調該方法來進行測量
onLayout():回調該方法來確定顯示的位置
onTouchEvent();監聽到觸摸事件時回調
4.常見的實現自定義控制項的方法:
a.  對現有控制項進行擴展
b.  通過組合來實現新的控制項
c.  重寫view來實現全新的控制項
5.對現有控制項進行擴展:擴展textview,對textview加入多重顏色背景;
a.  定義一個類繼承至TextView,並添加其構造函數:要註意的一點就是,添加構造函數時,一定要添加到含有Attributset參數的的構造函數,否則程式會報錯,因為Attributset參數的作用是:外部通過它來獲取到自定義view的屬性。
public class DrawTextView extends TextView{
    public DrawTextView(Context context) {
        super(context); 
    }
    public DrawTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
}

b.定義兩個畫筆,並對畫筆進行初始化內容:

private Paint mPaint1,mPaint2;
//初始化畫筆內容:顏色和風格
mPaint1=new Paint();
mPaint2=new Paint();
mPaint1.setColor(getResources().getColor(R.color.colorPrimary));
mPaint1.setStyle(Paint.Style.FILL);
mPaint2.setColor(getResources().getColor(R.color.colorAccent));
mPaint2.setStyle(Paint.Style.FILL);

c.重寫onDraw函數:這裡要註意下save函數和restore函數之間的區別,前者是保存畫布的狀態,然後經過onDraw函數後,會對畫布進行一些操作,比如旋轉之類,這裡是添加文字,而後者是對操作後的畫布進行保存。

protected void onDraw(Canvas canvas) {
    //繪製內矩陣
    canvas.drawRect(0,0,getMeasuredWidth(),getMeasuredHeight(),mPaint1);
    //繪製外矩陣
    canvas.drawRect(10,10,getMeasuredWidth()-10,getMeasuredHeight()-10,mPaint2);
    //保存畫布的狀態
    canvas.save();
    //添加文字
    super.onDraw(canvas);
    //保存畫布被操作後的狀態
    canvas.restore();
}

d.在佈局中引用自定義textview:

<main.view.com.drawmyview.DrawTextView
    android:layout_width="200dp"
    android:layout_height="50dp"
    android:textSize="20sp"
    android:gravity="center"
    android:text="@string/mytextview"/>

e.實現效果:

3.實現textview文字閃爍:

a.實現效果:

b.實現原理:使用Android中Paint對象的Shander渲染器,通過設置一個不斷變化的LinearGradient,並使用帶有該屬性的Paint對象來繪製要顯示的文字。

c.具體實現過程:

(1) 在onSizeChanged()方法中進行一些對象的初始化,並根據view的寬頻設置一個LinearGradient漸變渲染器:

protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);
    if (mViewWidth==0){//一開始初始化為0了,所以會進入這個if判斷語句
        mViewWidth=getMeasuredWidth();//獲取到當前寬度
        if (mViewWidth>0){
            mPaint=getPaint();//獲取當前繪製textview的Paint對象
            /*
            * 設置一個LinearGradient漸變器渲染器
            * 第一二個參數是設置漸變的起點,這裡設置的是矩形的左上角為起點
            * 第三四個參數為設置漸變的終點,這裡設置的是矩陣的右上角為終點
            * 第五個參數為一個int數組,表示漸變的顏色,這裡選擇的是藍-白-藍
            * 第六個參數為設置梯度顏色變化,設置方法為new float[]{0.25f,0.5f,0.75f},
            * 如果設置為空,表示顏色均勻分佈,但一定要註意的是要保證顏色數組和位置數組大小一樣
            * 第七個參數為平鋪方式,CLMP為重覆最後一個顏色至最後,其他的兩個自己體驗一下
            * */
            mLinearGradient=new LinearGradient(0,0,mViewWidth,0,new int[]{Color.BLUE,Color.WHITE,Color.BLUE}
                    ,new float[]{0.25f,0.5f,0.75f}, Shader.TileMode.CLAMP);
        //給paint對象添加渲染器
            mPaint.setShader(mLinearGradient);
            mGradientMatrix=new Matrix();
        }
    }

(2) 緊接著我們在onDraw()函數中,通過矩陣的方式來不斷平移漸變效果,從而在繪製文字時,產生動態的閃動效果:

protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    if (mGradientMatrix!=null){
        //設置矩陣的移動距離
        mTranslate+=mViewWidth/5;
        //移動到末尾後,將回到最初的位置,重新移動
        if (mTranslate>2*mViewWidth){
            mTranslate=-mViewWidth;
        }
        //設置矩陣的移動
        mGradientMatrix.setTranslate(mTranslate,0);
        //給矩陣添加渲染器
        mLinearGradient.setLocalMatrix(mGradientMatrix);
        //延遲100ms
        postInvalidateDelayed(100);
    }
}

最後在xml佈局文件中引用:

<main.view.com.drawmyview.MyTextView
    android:layout_marginTop="20dp"
    android:text="@string/textview2"
    android:textSize="30sp"
    android:layout_gravity="center"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

 

 

 

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

-Advertisement-
Play Games
更多相關文章
  • 白天在做SDK23版本的適配,遇到了不少坑,現在抽空記下來,以此為戒。 首先要知道哪些坑,就得先瞭解一些定義和基本使用方式。 那麼先介紹一下動態申請的許可權分組情況。 下麵的許可權組是由谷歌官方定義的,目的是在申請許可權時,只要用戶允許同一許可權組的任意一條許可權,那麼該組的其他許可權也就預設是允許的。不過據高 ...
  • 命令行1、啟動SDK Manager: android2、啟動DDMS:dams3、獲取當前運行的所有模擬器:adb devices4、安裝應用程式:adb install -r 應用程式.apk 卸載應用程式:adb uninstall 應用程式包名5、獲取模擬器中的文件:adb pull <re ...
  • 上一篇文章我對GCD的幾個基本概念做了介紹,但是大家看完了可能覺得對理解GCD並沒有什麼卵用。其實會用GCD其實很簡單,只要記住兩條就可以了。 1. 主隊列里的任務必須在非同步函數中執行。 主隊列里的任務如果在同步函數中執行,就會造成死鎖。什麼是死鎖?容我舉例來說明。 看到沒有,主隊列里的任務沒有執行 ...
  • ↓↓圓形進度條(源代碼下有屬性解釋)↓↓ 一、shape 樣式:(在drawable新建--》new--》Drawable resource file 並把原父級標簽selector改為shape ) ↑↑↑↑圓形進度條↑↑↑↑↑ ↓↓↓android:shape屬性指定形狀↓↓↓ rectangl ...
  • 轉載請標明出處:http://www.cnblogs.com/zhaoyanjun/p/6016341.html 本文出自 "【趙彥軍的博客】" 前言 ButterKnife 簡介 ButterKnife是一個專註於Android系統的View註入框架,可以減少大量的findViewById以及se ...
  • 因為是window電腦上運行的,所以測試的是安卓 1: 安裝jdk:jdk-8u45-windows-x64.exe 2: 配置JAVA的環境變數 在安卓的配置基礎上添加一個變數ANDROID_HOME,見圖 由於我電腦上本來就擁有安卓環境,所以配置很容易 3:安卓nodejs開發環境 首先在Nod ...
  • 矩形或圓角類型(源代碼下有屬性解釋) 一、shape 樣式:(在drawable新建--》new--》Drawable resource file 並把原父級標簽selector改為shape ) 矩形或圓角類型 android:shape屬性指定形狀 rectangle: 矩形,預設的形狀,可以畫 ...
  • 解決辦法: hud.userInteractionEnabled= NO; 就是這麼簡單粗暴!這個問題 我一定要發到首頁候選區! /****************************************此處不用看,只是為了湊夠150字**************************** ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...