Android快樂貪吃蛇游戲實戰項目開發教程-04虛擬方向鍵(三)三角形按鈕效果

来源:http://www.cnblogs.com/chengyujia/archive/2016/08/21/5792542.html
-Advertisement-
Play Games

該系列教程概述與目錄:http://www.cnblogs.com/chengyujia/p/5787111.html 一、知識點講解 當我們點擊系統自帶的按鈕時,按鈕的外觀會發生變化。上篇博文中我們畫了一個三角形按鈕,但點擊還不能變色,下麵我們就來實現點擊變色功能。從知識體繫上我們需要瞭解以下兩個 ...


該系列教程概述與目錄:http://www.cnblogs.com/chengyujia/p/5787111.html

一、知識點講解

當我們點擊系統自帶的按鈕時,按鈕的外觀會發生變化。上篇博文中我們畫了一個三角形按鈕,但點擊還不能變色,下麵我們就來實現點擊變色功能。

從知識體繫上我們需要瞭解以下兩個知識點

  • 1.如何知道手指點擊了我們的控制項?

辦法是重寫View中的onTouchEvent方法。當手指觸摸到我們的控制項時,系統會通過該方法告訴我們。該方法還有一個類型為MotionEvent的參數,通過該參數我們就能知道當前觸摸事件的具體類型,比如按下、移動、抬起等。
我們可以讓按鈕在正常情況下顯示一個較暗的顏色,按下時顯示一個較亮的顏色,抬起後再恢復到較暗的顏色。這樣就實現了點擊變色的效果了。

  • 2.如何變色?

View中提供了一個叫invalidate的方法,每次調用該方法,系統都會重新調用onDraw方法來重繪本控制項。我們要做的就是在onDraw中判斷當前的觸摸動作,如果是按下就畫一個高亮的三角形,沒有觸摸或按下抬起後就畫一個較暗的三角形。

瞭解了相關的知識點,下麵我們就通過代碼來實現。

二、代碼實現

以下是當前DirectionKeys類的全部代碼:

package net.chengyujia.happysnake;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

/**
 * Created by ChengYuJia on 2016/8/19.
 * 屏幕上的虛擬方向鍵
 */
public class DirectionKeys extends View {
    //左三角形按壓時的顏色(較亮)
    private int leftPressedColor = 0xFFFF0000;
    //左三角形正常顯示的顏色(較暗)
    private int leftNormalColor = 0xFFAA0000;
    //手觸摸屏幕的動作,初始值用一個MotionEvent中沒有用到的action值,比如-10,表示還沒有任何觸屏動作發生。
    private int action = -10;
    //畫布的寬
    private int width;
    //畫布的高
    private int height;
    //畫左三角形的路徑
    private Path pathLeft = new Path();
    //畫筆
    private Paint paint = new Paint();
    //初始化方法是否執行過,確保初始化方法只執行一次。
    private boolean initDone = false;

    //只有一個參數的構造方法是我們在程式中通過“new”關鍵字創建實例時調用。
    public DirectionKeys(Context context) {
        super(context);
    }

    //有兩個參數的構造方法是系統在XML佈局文件中創建實例時調用。
    public DirectionKeys(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    //初始化方法
    private void init(Canvas canvas) {
        /*獲取畫布的長和寬*/
        width = canvas.getWidth();
        height = canvas.getHeight();
        /*
        (小提示:在電腦中一般都是將左上角作為坐標原點的)
        畫布上四個頂點和中心點的坐標如下:
        左上點 0,0
        左下點 0,height
        右上點 width,0
        右下點 width,height
        中心點 width/2,height/2
        */

        /*設置左三角形的路徑數據*/
        //從畫布左上點開始
        pathLeft.moveTo(0, 0);
        //畫直線到畫布中心點
        pathLeft.lineTo(width / 2, height / 2);
        //再畫直線到畫布左下點
        pathLeft.lineTo(0, height);
        //自動閉合圖形。從最後一個點(左下點)畫直線到第一個點(左上點)。
        pathLeft.close();
    }

    /**
     * 通過重寫父類的onDraw方法來繪製我們需要的圖形
     * 該方法會在控制項第一次顯示時被系統調用,併在之後每次調用invalidate方法後被系統調用。
     *
     * @param canvas 這裡的canvas是系統提供的一塊矩形畫布,我們要做的就是在這塊畫布上畫我們想要的東西。
     */
    @Override
    protected void onDraw(Canvas canvas) {
        if (!initDone) {
            init(canvas);
            //確保初始化方法只執行一次
            initDone = true;
        }

        if (action == MotionEvent.ACTION_DOWN) {
            //手按壓時高亮顯示
            paint.setColor(leftPressedColor);
        } else {
            //沒有按或按下抬起後顯示較暗的顏色
            paint.setColor(leftNormalColor);
        }
        //畫左三角形
        canvas.drawPath(pathLeft, paint);
    }

    /**
     * 如果手觸摸到我們的控制項,系統會通過該方法告訴我們
     *
     * @param event 系統給我們傳遞的觸摸事件參數
     * @return 如果該觸摸事件被我們處理了返回true,反之返回false。
     */
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        action = event.getAction();
        //ACTION_DOWN表示手按到屏幕,ACTION_UP表示手從屏幕上抬起。我們只處理這兩種動作。
        if (action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_UP) {
            //invalidate方法是告訴系統當前控制項需要重繪,系統會再次調用onDraw方法來實現重繪。
            invalidate();
            return true;
        }
        return false;
    }
}

 

上面註釋比較詳細,主要就3個方法onDraw(繪圖)、onTouchEvent(監聽觸摸事件)、invalidate(讓系統調用onDraw方法實現重繪)。

另外Path對象和Paint對象只要初始化一次就可以了,沒必要每次onDraw的時候重新創建,提高程式性能。

三、運行效果

正常時顯示暗色:

按下時顯示亮色:

測試的時候會發現,點擊非三角形區域也會變色,這因為我們還沒有對點擊的位置做判斷,這個會在後面講解。

先到這裡,下文繼續。:)


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 分頁是一個很簡單,通用的功能。作為一個有經驗的前端開發人員,有義務把代碼中類似這樣公共的基礎性的東西抽象出來,一來是改善代碼的整體質量,更重要的是為了將來做類似的功能或者類似的項目,能減少不必要的重覆工作量。在實際項目中,尤其是網站類型的項目中,分頁部分的設計總是個性化比較強,基本上都不會長的一樣, ...
  • css和@import都是調用外部樣式表的方法。 一、用法 (1)link: <link rel="stylesheet" type="text/css" href="css文件路徑"/> (2)@import: 方法一(html中添加): <style type="text/css"> @impo ...
  • UITabBarController 定製 特點 用法 1.準備工作: 加入你的相關圖片,放入了Assets.xcassets; 導入Categroy文件夾(這個裡面的文件,在這裡不詳細說明瞭,有疑問請看http://www.cnblogs.com/makingitbest/p/5789355.ht ...
  • Swift - 通過疊加UILabel來實現混合的進度條 效果 源碼 https://github.com/YouXianMing/Swift-Animations ...
  • 原理 監聽ScrollView的滑動 源 碼 https://github.com/ln0491/TitleAlphaDemo ...
  • 我們需要監聽ScroView的滑動情況,比如滑動了多少距離,是否滑到佈局的頂部或者底部。可惜的是SDK並沒有相應的方法,不過倒是提供了一個 顯然這個方法是不能被外界調用的,因此就需要把它暴露出去,解決方式就是寫一個介面 然後重寫ScrollView類,給它提供上面寫的回調介面 佈局時,用重寫的這個S ...
  • Swift - 多個mask的動畫效果 效果 源碼 https://github.com/YouXianMing/Swift-Animations ...
  • RT 1.effective_prio函數計算進程的動態優先順序。 普通進程除了靜態優先順序,還有動態優先順序,其值的範圍是100(最高優先順序)~139(最低優先順序)。動態優先順序是調度程式在選擇新進程來運行的時候使用的數。它與靜態優先順序的關係用下麵的經驗公式表示: bonus是範圍從0-10的值,值小於5 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...