Android快樂貪吃蛇游戲實戰項目開發教程-03虛擬方向鍵(二)繪製一個三角形

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

該系列教程概述與目錄:http://www.cnblogs.com/chengyujia/p/5787111.html 一、繪製三角形 在上一篇文章中,我們已經新建了虛擬方向鍵的自定義控制項DirectionKeys類,下麵我們繼續。 本項目中的虛擬方向鍵的背景是4個三角形組成的矩形,其實是4個三角形 ...


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

一、繪製三角形

在上一篇文章中,我們已經新建了虛擬方向鍵的自定義控制項DirectionKeys類,下麵我們繼續。

本項目中的虛擬方向鍵的背景是4個三角形組成的矩形,其實是4個三角形的按鈕。

系統自帶的按鈕是矩形的,怎麼做一個三角形按鈕呢?

首先我需要瞭解,所有控制項的外觀都是畫出來的,當然不是我們手工去畫而是用程式去畫。

用程式怎麼畫呢?

很多技術平臺上都有繪圖功能,用起來也很相似。既然都是面向對象的思想,我們可以與現實中畫畫類比。

首先我們需要一塊畫布(canvas),然後需要一支畫筆(paint)和顏料(color),現實中這就可以畫了。然而現在是要程式去畫,必須要告訴程式你要畫什麼。由於每個人畫的東西不一樣,五花八門,所以畫不同的東西,告訴程式的方式也可能不同。我們畫三角形選擇用path對象告訴程式,下麵細講。然後程式就給你畫出來了。

 

瞭解了繪圖的基本流程,下麵我們用代碼來實現。

在android.view.View中有個方法叫onDraw的方法,我們只要重寫(Override)該父類方法,在該方法中畫我們想要的東西即可。

在Android Studio中輸入onDraw時根據智能提示生成瞭如下代碼:

    /**
     * 通過重寫父類的onDraw方法來繪製我們需要的圖形
     *
     * @param canvas 這裡的canvas是系統提供的一塊矩形畫布,我們要做的就是在這塊畫布上畫我們想要的東西。
     */
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
    }

從上面的代碼中可以看到,onDraw方法給我們傳來了一個叫canvas的對象,canvas就是一個畫布,我們可以在上面畫畫。自動生成的“super.onDraw(canvas);”是調用了父類中的onDraw方法,我們可以點進去看看。

    /**
     * Implement this to do your drawing.
     *
     * @param canvas the canvas on which the background will be drawn
     */
    protected void onDraw(Canvas canvas) {
    }

發現父類中的onDraw方法是空的,可以不調用。

現在有畫布了,我們還需要畫筆。這好辦,new一個就行了。

        //準備畫筆
        Paint paint = new Paint();

畫筆要蘸什麼顏色的顏料呢?比如紅色吧。

        //設置畫筆的顏色
        paint.setColor(Color.RED);

這裡的顏色是一個int類型的整數,是一個ARGB值。系統提供了幾種常用顏色做為常量,比如Color.RED=0xFFFF0000,你也可以按照自己的喜好設置一種顏色。

下麵我們以畫左邊的三角形為例。

畫布上的每一個像素都有它的坐標,坐標系原點是畫布的左上角。要畫三角形就需要知道三個頂點的坐標。

設畫布寬為width,高為height;

則畫布4個頂點和中心點的坐標分別是:

        左上點 0,0
        左下點 0,height
        右上點 width,0
        右下點 width,height
        中心點 width/2,height/2

那麼左邊三角形的三個頂點坐標分別是(0,0)(width/2,height/2)(0,height)

下麵該path對象出場了。path的意思是路徑,它能告訴程式沿著設計好的路徑畫圖。我們知道三角形是由三段直線段組成的,程式中也是這麼設計的:

        //畫布的寬
        int width = canvas.getWidth();
        //畫布的高
        int height = canvas.getHeight();


        //畫左方向鍵背景三角形的路徑
        Path pathLeft = new Path();
        //從畫布左上點開始
        pathLeft.moveTo(0, 0);
        //畫直線到畫布中心點
        pathLeft.lineTo(width / 2, height / 2);
        //再畫直線到畫布左下點
        pathLeft.lineTo(0, height);
        //自動閉合圖形。從最後一個點(左下點)畫直線到第一個點(左上點)。
        pathLeft.close();

到目前為止DirectionKeys類的所有代碼如下:

package net.chengyujia.happysnake;

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

/**
 * Created by ChengYuJia on 2016/8/19.
 * 屏幕上的虛擬方向鍵
 */
public class DirectionKeys extends View {

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

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

    /**
     * 通過重寫父類的onDraw方法來繪製我們需要的圖形
     *
     * @param canvas 這裡的canvas是系統提供的一塊矩形畫布,我們要做的就是在這塊畫布上畫我們想要的東西。
     */
    @Override
    protected void onDraw(Canvas canvas) {
        //畫布的寬
        int width = canvas.getWidth();
        //畫布的高
        int height = canvas.getHeight();
        /*
        (小提示:在電腦中一般都是將左上角作為坐標原點的)
        畫布上四個頂點和中心點的坐標如下:
        左上點 0,0
        左下點 0,height
        右上點 width,0
        右下點 width,height
        中心點 width/2,height/2
        */

        //畫左方向鍵背景三角形的路徑
        Path pathLeft = new Path();
        //從畫布左上點開始
        pathLeft.moveTo(0, 0);
        //畫直線到畫布中心點
        pathLeft.lineTo(width / 2, height / 2);
        //再畫直線到畫布左下點
        pathLeft.lineTo(0, height);
        //自動閉合圖形。從最後一個點(左下點)畫直線到第一個點(左上點)。
        pathLeft.close();

        //準備畫筆
        Paint paint = new Paint();
        //設置畫筆的顏色
        paint.setColor(Color.RED);
        //設置畫筆為實心(預設就是實心,這裡不設置也行)
        paint.setStyle(Paint.Style.FILL);
        //按照剛纔的路徑設計畫了一個實心的紅色三角形
        canvas.drawPath(pathLeft, paint);
    }
}

二、測試

現在我們就能用一下我們自定義的控制項了,和用系統自帶的控制項一樣,只不過在XML佈局文件中需要用類的全名做標簽,不然會報錯。

我們將MainActivity的佈局文件修改如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="net.chengyujia.happysnake.MainActivity">

    <!--自定義控制項一定要用類的全名,不然會報錯。-->
    <net.chengyujia.happysnake.DirectionKeys
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

然後運行一下,截圖如下:

好了,本篇到此結束,下篇繼續。

如果遇到問題可以在下麵的評論中交流。^_^


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

-Advertisement-
Play Games
更多相關文章
  • Handler的主要用途有兩個:(1)、在將來的某個時刻執行消息或一個runnable,(2)把消息發送到消息隊列。 主要依靠post(Runnable)、postAtTime(Runnable, long)、postDelayed(Runnable, long)、sendEmptyMessage( ...
  • - (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText // called when text changes (including clear) { if (searchBar.text.len ...
  • UITabBarController 定製 特點 用法 1.準備好你的tabBar圖片及其他圖片(哈哈哈!!!!),我的圖片都放在了Assets.xcassets中. 2.導入本工程中的Categroy文件夾, 其中包含: HexColor.h/.m(設置顏色的), NSString+Renderi ...
  • 設置註釋模板的入口:Window->Preference->Java->Code Style->Code Template 然後展開Comments節點就是所有需設置註釋的元素。本文現就每一個元素逐一給大家介紹一下。 文件(Files)註釋標簽: 1 2 3 4 5 6 7 8 /** * @Tit ...
  • ...
  • 偶然中發現Android Studio的工程文件夾比ADT Bundle的大很多。用Android Studio新建一個空工程,工程文件夾大小為30M,運行一次後大小為40M。同樣用ADT Bundle新建一個空工程,工程文件夾大小為1.5M,運行一次後大小為3.8M。天哪!Android Stud ...
  • _checkAllIntroduceTextView = [[UITextView alloc] initWithFrame:CGRectMake(10, 0, kScreenWidth-20, kScreenHeight)]; _checkAllIntroduceTextView.backgrou ...
  • 首先就是你的Github主頁了. 第二步點擊進入一個repository(倉庫) 第三步點擊右上的setting 將此頁面滑動到最下麵找個這個 點擊刪除即可! ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...