Android零基礎入門第24節:自定義View簡單使用
當我們開發中遇到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簡單使用