Android Canvas 開發詳解

Android Canvas 是 Android 系統中一個非常重要的繪圖工具,它允許我們在 Android 應用程序中創建自定義的 2D 和 3D 繪圖。本文將介紹 Android Canvas 的各種用法,包括平移縮放、畫圓寫字、拋物效果、.rotate、繪製 Z 軸、地球代碼、繪製 XYZ 軸、畫圓 Path 寫字等方面。

一、android Canvas 平移縮放

平移和縮放是 Android 中畫圖的基本操作,下面我們來看看如何使用 Android Canvas 進行平移和縮放操作。

1、平移操作

我們可以使用 canvas.translate(dx, dy) 方法來對畫布進行平移操作。


canvas.drawText("Hello, world!", 50, 50, mPaint); // 繪製文本
canvas.translate(100, 100); // 平移畫布
canvas.drawText("Hello, world!", 50, 50, mPaint); // 繪製文本

上面的代碼將會在畫布上分別繪製兩行文本,第一行文本在 (50, 50) 處繪製,第二行文本會在畫布上向右平移 100,向下平移 100 後繪製(也就是在 (150, 150) 處繪製)。

2、縮放操作

另外,我們可以使用 canvas.scale(sx, sy) 來對畫布進行縮放操作。


canvas.drawText("Hello, world!", 50, 50, mPaint); // 繪製文本
canvas.scale(2f, 2f); // 縮放畫布
canvas.drawText("Hello, world!", 50, 50, mPaint); // 繪製文本

上面的代碼將會繪製兩行文本,第一行文本在 (50, 50) 處繪製,第二行文本會在畫布上將字體放大 2 倍後繪製。

二、android Canvas 畫圓寫字

Android Canvas 可以非常輕鬆地繪製一些 2D 圖形,本小節介紹如何使用 Android Canvas 繪製圓形和繪製文字。

1、繪製圓形

使用 canvas.drawCircle(x, y, radius, paint) 方法來繪製一個圓形:


canvas.drawCircle(100, 100, 50, mPaint); // 繪製一個半徑為 50 的圓形

上面的代碼將在畫布上繪製一個坐標為 (100, 100) 的圓形,半徑為 50,使用當前畫筆(mPaint)進行繪製。

2、繪製文字

使用 canvas.drawText(text, x, y, paint) 方法來繪製文字。


canvas.drawText("Hello, world!", 100, 100, mPaint); // 在坐標 (100, 100) 處繪製 "Hello, world!" 文字

上面的代碼將在畫布上繪製一行文字 “Hello, world!”,坐標為 (100, 100),使用當前畫筆(mPaint)進行繪製。

三、android Canvas 拋物效果

拋物線是計算機繪圖中經常使用的一個曲線,可以模擬模擬很多物理場景,下面我們來看看如何使用 Android Canvas 實現拋物效果。


private int mRadius = 20; // 小球半徑
private int mDeltaX = 5; // 每次水平移動的距離
private int mDeltaY = 5; // 每次垂直移動的距離
private int mScreenWidth; // 屏幕寬度
private int mScreenHeight; // 屏幕高度

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    canvas.drawColor(Color.WHITE);

    int x = getWidth() / 2;
    int y = getHeight() / 2;
    canvas.drawCircle(x, y, mRadius, mPaint);

    // 計算小球下一次的位置
    mDeltaY += 1;
    x += mDeltaX;
    y += mDeltaY;

    // 判斷是否撞擊到邊界
    if (x = mScreenWidth - mRadius) {
        mDeltaX = -mDeltaX;
    }
    if (y = mScreenHeight - mRadius) {
        mDeltaY = -mDeltaY;
    }

    postInvalidateDelayed(10); // 刷新界面
}

上面代碼實現了一個小球拋物的動畫效果,啟動該 View 後,小球會按照一定的速度移動並彈跳,直到撞到屏幕邊界才會回彈。

四、android Canvas 的.rotate

Canvas 的 .rotate(float degrees, float px, float py) 方法可以對繪圖進行旋轉操作,其中 (px, py) 表示旋轉的中心點。


canvas.drawRect(0, 0, 200, 200, mPaint); // 繪製一個矩形

canvas.translate(100, 100); // 將原點移動到 (100, 100)
canvas.rotate(45); // 以 (100, 100) 為中心點進行旋轉
canvas.drawRect(0, 0, 200, 200, mPaint); // 繪製一個旋轉後的矩形

上面的代碼將會繪製兩個矩形,第一個矩形將被繪製在畫布的左上角位置,紅色邊框;第二個矩形在進行了畫布平移操作後,進行了一次 45 度的旋轉,並且以 (100, 100) 為中心點進行旋轉操作。

五、android Canvas 縮放

Android Canvas 可以非常輕鬆地進行縮放操作,只需要對主函數進行的畫布平移和旋轉操作進行函數調用即可。


canvas.drawRect(0, 0, 200, 200, mPaint); // 繪製一個矩形

canvas.scale(0.5f, 0.5f); // 將畫布縮小為原來的一半
canvas.drawRect(0, 0, 200, 200, mPaint); // 繪製一個縮小後的矩形

上面的代碼將繪製兩個矩形,第一個矩形位於畫布的左上角,紅色邊框;第二個矩形進行了畫布的縮放操作,縮小了一半。

六、android Canvas 繪製 Z 軸

在 3D 應用程序開發中,我們經常需要在屏幕上繪製一些 3D 圖像,本小節將介紹如何使用 Android Canvas 繪製出 3D 空間中的 Z 軸。


Path path = new Path();
path.moveTo(0, 0);
path.lineTo(0, 200);
path.lineTo(20, 180);
path.lineTo(0, 200);
path.lineTo(-20, 180);

canvas.drawPath(path, mPaint);

上面的代碼使用 canvas.drawPath() 方法來繪製 Z 軸,具體做法是先繪製垂直線段,然後繪製兩條斜線段。

七、android Canvas 地球代碼

下面提供一個 Android Canvas 繪製地球的實例代碼,該代碼使用 Bitmap、Matrix、Canvas 和 Paint 等多種 Android 繪圖工具來完成,您可以將其複製到 Android 應用程序中進行測試。


public class EarthView extends View {
    private Bitmap mBgBitmap;
    private Bitmap mEarthBitmap;
    private Matrix mMatrix;
    private Paint mPaint;

    public EarthView(Context context) {
        super(context);
        init();
    }

    public EarthView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    private void init() {
        mBgBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.bg_stars);
        mEarthBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_earth);
        mMatrix = new Matrix();
        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        // 繪製背景
        canvas.drawBitmap(mBgBitmap, null, new RectF(0, 0, getWidth(), getHeight()), mPaint);

        // 計算旋轉角度
        float degrees = (float) ((System.currentTimeMillis() / 10) % 360);
        mMatrix.setRotate(degrees, mEarthBitmap.getWidth() / 2f, mEarthBitmap.getHeight() / 2f);

        // 繪製地球
        canvas.save();
        canvas.translate(getWidth() / 2, getHeight() / 2);
        canvas.drawBitmap(mEarthBitmap, mMatrix, mPaint);
        canvas.restore();

        invalidate(); // 刷新畫面
    }
}

上面的代碼實現了一個類似於地球自轉效果,並在背景上繪製了一張星空背景。

八、android Canvas 繪製 XYZ 軸

下面的代碼會繪製出一個全方位的 XYZ 坐標系,使用了 Line 和 Path 兩種對象來繪製。該做法較為簡單,使用者可以根據實際需求進行更改。


canvas.drawLine(0, 0, 500, 0, paint); // X 軸
canvas.drawLine(0, 0, 0, 500, paint); // Y 軸
canvas.save();
canvas.translate(0, 500);
canvas.rotate(-90);
Path path = new Path();
path.moveTo(0, 0);
path.lineTo(20, 0);
path.lineTo(10, -20);
path.close();
canvas.drawPath(path, paint); // Z 軸
canvas.restore();

九、android Canvas 畫圓 Path 寫字

有時候我們也可以使用 Path 來幫助我們實現更加複雜的圖案和文字等,下面的代碼將繪製一個大圓餅圖,並在圓心區域顯示一段描述文字。


Path path = new Path();
path.addArc(new RectF(100, 100, 400, 400), -180, 180);
path.lineTo(250, 250);
path.close();

canvas.drawPath(path, paint); // 繪製扇形
canvas.drawTextOnPath("This is a message to show on the circle", path, 0, 0, mPaint); // 圓形中心文字

上面的代碼繪製了一個具有描述文字的大圓餅圖,並且使用了 Path 對象來繪製扇形。

本文介紹了 Android Canvas 的各種使用方法,包括平移縮放、畫圓寫字、拋物效果、.rotate、繪製 Z 軸、地球代碼、繪製 XYZ 軸、畫圓 Path 寫字等方面,對於 Android 應用程序開發者而言,熟練掌握 Android Canvas 的使用是非常重要的。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/187429.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-28 06:22
下一篇 2024-11-28 06:22

相關推薦

  • Android ViewPager和ScrollView滑動衝突問題

    Android開發中,ViewPager和ScrollView是兩個常用的控制項。但是當它們同時使用時,可能會發生滑動衝突的問題。本文將從多個方面介紹解決Android ViewPa…

    編程 2025-04-28
  • Android如何點擊其他區域收起軟鍵盤

    在Android應用中,當輸入框獲取焦點彈出軟鍵盤後,我們希望能夠點擊其他區域使軟鍵盤消失,以提升用戶體驗。本篇文章將說明如何實現這一功能。 一、獲取焦點並顯示軟鍵盤 在Andro…

    編程 2025-04-28
  • Android Studio HUD 實現指南

    本文將會以實例來詳細闡述如何在 Android Studio 中使用 HUD 功能實現菊花等待指示器的效果。 一、引入依賴庫 首先,我們需要在 build.gradle 文件中引入…

    編程 2025-04-27
  • Android和Vue3混合開發方案

    本文將介紹如何將Android和Vue3結合起來進行混合開發,以及其中的優勢和注意事項。 一、環境搭建 在進行混合開發之前,需要搭建好相應的開發環境。首先需要安裝 Android …

    編程 2025-04-27
  • Android Java Utils 可以如何提高你的開發效率

    Android Java Utils 是一款提供了一系列方便實用的工具類的 Java 庫,可以幫助開發者更加高效地進行 Android 開發,提高開發效率。本文將從以下幾個方面對 …

    編程 2025-04-27
  • 神經網路代碼詳解

    神經網路作為一種人工智慧技術,被廣泛應用於語音識別、圖像識別、自然語言處理等領域。而神經網路的模型編寫,離不開代碼。本文將從多個方面詳細闡述神經網路模型編寫的代碼技術。 一、神經網…

    編程 2025-04-25
  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁碟中。在執行sync之前,所有的文件系統更新將不會立即寫入磁碟,而是先緩存在內存…

    編程 2025-04-25
  • git config user.name的詳解

    一、為什麼要使用git config user.name? git是一個非常流行的分散式版本控制系統,很多程序員都會用到它。在使用git commit提交代碼時,需要記錄commi…

    編程 2025-04-25
  • nginx與apache應用開發詳解

    一、概述 nginx和apache都是常見的web伺服器。nginx是一個高性能的反向代理web伺服器,將負載均衡和緩存集成在了一起,可以動靜分離。apache是一個可擴展的web…

    編程 2025-04-25
  • Linux修改文件名命令詳解

    在Linux系統中,修改文件名是一個很常見的操作。Linux提供了多種方式來修改文件名,這篇文章將介紹Linux修改文件名的詳細操作。 一、mv命令 mv命令是Linux下的常用命…

    編程 2025-04-25

發表回復

登錄後才能評論