1. 程式人生 > >Android零基礎入門第24節:自定義View簡單使用

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

子類 protect jin 討論 我們 @+ amp 進階 運行程序

當我們開發中遇到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簡單使用