Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 安卓自定義View----且看如何巧妙地實現一個類似於電視遙控板的環形按鈕效果(上)

安卓自定義View----且看如何巧妙地實現一個類似於電視遙控板的環形按鈕效果(上)

編輯:關於Android編程

本文力求用最簡單的方式實現這樣的一個效果,並輔以詳細的文字說明。
老規矩,先看圖:
這裡寫圖片描述

一個點餐界面,6種菜品,意味著6個按鈕,點擊‘開始點餐’ 幕布上升效果,這個動畫下篇再講。這篇的重點是這個樣式的布局怎麼實現。



    

    
    

    

    

    

    

    

    

可以看到,很簡單的一個相對布局,一個textview,一個大背景的imageview,然後6個自定義的view,也就是圖中的6個菜品按鈕,最後3個button。

接下來,關鍵就是這個view是怎麼寫的呢?

其中只有兩個方法:

    public boolean onTouchEvent(MotionEvent event) {
    if (isTouchPointInView(event.getX(),event.getY())||event.getAction() != MotionEvent.ACTION_DOWN){
        return super.onTouchEvent(event);
    }else{
        return false;
    }
    }

若點擊事件發生在當前view上,則實現父類的ontouchEvent方法,若沒有則返回false。了解事件傳遞機制的同學應該知道,安卓默認都是實現的super,也即為若是默認實現,則這個事件最終會向上傳遞到activiy,再響應onclick。

主要是isTouchPointInView這個方法的實現:

 protected boolean isTouchPointInView(float localX, float localY){
    Bitmap bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    draw(canvas);
    int x = (int)localX;
    int y = (int)localY;
    if (x < 0 || x >= getWidth())
        return false;
    if (y < 0 || y >= getHeight())
        return false;
    int pixel = bitmap.getPixel(x,y);
    if ((pixel&0xff000000) != 0){ 
        return true;
    }else{
        return false; 
    }
    }

首先在當前點擊的這個圖片的view上創建一個bitmap(16位的也可以,還省內存),然後以bitmap對象創建一個畫布,准備將內容都繪制在bitmap上。

X,Y即為手指點擊的位置坐標(默認從屏幕左上角向右為+X坐標,向下為+Y坐標),如果觸摸位置不在當前畫布上,則返回false。這兒返回false即為onTouchEvent也返回false,則不觸發點擊事件。

然後根據bitmap對象得到位圖點擊位置的像素值pixel,並與一個高8位為1的ARGB顏色進行與運算,得到的結果若不為0,則返回true,否則,返回false。

下來我詳解一下上面加粗的這句話,

因為ff代表全1,0xff000000=1111 1111 0000 0000 0000 0000 0000 0000

且 0&0=0
0&1=0
1&1=1

所以後面24位,無論pixel是多少都是0
前面8位,只有在pixel高8位有1時才不是0,所以(pixel&0xff000000)只有當pixel的高8位全為0時才為0。
下來我們在看一下bitmap.getPixel(x,y)常見的返回值:
BLACK:-16777216
BLUE:-16776961
GRAY:-7829368
GREEN:-16711936
TRANSPARENT :0
WHITE:-1
YELLOW :-256

因此我們此處通過getPixel(x, y) ==0 來判斷該像素是否為透明(TRANSPARENT )。
但是為什麼要判斷點擊位置是否透明呢?
下來看一張圖,這張圖就是上面我們的6個菜品按鈕的圖片,相信你看了也會明白的。這裡寫圖片描述
圖中用紅顏色的框出來的其實是透明的,只有“熱菜那塊不透明”。

那麼總結一下,上面那一大塊代碼的意思就是說,在當前view上,若點到“熱菜”這個區域上,即點擊的位置不透明,則觸發點擊事件。其余不觸發點擊。

源碼我上傳到github上,歡迎下載,喜歡的給個star,嘿嘿。

Android-The-ring-button.git">https://github.com/qht1003077897/Android-The-ring-button.git

下篇再講這個其中的動畫實現。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved