Android零基础入门第24节:自定义View简单使用
當(dāng)我們開發(fā)中遇到Android原生的組件無法滿足需求時(shí),這時(shí)候就應(yīng)該自定義View來滿足這些特殊的組件需求。
?
一、概述
很多初入Android開發(fā)的程序員,對于Android自定義View可能比較恐懼,但這又是高手進(jìn)階的必經(jīng)之路,這里先不做過多學(xué)習(xí),只是簡單了解。關(guān)于高階的內(nèi)容會(huì)在后續(xù)課程陸續(xù)進(jìn)行學(xué)習(xí),歡迎關(guān)注分享達(dá)人秀(ShareExpert)獲取第一手教程。
如果說要按類型來劃分的話,自定義View的實(shí)現(xiàn)方式大概可以分為三種:自繪控件、組合控件、以及繼承控件。
-
自繪控件:內(nèi)容都是開發(fā)者自己繪制出來的,一般在View的onDraw方法中完成繪制。
-
組合控件:就是將一些小的控件組合起來形成一個(gè)新的控件,這些小的控件多是系統(tǒng)自帶的控件。比如很多應(yīng)用中普遍使用的標(biāo)題欄控件,其實(shí)用的就是組合控件。
-
繼承控件:繼承已有的控件,創(chuàng)建新控件,保留繼承的父控件的特性,并且還可以引入新特性。
?
二、方法
介于目前掌握的Android基礎(chǔ)知識(shí)較為薄弱,本節(jié)先簡單學(xué)習(xí)一下自繪控件。首先定義一個(gè)繼承View基類的子類,然后重寫View 類的一個(gè)或多個(gè)方法。通??梢员挥脩糁貙懙姆椒ㄈ缦?。
-
構(gòu)造器:重寫構(gòu)造器是定制View的最基本方式,當(dāng)Java代碼創(chuàng)建一個(gè)View實(shí)例,或根據(jù)XML布局文件加載并構(gòu)建界面時(shí)將需要調(diào)用該構(gòu)造器。
-
onFinishInflate():這是一個(gè)回調(diào)方法,當(dāng)應(yīng)用從XML布局文件加載該組件并利用它 來構(gòu)建界面之后,該方法將會(huì)被回調(diào)。
-
onMeasure(int, int):調(diào)用該方法來檢測View組件及其所包含的所有子組件的大小。
-
onLayout(boolean, int, int, int, int):當(dāng)該組件需要分配其子組件的位置、大小時(shí),該方法就會(huì)被回調(diào)。
-
onSizeChanged(int, int, int, int):當(dāng)該組件的大小被改變時(shí)回調(diào)該方法。
-
onDraw(Canvas):當(dāng)該組件將要繪制它的內(nèi)容時(shí)回調(diào)該方法進(jìn)行繪制。
-
onKeyDown(int, KeyEvent):當(dāng)某個(gè)鍵被按下時(shí)觸發(fā)該方法。
-
onKeyUp(int, KeyEvent):當(dāng)松開某個(gè)鍵時(shí)觸發(fā)該方法。
-
onTrackballEvent(MotionEvent):當(dāng)發(fā)生軌跡球事件時(shí)觸發(fā)該方法。
-
onTouchEvent(MotionEvent):當(dāng)發(fā)生觸摸屏事件時(shí)觸發(fā)該方法。
-
onFocusChanged (boolean gainFocus, int direction, Rect previouslyFocusedRect):當(dāng)該組件焦點(diǎn)發(fā)生改變時(shí)觸發(fā)該方法。
-
onWindowFocusChanged(boolean):當(dāng)包含該組件的窗口失去或得到焦點(diǎn)時(shí)觸發(fā)該方法。
-
onAttachedToWindow():當(dāng)把該組件放入某個(gè)窗口時(shí)觸發(fā)該方法。
-
onDetachedFromWindow():當(dāng)把該組件從某個(gè)窗口上分離時(shí)觸發(fā)該方法。
-
onWindowVisibilityChanged(int):當(dāng)包含該組件的窗口的可見性發(fā)生改變時(shí)觸發(fā)該方法。
當(dāng)需要開發(fā)自定義View時(shí),開發(fā)者并不需要重寫上面列出的所有方法,而是可以根據(jù)業(yè)務(wù)需要重寫其中部分方法。
?
三、示例
下面就實(shí)現(xiàn)一個(gè)簡單的計(jì)數(shù)器,每點(diǎn)擊它一次,計(jì)數(shù)值就加1并顯示出來。
在src/main/java文件下創(chuàng)建新包c(diǎn)om.jinyu.cqkxzsxy.android.widgetsample.view,再新建一個(gè)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;/*** @創(chuàng)建者 鑫鱻* @描述 Android零基礎(chǔ)入門到精通系列教程,歡迎關(guān)注微信公眾ShareExpert*/public class CounterView extends View {// 定義畫筆private Paint mPaint;// 用于獲取文字的寬和高private Rect mBounds;// 計(jì)數(shù)值,每點(diǎn)擊一次本控件,其值增加1private int mCount = 0;public CounterView(Context context, AttributeSet attrs) {super(context, attrs);// 初始化畫筆、RectmPaint = new Paint(Paint.ANTI_ALIAS_FLAG);mBounds = new Rect();// 本控件的點(diǎn)擊事件setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View view) {mCount ++;// 重繪 invalidate();}});}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);mPaint.setColor(Color.BLUE);// 繪制一個(gè)填充色為藍(lán)色的矩形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);} }關(guān)于里面的代碼不懂也沒有關(guān)系,后續(xù)會(huì)詳細(xì)進(jìn)行學(xué)習(xí)的。
到res/layout/目錄下創(chuàng)建一個(gè)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.CounterViewandroid:id="@+id/counter_view"android:layout_width="100dp"android:layout_height="100dp"/> </LinearLayout>然后修改一下app/src/java/MainActivity.java文件中加載的布局文件為新建的counterview_layout.xml文件。
運(yùn)行程序,點(diǎn)擊自定義的計(jì)數(shù)控件,會(huì)發(fā)現(xiàn)每點(diǎn)擊一次控件里面的值+1,如下圖所示效果。
至此,一些Android開發(fā)中一些常用的控件學(xué)習(xí)完畢,還記得學(xué)過哪些控件嗎?都掌握的如何?我們從下一期開始一起來學(xué)習(xí)Android中的界面布局。
?
今天就先到這里,如果有問題歡迎留言一起探討,也歡迎加入Android零基礎(chǔ)入門技術(shù)討論微信群,共同成長!
此文章版權(quán)為微信公眾號(hào)分享達(dá)人秀(ShareExpert)——鑫鱻所有,若轉(zhuǎn)載請備注出處,特此聲明!
?
往期總結(jié)分享:
Android零基礎(chǔ)入門第1節(jié):Android的前世今生
Android零基礎(chǔ)入門第2節(jié):Android 系統(tǒng)架構(gòu)和應(yīng)用組件那些事
Android零基礎(chǔ)入門第3節(jié):帶你一起來聊一聊Android開發(fā)環(huán)境
Android零基礎(chǔ)入門第4節(jié):正確安裝和配置JDK, 高富帥養(yǎng)成第一招
Android零基礎(chǔ)入門第5節(jié):善用ADT Bundle, 輕松邂逅女神
Android零基礎(chǔ)入門第6節(jié):配置優(yōu)化SDK Manager, 正式約會(huì)女神
Android零基礎(chǔ)入門第7節(jié):搞定Android模擬器,開啟甜蜜之旅
Android零基礎(chǔ)入門第8節(jié):HelloWorld,我的第一趟旅程出發(fā)點(diǎn)
Android零基礎(chǔ)入門第9節(jié):Android應(yīng)用實(shí)戰(zhàn),不懂代碼也可以開發(fā)
Android零基礎(chǔ)入門第10節(jié):開發(fā)IDE大升級(jí),終于迎來了Android Studio
Android零基礎(chǔ)入門第11節(jié):簡單幾步帶你飛,運(yùn)行Android Studio工程
Android零基礎(chǔ)入門第12節(jié):熟悉Android Studio界面,開始裝逼賣萌
Android零基礎(chǔ)入門第13節(jié):Android Studio配置優(yōu)化,打造開發(fā)利器
Android零基礎(chǔ)入門第14節(jié):使用高速Genymotion,跨入火箭時(shí)代
Android零基礎(chǔ)入門第15節(jié):掌握Android Studio項(xiàng)目結(jié)構(gòu),揚(yáng)帆起航
Android零基礎(chǔ)入門第16節(jié):Android用戶界面開發(fā)概述
Android零基礎(chǔ)入門第17節(jié):TextView屬性和方法大全
Android零基礎(chǔ)入門第18節(jié):EditText的屬性和使用方法
Android零基礎(chǔ)入門第19節(jié):Button使用詳解
Android零基礎(chǔ)入門第20節(jié):CheckBox和RadioButton使用大全
Android零基礎(chǔ)入門第21節(jié):ToggleButton和Switch使用大全
Android零基礎(chǔ)入門第22節(jié):ImageView的屬性和方法大全
Android零基礎(chǔ)入門第23節(jié):ImageButton和ZoomButton使用大全
posted on 2017-08-12 10:39 NET未來之路 閱讀(...) 評(píng)論(...) 編輯 收藏轉(zhuǎn)載于:https://www.cnblogs.com/lonelyxmas/p/7349212.html
總結(jié)
以上是生活随笔為你收集整理的Android零基础入门第24节:自定义View简单使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 洛谷 P1200 [USACO1.1]你
- 下一篇: 面试 | 蚂蚁金服面试经历