Android零基礎入門第24節:自訂View簡單使用

來源:互聯網
上載者:User

標籤: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簡單使用

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.