1. 程式人生 > >Android TV Input Framework(Android TV 一)

Android TV Input Framework(Android TV 一)

前言

Android TV是Android 5.0新的內容,當前國內的智慧電視大部分都是基於Android系統的,Android TV作為事實上的標準,它的推出必將極大的影響下一代智慧電視的開發。

近兩年來一直在從事智慧電視的系統開發,也一直在關注這方面的技術,做過Android系統開發的兄弟們都知道,Android的應用開發文件很多,但是Google介紹Android系統方面尤其是Framework方面設計的文件很少,也許是那些工程師都很忙吧,很多都是我們國內開發人員閱讀完原始碼後寫的總結文章。

Android 5.0出來之後欣喜的發現,Android網站上介紹系統設計的技術文件越來越多了,其中就包括這篇Android TV的文章。可是也發現從國內登陸Android網站是越來越慢了,為了給自己一個記錄,同時也為了分享給大家,免得大家翻牆,我翻譯了這篇文章,Android TV的文章一共兩篇,這是第一篇。

匆匆而就,定有很多不足之處,忘大家多多拍磚指正。國內智慧電視行業的兄弟們也可多多切磋,Email:[email protected]

簡介

Android TV Input Framework (TIF)簡化了向Android TV提供實時內容的工作。Android TIF向電視製造商提供了一套標準的API,用於建立Input模組來控制Android電視。這套框架還能搜尋實時TV內容和一些推薦的內容。但是這套框架不會實現TV的各種標準和一些基於地域性的需求。

但是Android TIF能夠讓電視廠商更容易的滿足各地區的數字電視廣播標準,而不用重新定義架構。同時這份文件也能夠對Android TV

的三方應用開發者提供很多資訊。

組成部分

TIF包含一個TV Input Manager,同時還需要TV App一起工作,TV App是一個System層次的應用,可以訪問內建或者IPTV的頻道,這個應用不能被三方的應用替換。TV App通過TV Input Manager和電視廠商提供的TV Input模組或者是其他模組通訊。

TV Input Framework由下列部分組成:

  • TV Provider (com.android.providers.tv.TvProvider):一個包含頻道、節目和相關許可權的資料庫。
  • TV App (com.android.tv.TvActivity
    ):一個和使用者互動的系統應用。
  • TV Input Manager (android.media.tv.TvInputManager):一箇中間介面層,能夠讓TV InputsTV App進行通訊。
  • TV Input:可以看做是一個代表物理或者虛擬的電視接收器或者輸入埠的應用。InputTIF中可以看做是一個輸入源。
  • TV Input HAL (tv_input module):TV Input的硬體抽象層,可以讓系統的TV inputs訪問TV特有硬體。
  • Parental Control:兒童鎖,一種可以鎖住某些頻道和節目的技術。
  • HDMI-CEC:一種可以通過HDMI在多種裝置上進行遠端控制的技術。CEC(Consumer Electronics Control消費電子控制)

這些組成部分會在後面的章節中描述。下圖詳細描述了Android TV Input Framework的架構。

1. Android TV Input Framework (TIF)架構

流程

這裡介紹上圖的架構是如何執行的:

  1. 使用者通過TV App進行觀看和並且和TV互動,這是一個System級別的應用並且不能被三方應用替換。
  2. TV App顯示從TV Input獲取到的音訊和視訊內容。
  3. TV App必須通過TV Input ManagerTV Inputs進行通訊,而不能直接和其進行通訊,TV Input Manager會監控TV Inputs的狀態並且提供給TV App

許可權

  • 只有signatureOrSystemTV InputsTV App才具有訪問TV Provider資料庫的所有許可權,才能夠接收按鍵事件。
  • 只有sysgtem級別的TV Inputs才有許可權通過TV Input Manager service訪問TV Input HALTV Inputs可以通過TV Input Manager會話訪問其他的TV Inputs
  • 三方的TV Inputs訪問TV Provider資料庫中是受限的,只能訪問本應用對應的資料行。
  • 三方的TV Inputs可以顯示自己的內容,也可以顯示直通TV Inputs的內容,例如HDMI1等。他們不能顯示非直通的TV Inputs的內容,例如內建的或者IPTV的電視接收器的內容。
  • TV_INPUT_HARDWARE許可權用在基於硬體的TV Input應用中。在系統啟動的時候,這個許可權標誌TV Input Manager Service要通知TV Input ServiceTV Input Service來呼叫並在TV Input Manager Service註冊自己的TV Inputs。這個許可權同時允許一個硬體的TV Input應用在一個TV Input service中可以支援多個TV Inputs,可以動態的增加和刪除自己支援的TV Inputs

TV Provider

TV Provider資料庫儲存每個TV Inputs的頻道和節目資訊。TV Provider也管理和釋出資料庫相關記錄的許可權,這樣的話TV Inputs只能看到他們自己的記錄。例如,一個特定的TV Input只能看到自己提供的頻道和節目,而不能看到其他TV Inputs的頻道和節目。

TV Provider在內部把“broadcast genre(廣播分類)”對映到“canonical genre(Android TV 的統一分類)”。TV Inputs負責填入基於廣播電視標準的“broadcast genre”的值,然後“canonical genre“列就會填入從android.provider.TvContract.Genres中得到正確的值。例如,對於廣播電視標準ATSC A/65來說,節目分類0x25就是“Sports”,TV Input將會填入“broadcast genre”的字串“Sports”,然後TV Provider將會在“canonical genre“欄位填入相應的值android.provider.TvContract.Genres.SPORTS

因為廣播電視標準是多種多樣的,每個國家不同,Android TV通過這個對映將其統一起來,使用者在Android TV上看到的就是一樣的,而不會造成什麼迷惑。

下圖詳細的描述了TV Provider.

2. Android TV Provider

只有具有System許可權的應用才能讀取TV Provider資料庫中所有的資料。

直通的TV Inputs(例如HDMI)不會儲存頻道和節目資料。

除了頻道和節目這些標準的欄位外,TV Provider也提供一個BLOB型別的欄位,COLUMN_INTERNAL_PROVIDER_DATA,在任何一個表中TV Inputs可以儲存任意的資料。BLOB資料可以包含自定義資料,例如相對應的電視接收器的頻率,或者在某個廣播電視協議的緩衝,或者其他形式。也可以針對一個可搜尋的欄位,讓某些頻道不出現在搜尋中(例如為了滿足在某些特定的國家版權保護的需要)。

資料庫欄位示例

TV Provider在頻道(android.provider.TvContract.Channels)和節目 (android.provider.TvContract.Programs)表中支援結構化的資料。這些表可以被TV InputsSystem級別的應用(例如TV App)操作和訪問。這些表包含四種類型的欄位:

  1. 顯示:顯示的這些欄位包含那些用於向用戶顯示的資訊,例如頻道名字(COLUMN_DISPLAY_NAME)和數字(COLUMN_DISPLAY_NUMBER),或者瀏覽的節目的標題等。
  2. 元資料:根據相關的標準,有三個欄位用於標誌某項內容,例如頻道的傳輸流ID(COLUMN_TRANSPORT_STREAM_ID),原來的網路ID(COLUMN_ORIGINAL_NETWORK_ID)和服務ID(COLUMN_SERVICE_ID)
  3. 內部資料:一些儲存TV Inputs自定義資訊的欄位。例如COLUMN_INTERNAL_PROVIDER_DATA欄位,是一個自定義的BLOB的欄位,TV Input可以儲存關於頻道或者節目的任意的資料。
  4. 標誌:標誌相關的欄位用於描述一個頻道是否在搜尋、瀏覽、觀看時是否受限。這個可以設定在頻道的層次。所有的節目的設定可以服從所在頻道的設定。
    • COLUMN_SEARCHABLE:限制某些頻道是否可以在搜尋結果中列出。COLUMN_SEARCHABLE = 0表示這個頻道不能在搜尋結果中顯示。
    • COLUMN_BROWSABLE:這個介面只有system級別的應用可用。限制頻道是否可以被導航瀏覽。COLUMN_BROWSABLE = 0表示這個頻道不能出現在頻道列表中。
    • COLUMN_LOCKED:這個介面只有system級別的應用可用。用於需要輸入使用者名稱和密碼的頻道。COLUMN_LOCKED = 1表示頻道被兒童鎖保護。

想檢視全部的欄位列表,請查閱以下檔案

android/frameworks/base/media/java/android/media/tv/TvContract.java

許可權和訪問控制

對於有許可權訪問相應資料庫行的使用者,此行所有的欄位都是可見的。注意所有的欄位不能被使用者直接訪問,使用者只能看到TV App,系統應用或者TV Inputs的介面。

  • 每一行有PACKAGE_NAME欄位,這個應用擁有這一行資料,在TvProvider.java中進行Insert, Update操作時會進行檢查。一個TV Input可能會訪問其他TV Inputs寫入和保護的資訊。
  • 可以再AndroidManifest.xml中定義READ, WRITE許可權來控制那些頻道可用。
  • 只有具有signatureOrSystem的應用才能得到ACCESS_ALL_EPG_DATA許可權來訪問整個資料庫。

TV Input Manager

TV Input Manager為整個Android TV Input Framework提供主要的系統API。它負責中轉、控制應用和TV Inputs之間的互動,同時提供兒童鎖的功能。TV Input Manager會話必須是和TV Inputs一一對應的。TV Input Manager允許訪問安裝的TV Inputs,這樣的話應用可以:

  • 列出TV inputs,並且檢查他們的狀態。
  • 建立會話,並且管理會話的監聽者。

對於會話來說,TV App可以通過一個TV Input寫在TV Provider資料庫裡的URI來對其進行調臺,而直通的TV Inputs是通過TvContract.buildChannelUriForPassthroughInput()來進行調臺。一個TV Input還可以有自己的音量設定。那些由電視製造商提供的(簽名)或者那些安裝在系統分割槽的應用,可以訪問整個TV Provider資料庫。這些訪問可以供應用來搜尋和瀏覽所有可用的頻道和節目。

一個應用可以通過android.media.tv.TvInputManager建立和註冊TvInputCallback,這個應用會在TV Input狀態變化或者增加、解除安裝的時候被回撥。例如,在一個TV Inputs斷開連線的時候,TV App可以作出響應,顯示斷開狀態並且阻止它被使用者選中。

TV Input Manager是對TV AppTV Inputs之間通訊的一個抽象。TV Input Manager TV Input的標準介面允許製造商建立自己的TV App,並且能夠讓所有三方的TV Inputs在所有的TV App上工作。

TV Inputs

TV Inputs是一些Android應用,某種意義上說具有AndroidManifest.xml,通過預裝或者應用商店安裝的應用。Android電視支援預裝的系統級別的應用,具有電視廠商簽名的應用,或者一些三方的TV Inputs

有一些TV Inputs,例如HDMI輸入源或者內建的電視接收器,由於這些TV Inputs直接訪問硬體,可以由電視製造商提供。其他的像IPTV、位移播放、外接機頂盒這些輸入源,可以在Google Play上由三方通過應用來提供,一旦下載並且安裝後,這個新的TV Input可以被TV App來使用了。

直通的TV Inputs示例

3. Android TV System Input

在這個例子中,電視廠商提供的TV Input是被信任的,具有訪問TV Provider的所有的許可權。作為一個直通的TV Input,它沒有在TV Provider註冊頻道和節目資訊。為了獲取這個TV InputURI,用android.media.tv.TvContract的方法buildChannelUriForPassthroughInput(String inputId)TV AppTV Input Manager通訊來訪問HDMI TV Input

內建的接收器示例

4. Android TV Built-in Tuner Input

在這個例子裡,電視製造商提供的內建接收器的TV Input是被信任的,具有訪問TV Provider的所有許可權。

三方的TV Input示例

5. Android TV third-party input

在這個例子中,是一個有三方提供的外接的機頂盒TV Input。這個TV Input不能直接訪問HDMI視訊源,必須通過TV Input Manager訪問裝置製造商提供的HDMI TV Input

通過TV Input Manager,外接的機頂盒TV Input可以訪問HDMI TV Input,並且顯示HDMI1的視訊。在HDMI TV Input顯示視訊的時候,機頂盒TV Input可以控制電視。

畫中畫 (PIP)示例

6. Android TV KeyEvents

這個圖展示了遙控器上的按鍵輸入是怎麼傳遞到特定的顯示PIPTV Input中。那些按鍵按下後,被硬體驅動掃描到,從硬體掃描碼轉化到Android keycodes,然後傳遞到Android標準的輸入管道,InputReaderInputDispatcher中。在TV App獲取焦點後,這些輸入事件也會按順序觸發。

只有系統級別的TV Inputs才有資格接收InputEvents,而且是隻有在聲明瞭RECEIVE_INPUT_EVENT系統許可權的基礎上。TV Input負責判斷哪些InputEvents自己處理,哪些InputEventsTV App處理。

TV App負責判斷當前那個系統TV Input被使用者選中,是當前活動的TV Input,然後將KeyEvents分發給正確的TV Input Manager會話,呼叫dispatchInputEvent()將這些輸入事件傳遞給對應的TV Input

MHEG-5源示例

下圖展示了在Android TIFKeyEvents是如何被分發的。

7. Android TV Red button example

這幅圖描述了紅鍵(Red button)應用的流程,這是在歐洲常見的讓使用者在電視上和應用互動的功能。這個應用可以在電視流媒體中傳輸。當這個鍵被按下後,可以讓使用者和這些廣播應用互動。例如,你可以用這些廣播應用來獲取相關的網頁和體育比賽結果。

Broadcast app部分介紹了這些廣播應用是如何和TV App互動的。

在這個示例中:

  1. TV App獲取了焦點,可以接收所有的輸入事件。
  2. KeyEvents(例如紅色按鈕)被作為InputEvents分發到當前活動的TV Input
  3. 集成了MHEG-5協議棧的系統級別的TV Input並且具有RECEIVE_INPUT_EVENT許可權。
  4. 當收到啟用的按鍵事件(例如紅鍵),TV Input啟用廣播應用。
  5. TV input把KeyEvents當成InputEvents,廣播應用獲得焦點然後處理InputEvents。

注意:三方的TV inputs不能接收按鍵事件。

TV Input HAL

TV Input硬體抽象層協助TV Inputs訪問電視相關的硬體。和其他的Android硬體抽象層一樣,TV Input 硬體抽象層在AOSP程式碼庫由樣例程式碼,裝置廠商會開發它自己的實現。

TV App

TV App通過(com.android.tv.search.TvProviderSearch)提供頻道和節目的搜尋結果,同時通過TV Input Manager向各個TV Inputs分發按鍵、調臺和音量等呼叫。電視製造商必須提供TV App來保證使用者搜尋功能,同時,使用者也需要在搜尋結果中導航。由於TV App需要系統或者平臺簽名的許可權,三方的開發者不能開發TV App

對於TIF來說,TV App沒有尋求實現每個國家或者電視製造商特有的電視標準。實際上,它通常包含以下工作:

安裝和配置

  • 自動檢測TV Inputs
  • TV Inputs初始化頻道資訊
  • 控制兒童鎖設定
  • 更改電視相關的設定

o    編輯頻道

觀看

  • 訪問和瀏覽所有的電視訊道
  • 訪問電視節目資訊欄
  • 多音道和字幕支援
  • 兒童鎖控制和密碼校驗
  • ·         允許某些TV標準(例如HbbTV)TV Input UI層疊

兒童鎖

兒童鎖能夠讓使用者阻止某些不想顯示的頻道和節目,但是輸入正確的密碼後就會解除這些鎖定。

TV App, TV Input Manager service, TV Provider, TV Input都要負責兒童鎖的功能。

TV Provider

每一個頻道表中的資料行有一個COLUMN_LOCKED欄位,用來在密碼驗證前鎖住特定的頻道不被觀看。節目表中的COLUMN_CONTENT_RATING欄位只是用來顯示而不會強制用於兒童鎖。

TV Input Manager

TV Input Manager儲存所有應該被阻止的TvContentRating,在isRatingBlocked()呼叫中判斷所給的分級是否應該被阻止。

TV Input

當用戶觀看的內容內容更改(例如頻道或者節目變化),或者兒童的設定發生變化(在ACTION_BLOCKED_RATINGS_CHANGEDACTION_PARENTAL_CONTROLS_ENABLED_CHANGED)時,TV Input通過TV Input Manager isRatingBlocked()呼叫來檢查目前的內容是否應該被阻止。如果目前的內容應該被阻止,TV Input會關閉音視訊的輸出,然後通過notifyContentBlocked(TvContentRating)通知TV App當前內容被禁止。如果播放的內容不應該被禁止,TV Input會使能音視訊輸出,並且通過呼叫notifyContentAllowed()來通知TV App

TV App

TV Input通知當前使用者準備播放的頻道被兒童鎖阻止時,TV App向用戶顯示兒童鎖的設定和需要輸入密碼的介面。

TV App不會自己儲存兒童鎖的設定。當用戶更改兒童鎖的設定後,所有被阻止的TvContentRatingTV Input Manager中儲存,被鎖的頻道儲存在TV Provider中。

HDMI-CEC

HDMI-CEC允許一個裝置來控制其他的裝置,這樣的話就能夠用一個遙控器來控制家庭中的多個裝置。這個功能被Android TV用來通過集中的TV App來加速配置和遠端控制各個TV Inputs。例如,可以切換輸入源,開關裝置等操作。

Android TIFHDMI-CEC實現為HDMI Control Service,這樣的話電視製造商只需要開發底層的驅動,並且和輕量級的Android TV硬體抽象層互動,不需要關注複雜的業務邏輯。為了提供一個標準的實現,Android通過減少碎片化和支援可選擇的功能來減少相容性問題。HDMI Control Service基於已有的Android Services,包括輸入和開關機功能。

這意味著現有的HDMI-CEC實現需要重新設計來適配Android TIF。我們推薦在硬體上包含一個微處理器來接收CEC開機和其他命令。

8. CEC integration on Android TV

  1. CEC匯流排從當前活動源接收命令切換到一個不同的源。
  2. 驅動將這個命令傳給HDMI-CEC硬體抽象層。
  3. 硬體抽象層通知所有的ActiveSourceChangeListeners。
  4. HDMI Control Service通過註冊ActiveSourceChangeListener被通知源切換
  5. TV Input Manager service生成廣播來通知TV App切換輸入源
  6. TV App為新的TV Input建立TV Input Manager會話並且在這個會話上呼叫setMain。
  7. TV Input Manager會話向這個HDMI TV Input傳送資訊。
  8. HDMI TV input請求設定顯示介面。
  9. 當介面設定好後。TV Input Manager Service生成相應的切換控制命令回傳給HDMI Control Service

TV整合指南

廣播應用

因為每個國家有自己的廣播電視標準(例如MHEG, Teletext, HbbTV),電視廠商希望用自己的解決方案提供給廣播應用。

MHEG:本地協議棧MHEG-5:資訊科技-多媒體和超媒體資訊編碼第5部分,是一個歐洲標準)

Teletext:本地協議棧

HbbTV:基於Opera browserwebkit核心改動而來

Android L的釋出中,

相關推薦

Android TV Input FrameworkAndroid TV

前言 Android TV是Android 5.0新的內容,當前國內的智慧電視大部分都是基於Android系統的,Android TV作為事實上的標準,它的推出必將極大的影響下一代智慧電視的開發。 近兩年來一直在從事智慧電視的系統開發,也一直在關注這方面的技術,做過Andr

Android TV框架 TIFAndroid TV Input Framework入門實踐

做TV開發一段時間了,國內目前關於這方面的資料並不多,這裡我來分享一下我對TIF的使用心得。Android TIF(Android TV Input Framework)是Google向電視製造商提供了一套標準的API,用於建立Input模組來控制Andro

Android學習路線二十運用Fragment構建動態UI——創建一個Fragment

動態 app idt 文檔 部分 roi 現實 調用 android學習 你能夠把fragment看成是activity的模塊化部分。它擁有自己的生命周期,接受它自己的輸入事件,你能夠在activity執行時加入或者刪除它(有點像是一個“子activity”。你

Android開發實戰二十:淺談android:clipChildren屬性

.cn viewpage port 部分 lap ole 有一個 默認 版本 原文:Android開發實戰(二十一):淺談android:clipChildren屬性實現功能: 1、APP主界面底部模塊欄 2、ViewPager一屏多個界面顯示 3、........

Android螢幕適配個人的點點總結及經驗

前言:做Android已經一段時間了,可是當別人問到我Android中的螢幕適配的時候,感覺自己有一種似懂非懂的感覺,這就有點尷尬了~~哈哈!還有就是ui跑過來問你要切什麼樣子的圖的時候,總要解釋半天,讓別人感覺你好不專業啊,所以為了更好的理解android的螢

坑學android之禁用Appt2andriod studio3.0

唔,你的問題是什麼呢?1)上方提示R檔案缺失?2)Error:java.util.concurrent.ExecutionException: com.android.tools.aapt2.Aapt2Exception: AAPT2 error: check logs fo

Android原始碼解析二十-->PopupWindow載入繪製流程

在前面的幾篇文章中我們分析了Activity與Dialog的載入繪製流程,取消繪製流程,相信大家對Android系統的視窗繪製機制有了一個感性的認識了,這篇文章我們將繼續分析一下PopupWindow載入繪製流程。 在分析PopupWindow之前,我們將

整理篇在windows環境下搭載Android開發環境

前言: 踏入職場伊始,由於工作安排,從事過一段時間的Android開發,到現在已經很久不接觸這塊了,雖說中間斷續的有開發過一些小工具,也不過是小打小鬧,沒什麼氣候;為避免以後遺忘的徹底,還是想著做個記錄,好方便以後查詢;其實很早就想過總結這事了,但是一直懶著,沒有動靜。後續

關於android中的單位dp、sp

字號 兩個 metrics 不一定 ont ace white 超級 style android讓人頭疼的適配問題。 --------- Android 中的單位大概有這些: 經常使用的dip、sp。有時候用到px。 --------- 介紹兩個類: Type

Android五天樂第三天ListFragment與ViewPager

viewgroup cat () wid group 得到 ica bottom csdn 1ListFragment 今天首先學習了一種很經常使用的展示場景:列表展示。 昨天學習了使用Fragmet來取代activity進行設計。今天在托管單

Android的DatePicker和TimePicker-android學習之旅三十八

cursor ini lis drawable textview @+ type pin view DatePicker和TimePicker簡單介紹 DatePicker和TimePicker是從FrameLayout繼承而來。他們都是比較簡單的組件

Android項目實戰三十八:2017最新 將AndroidLibrary提交到JCenter倉庫圖文教程

success hub rdf fault 用戶 builds style config ocl 我們經常使用github上的開源項目,使用步驟也很簡單 比如: compile ‘acffo.xqx.xwaveviewlib:maven:1.0.0‘ 這裏就學習一下如何

Android查缺補漏線程篇-- AsyncTask的使用及原理詳細分析

catch 返回 rri 理解 ams tee ive lean keyword 本文作者:CodingBlock 文章鏈接:http://www.cnblogs.com/codingblock/p/8515304.html 一、AsyncTask的使用 AsyncT

Android項目實戰四十五:Usb轉串口通訊CH34xUARTDriver

spa config 關於 截取 文章 www protect sed bytes 需求為:手機usb接口插入一個硬件,從硬件上獲取數據 例如:手機usb插入硬件A,A通過藍牙通訊獲取設備a、b的數據,作為中轉站(可以做些數據處理)將數據(設備a、b產生的)傳給手機程序。

Android項目實戰四十四:Zxing二維碼切換橫屏掃描

pla xxx mage tde min bar 分享圖片 spl 發現 原文:Android項目實戰(四十四):Zxing二維碼切換橫屏掃描Demo鏈接 默認是豎屏掃描,但是當我們在清單文件中配置橫屏顯示的時候: <activity

Android項目實戰三十九Android集成Unity3D項目圖文詳解

jar包沖突 scree pmap module 項目實戰 技術 詳細 應用端 原來 原文:Android項目實戰(三十九):Android集成Unity3D項目(圖文詳解)  需求:   Unity3D 一般用於做遊戲 而且是跨平臺的。原本設計是Android 應用端A

Android項目實戰三十六:給背景加上陰影效果

灰色 top set 設置 star 部分 ble utf 產品 原文:Android項目實戰(三十六):給背景加上陰影效果 圓角背景大家應該經常用: 一個drawable資源文件 裏面控制corner圓角 和solid填充色 <shape xmlns

Android項目實戰三十七:Activity管理及BaseActivity的實現

nbsp agen etc == tar fin email ted AD 原文:Android項目實戰(三十七):Activity管理及BaseActivity的實現Ps:7-10月 完成公司兩個app項目上架。漏掉的總結 開始慢慢補上。 一、寫一個Activit

Android查缺補漏線程篇-- IntentService的源碼淺析

per .com 隨著 nds public message 這一 這樣的 系統 本文作者:CodingBlock 文章鏈接:http://www.cnblogs.com/codingblock/p/8975114.html 在Android中有兩個比較容易弄混的概念,Se

android柱狀圖自定義view

  public class HistogramView extends View { private Paint mLinePaint; private Paint mGreenPaint; private Paint mTextPaint;