標籤:lan graph 定義 view 利用 常用 oat 開發利器 ogg
當我們開發中遇到Android原生的組件無法滿足需求時,這時候就應該自訂View來滿足這些特殊的組件需求。
一、概述
很多初入Android開發的程式員,對於Android自訂View可能比較恐懼,但這又是高手進階的必經之路,這裡先不做過多學習,只是簡單瞭解。關於高階的內容會在後續課程陸續進行學習,歡迎關注分享達人秀(ShareExpert)擷取第一手教程。
如果說要按類型來劃分的話,自訂View的實現方式大概可以分為三種:自繪控制項、群組控制項、以及繼承控制項。
自繪控制項:內容都是開發人員自己繪製出來的,一般在View的onDraw方法中完成繪製。
群組控制項:就是將一些小的控制群組合起來形成一個新的控制項,這些小的控制項多是系統內建的控制項。比如很多應用中普遍使用的標題列控制項,其實用的就是群組控制項。
繼承控制項:繼承已有的控制項,建立新控制項,保留繼承的父控制項的特性,並且還可以引入新特性。
二、方法
介於目前掌握的Android基礎知識較為薄弱,本節先簡單學習一下自繪控制項。首先定義一個繼承View基類的子類,然後重寫View 類的一個或多個方法。通常可以被使用者重寫的方法如下。
構造器:重寫構造器是定製View的最基本方式,當Java代碼建立一個View執行個體,或根據XML布局檔案載入並構建介面時將需要調用該構造器。
onFinishInflate():這是一個回調方法,當應用從XML布局檔案載入該組件並利用它 來構建介面之後,該方法將會被回調。
onMeasure(int, int):調用該方法來檢測View組件及其所包含的所有子組件的大小。
onLayout(boolean, int, int, int, int):當該組件需要分配其子組件的位置、大小時,該方法就會被回調。
onSizeChanged(int, int, int, int):當該組件的大小被改變時回調該方法。
onDraw(Canvas):當該組件將要繪製它的內容時回調該方法進行繪製。
onKeyDown(int, KeyEvent):當某個鍵被按下時觸發該方法。
onKeyUp(int, KeyEvent):當鬆開某個鍵時觸發該方法。
onTrackballEvent(MotionEvent):當發生軌跡球事件時觸發該方法。
onTouchEvent(MotionEvent):當發生觸控螢幕事件時觸發該方法。
onFocusChanged (boolean gainFocus, int direction, Rect previouslyFocusedRect):當該組件焦點發生改變時觸發該方法。
onWindowFocusChanged(boolean):當包含該組件的視窗失去或得到焦點時觸發該方法。
onAttachedToWindow():當把該組件放入某個視窗時觸發該方法。
onDetachedFromWindow():當把該組件從某個視窗上分離時觸發該方法。
onWindowVisibilityChanged(int):當包含該組件的視窗的可見度發生改變時觸發該方法。
當需要開發自訂View時,開發人員並不需要重寫上面列出的所有方法,而是可以根據業務需要重寫其中部分方法。
三、樣本
下面就實現一個簡單的計數器,每點擊它一次,計數值就加1並顯示出來。
在src/main/java檔案下建立新包com.jinyu.cqkxzsxy.android.widgetsample.view,再建立一個CounterView.java檔案,其代碼如下:
package com.jinyu.cqkxzsxy.android.widgetsample.view;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Rect;import android.util.AttributeSet;import android.view.View;/** * @建立者 鑫鱻 * @描述 Android零基礎入門到精通系列教程,歡迎關注公眾ShareExpert */public class CounterView extends View { // 定義畫筆 private Paint mPaint; // 用於擷取文字的寬和高 private Rect mBounds; // 計數值,每點擊一次本控制項,其值增加1 private int mCount = 0; public CounterView(Context context, AttributeSet attrs) { super(context, attrs); // 初始化畫筆、Rect mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mBounds = new Rect(); // 本控制項的點擊事件 setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { mCount ++; // 重繪 invalidate(); } }); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); mPaint.setColor(Color.BLUE); // 繪製一個填充色為藍色的矩形 canvas.drawRect(0, 0, getWidth(), getHeight(), mPaint); mPaint.setColor(Color.YELLOW); mPaint.setTextSize(50); String text = String.valueOf(mCount); // 擷取文字的寬和高 mPaint.getTextBounds(text, 0, text.length(), mBounds); float textWidth = mBounds.width(); float textHeight = mBounds.height(); // 繪製字串 canvas.drawText(text, getWidth() / 2 - textWidth / 2, getHeight() / 2 + textHeight / 2, mPaint); }}
關於裡面的代碼不懂也沒有關係,後續會詳細進行學習的。
到res/layout/目錄下建立一個counterview_layout.xml檔案,然後在其中填充如下程式碼片段:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <com.jinyu.cqkxzsxy.android.widgetsample.view.CounterView android:id="@+id/counter_view" android:layout_width="100dp" android:layout_height="100dp"/></LinearLayout>
然後修改一下app/src/java/MainActivity.java檔案中載入的布局檔案為建立的counterview_layout.xml檔案。
運行程式,點擊自訂的計數控制項,會發現每點擊一次控制項裡面的值+1,如所示效果。
至此,一些Android開發中一些常用的控制項學習完畢,還記得學過哪些控制項嗎?都掌握的如何?我們從下一期開始一起來學習Android中的介面布局。
今天就先到這裡,如果有問題歡迎留言一起探討,也歡迎加入Android零基礎入門技術討論群,共同成長!
此文章著作權為公眾號分享達人秀(ShareExpert)——鑫鱻所有,若轉載請備忘出處,特此聲明!
往期總結分享:
Android零基礎入門第1節:Android的前世今生
Android零基礎入門第2節:Android 系統架構和應用組件那些事
Android零基礎入門第3節:帶你一起來聊一聊Android開發環境
Android零基礎入門第4節:正確安裝和配置JDK, 高富帥養成第一招
Android零基礎入門第5節:善用ADT Bundle, 輕鬆邂逅女神
Android零基礎入門第6節:配置最佳化SDK Manager, 正式約會女神
Android零基礎入門第7節:搞定Android模擬器,開啟甜蜜之旅
Android零基礎入門第8節:HelloWorld,我的第一趟旅程出發點
Android零基礎入門第9節:Android應用實戰,不懂代碼也可以開發
Android零基礎入門第10節:開發IDE大升級,終於迎來了Android Studio
Android零基礎入門第11節:簡單幾步帶你飛,運行Android Studio工程
Android零基礎入門第12節:熟悉Android Studio介面,開始裝逼賣萌
Android零基礎入門第13節:Android Studio配置最佳化,打造開發利器
Android零基礎入門第14節:使用高速Genymotion,跨入火箭時代
Android零基礎入門第15節:掌握Android Studio項目結構,揚帆起航
Android零基礎入門第16節:Android使用者介面開發概述
Android零基礎入門第17節:TextView屬性和方法大全
Android零基礎入門第18節:EditText的屬性和使用方法
Android零基礎入門第19節:Button使用詳解
Android零基礎入門第20節:CheckBox和RadioButton使用大全
Android零基礎入門第21節:ToggleButton和Switch使用大全
Android零基礎入門第22節:ImageView的屬性和方法大全
Android零基礎入門第23節:ImageButton和ZoomButton使用大全
Android零基礎入門第24節:自訂View簡單使用