1. 程式人生 > >Android自定義控制元件之入門篇---整理網路上的資源

Android自定義控制元件之入門篇---整理網路上的資源

前言,
我的視訊系列 http://edu.csdn.net/course/detail/2741
一起來學習Android…
本篇部落格主要是想要講解一下自定義控制元件如何入門,其中有好多資料資源來源自網路,綜合了網路上一些有些的博文,又同時增加了博主自己的一些思路,在這裡姑且以原創自居吧…

如何入手自定義控制元件

第一步:先判斷當前要寫的是一個View還是一個ViewGroup

  • Android的UI介面都是由View和ViewGroup及其派生類組合而成的。其中,View是所有UI元件的基類,而ViewGroup是容納這些元件的容器,其本身也是從View派生出來的。AndroidUI介面的一般結構可參見下面的示意圖:這裡寫圖片描述
  • 一般ViewGroup我們可以理解為可以放控制元件的容器
    這裡寫圖片描述
  • 而View我們可以理解為單一的一個控制元件
    這裡寫圖片描述

第二步:瞭解自定義控制元件常用的一些方法

重要的方法已經加黑標記,初學者掌握先來掌握這四個方法。

  • onFinishlnflate()這是一個回撥方法, 當應用從 XML 佈局檔案載入該元件並利用
    它來構建介面之後, 該方法就會被回撥。
  • onMeasure(int,int):呼叫該方法來檢測View元件及它所包含的所有子元件的大小.

    measure操作主要用於計算檢視的大小,即檢視的寬度和長度。在view中定義為final型別,要求子類不能修改。measure()函式中又會呼叫下面的函式:
    (1)onMeasure(),檢視大小的將在這裡最終確定,也就是說measure只是對onMeasure的一個包裝,子類可以覆寫onMeasure()方法實現自己的計算檢視大小的方式,並通過setMeasuredDimension(width, height)儲存計算結果。

  • onlayout(boolean,int,int,int,int):當該元件需要分配其子元件的位置、大小時,
    該方法就會被回撥. View類中佈局發生改變時會呼叫的方法,這個方法是所有View、ViewGroup及其派生類都具有的方法,過載該類可以在佈局發生改變時作定製處理,這在實現一些特效時非常有用。

    layout操作用於設定檢視在螢幕中顯示的位置。在view中定義為final型別,要求子類不能修改。layout()函式中有兩個基本操作:
    

    (1)setFrame(l,t,r,b),l,t,r,b即子檢視在父檢視中的具體位置,該函式用於將這些引數儲存起來;
    (2)onLayout(),在View中這個函式什麼都不會做,提供該函式主要是為viewGroup型別佈局子檢視用的;

  • onSizeChanged(int,int, int, int):當該元件的大小被改變時回撥該方法.

  • onDraw(canves): 當該元件將要繪製它的內容時回撥該方法迸行繪製. View類中用於重繪的方法,這個方法是所有View、ViewGroup及其派生類都具有的方法,也是Android UI繪製最重要的方法。開發者可 過載該方法,並在過載的方法內部基於引數canvas繪製自己的各種圖形、影象效果。
    draw操作利用前兩部得到的引數,將檢視顯示在螢幕上,到這裡也就完成了整個的檢視繪製工作。子類也不應該修改該方法,因為其內部定義了繪圖的基本操作:
    (1)繪製背景;
    (2)如果要檢視顯示漸變框,這裡會做一些準備工作;
    (3)繪製檢視本身,即呼叫onDraw()函式。在view中onDraw()是個空函式,也就是說具體的檢視都要覆寫該函式來實現自己的顯示(比如TextView在這裡實現了繪製文字的過程)。而對於ViewGroup則不需要實現該函式,因為作為容器是“沒有內容“的,其包含了多個子view,而子View已經實現了自己的繪製方法,因此只需要告訴子view繪製自己就可以了,也就是下面的dispatchDraw()方法;
    (4)繪製子檢視,即dispatchDraw()函式。在view中這是個空函式,具體的檢視不需要實現該方法,它是專門為容器類準備的,也就是容器類必須實現該方法;
    (5)如果需要(應用程式呼叫了setVerticalFadingEdge或者setHorizontalFadingEdge),開始繪製漸變框;
    (6)繪製滾動條;
    從上面可以看出自定義View需要最少覆寫onMeasure()和onDraw()兩個方法。
  • onKeyDown(int,KeyEvent): 當某個鍵被按下時觸發該方法.
  • onKayUp(int,KeyEvent), 當鬆開某個鍵時觸發該方法.
  • onTrackballEvent (MotionEvent): 當發生軌跡球事件時觸發該方法
  • onTouchEvent (MotionEvent): 當發生觸控式螢幕事件時觸發該方法.
  • onWindowFocuschanged(boolean): 當該元件得到、失去焦點時觸發該方法.
  • onAttachedToWindow():當把該元件放入某個視窗時觸發該方法.
  • onDetachedFromWindow(): 當把該元件從某個視窗上分離時觸發該方法.
  • onWindowVisibilityChanged(int):當包含該元件的視窗的可見性發生改變時觸發該方法

從自定義一個可以隨手指滑動的圓圈來進行入手

  • 分析當前控制元件是應該繼承自View還是ViewGroup

    由於這個自定義控制元件內部不需要新增任何的其他控制元件,所以是繼承自View
    public class MovingView extends View

  • 分析該控制元件是否需要進行測量並設定大小

    可以在佈局檔案中設定這個View的寬高直接是匹配父窗體
    那麼,只需要測量出該圓圈的初始位置即可
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    // 測量計算出當前螢幕控制元件的寬高
    width = this.getWidth();
    height = this.getHeight();
    x = width * 1.0f / 2;
    y = height * 1.0f / 2;
    }

  • 繪製介面,重寫onDraw方法
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        // 建立畫筆
        Paint paint = new Paint();
        // 設定畫筆顏色
        paint.setColor(Color.BLUE);
        // 畫出小球
        canvas.drawCircle(x, y, circleR, paint);
    }
  • 重寫onTouchEvent,讓小圓點隨手指移動而移動
    需要判斷當前手指按下的位置,是否是在小球身上
/**
     * 計算手指是否是落在了滑塊上(預設是按照滑塊在未解鎖的初始位置來計算的)
     */
    public boolean isDownOnBlock(float x1, float x2, float y1, float y2) {
        float sqrt = FloatMath.sqrt(Math.abs(x1 - x2) * Math.abs(x1 - x2)
                + Math.abs(y1 - y2) * Math.abs(y1 - y2));
        if (sqrt <= circleR) {
            return true;
        }
        return false;
    }

onTouchEvent的具體程式碼

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        float x2 = event.getX();
        float y2 = event.getY();
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            downOnBlock = isDownOnBlock(x2, x, y2, y);
            break;
        case MotionEvent.ACTION_MOVE:
            if (downOnBlock) {
                x = x2;
                y = y2;
                postInvalidate();
            }
            break;
        }
        //消費該事件
        return true;
    }
  • 在執行onTouchEvent的時候,重新繪製介面

    postInvalidate()

  • 再次執行onDraw方法

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        // 建立畫筆
        Paint paint = new Paint();
        // 設定畫筆顏色
        paint.setColor(Color.RED);
        // 進行邊框判斷,設定圖示不超過邊界
        if (x - circleR < 0) {
            x = circleR;
        }
        if (y - circleR < 0) {
            y = circleR;
        }
        if (x > width - circleR) {
            x = width - circleR;
        }
        if (y > height - circleR) {
            y = height - circleR;
        }
        // 畫出小球
        canvas.drawCircle(x, y, circleR, paint);
    }

以上是自定義控制元件的簡單應用,還在修改整理中…

相關推薦

Android定義控制元件入門---整理網路資源

前言, 我的視訊系列 http://edu.csdn.net/course/detail/2741, 一起來學習Android… 本篇部落格主要是想要講解一下自定義控制元件如何入門,其中有好多資料資源來源自網路,綜合了網路上一些有些的博文

Android定義控制元件區域性圖片放大鏡--BiggerView

零、前言: 本文的知識點一覽 1.自定義控制元件及自定義屬性的寫法,你也將對onMesure有更深的認識 2.關於bitmap的簡單處理,及canvas區域裁剪 3.本文會實現兩個自定義控制元件:FitImageView(圖片自適應)和BiggerView(放大鏡),前者為後者作為鋪墊。 4.最後會

Android定義控制元件仿汽車家下拉重新整理

關於下拉重新整理的實現原理我在上篇文章Android自定義控制元件之仿美團下拉重新整理中已經詳細介紹過了,這篇文章主要介紹錶盤的動畫實現原理 汽車之家的下拉重新整理分為三個狀態: 第一個狀態為下拉重新整理狀態(pull to refresh),在這個狀

Android定義控制元件《折線圖的繪製》

金融軟體裡的行情分時圖,這是我們最常見的折線圖,當然了,折線圖的用途並不僅僅侷限於此,像一般在一定區間內,為了更好的能顯示出幅度的變化,那麼用折線圖來展示無疑是最符合效果的,當然了,網上也有很多的第

Android定義控制元件實現滑動選擇開關

前言:今天我們仿照著Google給我們提供的Switch控制元件來進行一次模仿,自己動手打造一個可以換滑動圖片以及背景的圖片。 -----------------分割線--------------- 先看一下google提供的Switc控制元件: 其實用法很簡單就當普通的

Android 定義控制元件繼承view

一.自定義控制元件的型別:            1.繼承view(自繪檢視:view中的內容是我們自己繪製出來的,需要重寫onDraw方法)            2.繼承已有原生控制元件            3.自定義組合控制元件(將系統原生的控制元件組合到一起) 本

android定義控制元件圓形進度條(帶動畫)

首先貼上圖片: 額,感覺還行吧,就是進度條的顏色醜了點,不過咱是程式設計師,不是美工,配色這種問題當然不在考慮範圍之內了 下面說重點,如何來寫一個這樣的自定義控制元件。 首先,需要有一個灰色的底圖,來作為未填充時的進度條; 然後,根據傳入的當前進度值,繪製填充時的進度圓

Android定義控制元件百分比圓環進度條

首先我們先來看一下效果 分析 我們來看這個進度條應該分為3個小部分 1.中間的圓 2.外邊的圓環 3.中間的文字 分開畫 這3部分就是需要我們自己畫出來的,因此我們需要3根畫筆 //設定中心園的畫筆

Android定義控制元件圓形頭像

重寫ImageView public class CircleImageView extends ImageView { private static final ScaleType SCALE_TYPE = ScaleType.CENTER_CROP; p

Android 定義控制元件命運輪(抽獎轉盤)

1 思路 首先肯定是要繪製扇形的,每一個獎品為一個扇形區分開,然後在扇形中得有當前獎品的說明,最後讓這個輪盤轉起來就行了。說起來很簡單,但是在繪製的時候,特別是繪製文字的時候還有有一些細節需要注意的,也不是難點,只是要理清楚那些地方應該怎麼去畫,怎麼獲取需要繪製的座標。  

Android 定義控制元件ViewPager Indicator實現方式

介紹 ViewPager 的Indicator實現兩種效果 如下圖所示: 效果一 效果二 佈局檔案: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmln

Android定義控制元件掃描動畫UI

前言 最近有一個需求,就是做一個掃描的UI,看了很多掃描動畫,發現酷狗的掃描動畫挺漂亮的,所以就做了一個相似的掃描動畫,廢話不多說,先看一下最終的效果吧。 最終效果圖 介紹 首先我們看一下這個效果,它由以下幾部分組成: 1.中間一個音符圖片

Android定義控制元件測量onMeasure

由上圖可知,語法角度:子類可以重寫onMeasure,只能繼承View的measure,setMeasuredDimension方法。測量流程分為兩種情況討論:容器控制元件ViewGroup,原始的View(非容器控制元件)。原始的View測量,只需要測量自己的寬高;而容器控制元件需要先測量所有的子View

Android 定義控制元件 繼承佈局檔案

首先定義一個layout實現按鈕內部佈局: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:andr

Android定義控制元件畫圓,並且修改其填充色

畫圓就是簡答呼叫了drawCircle的api public class Dot extends View { public Dot(Context context) { s

定義控制元件繪圖(四):canvas變換與操作

前言:前幾篇講解了有關canvas繪圖的一些操作,今天更深入一些,講講對畫布的操作,這篇文章不像前幾篇那麼容易理解,如果以前沒有接觸過畫布的童鞋可能比較難以理解,為什麼會這樣。我儘量多畫圖,讓大家更清晰明白。前幾天偶然看到一篇文章,寫的樸實無華,充滿正能量,我非常喜歡裡面的一

Android 定義控制元件打造流佈局實現熱門搜尋標籤

最終效果 首先來看看效果圖: 其他地方很好實現,就是熱門搜尋有點麻煩,由於資料的不確定性,那麼像GridView明顯不能滿足了,這時候就只能自己來定義一個佈局了。 最終實現後的效果: 具體實現 1,自定義一個類繼承

Android定義控制元件定義TextView,實現drawableLeft可以和文字一起居中

LZ-Says:給大家推薦一個網站,有興趣可以查閱,想為大家貢獻一點自己的力量也可以投稿,老大稽核通過會發表,更好的幫助有需要的人~歡迎大家踴躍投稿~地址如下: http://ww

Android 定義控制元件基礎幾何圖形繪製詳解

前言 距離寫上一篇自定義View文章已經大半年過去了,一直想繼續寫,但是無奈技術有限,生怕誤人子弟。這段時間專案剛剛完成,有點時間,跟著大神的腳步,鞏固下自定義View的相關基礎知識。 Canvas&Paint Canvas和Pa

Android定義控制元件虛線的用法

Android實現畫虛線的方法 Android中可以通過DashPathEffect來實現,想知道關於PathEffect的詳細用法,請移步PathEffect的詳細用法 程式碼示例: PathE