畫了個Android

畫了個Android

?

?

?? 今晚瞎折騰,閑著沒事畫了個機器人——android,浪費了一個晚上的時間。畫這丫還真不容易,為那些坐標,差點砸了鍵盤,好在最后畫出個有模有樣的,心稍安。

?? 下面來看看畫這么個機器人需要些什么東西:主要是Canvas類(android.graphics.Canvas)。Canvas類就是表示一塊畫布,你可以在上面畫你想畫的東西。當然,你還可以設置畫布的屬性,如畫布的顏色/尺寸等。Canvas提供了如下一些方法:


?? ?Canvas():創建一個空的畫布,可以使用setBitmap()方法來設置繪制的具體畫布;


?? ?Canvas(Bitmap bitmap):以bitmap對象創建一個畫布,則將內容都繪制在bitmap上,bitmap不得為null;


?? ?Canvas(GL gl):在繪制3D效果時使用,與OpenGL有關;


?? ?drawColor:設置畫布的背景色;


?? ?setBitmap:設置具體的畫布;


?? ?clipRect:設置顯示區域,即設置裁剪區;


?? ?isOpaque:檢測是否支持透明;


?? ?rotate:旋轉畫布;

?

??下面我們就用Canvas來畫一個機器人——android,oh my love!一看就知道,機器人的外形是由矩形/圓/圓弧/線條組成的,因此要知道怎么用Canvas畫矩形/圓/圓弧和線條。可惜阿,上面幾個方法基本都沒用上。


?? ?canvas.drawRect(RectF,Paint)方法用于畫矩形,第一個參數為圖形顯示區域,第二個參數為畫筆,設置好圖形顯示區域Rect和畫筆Paint后,即可畫圖;


?? ?canvas.drawRoundRect(RectF, float, float, Paint) 方法用于畫圓角矩形,第一個參數為圖形顯示區域,第二個參數和第三個參數分別是水平圓角半徑和垂直圓角半徑。


?? ?canvas.drawLine(startX, startY, stopX, stopY, paint):前四個參數的類型均為float,最后一個參數類型為Paint。表示用畫筆paint從點(startX,startY)到點(stopX,stopY)畫一條直線;


?? ?canvas.drawArc(oval, startAngle, sweepAngle, useCenter, paint):第一個參數oval為RectF類型,即圓弧顯示區域,startAngle和sweepAngle均為float類型,分別表示圓弧起始角度和圓弧度數,3點鐘方向為0度,useCenter設置是否顯示圓心,boolean類型,paint為畫筆;


?? ?canvas.drawCircle(float,float, float, Paint)方法用于畫圓,前兩個參數代表圓心坐標,第三個參數為圓半徑,第四個參數是畫筆;


???清楚這些函數的用法之后,我們是否就噼里啪啦地敲代碼了呢?別急,我們來搞個設計。既然這些函數都是用來畫圖的,也就是說它們有共性——畫。所有我們應該設計一個接口interface,對于這次任務,只需要一個成員方法就足夠了。對于每一個圖形,是只用一個方法畫,還是將畫圖封裝成類呢?我建議是封裝成類。因為說不定你明天就會嫌棄它不會動,想它動起來,或者你過兩天又希望在機器人的每個部位加點什么。所以我將每一個圖形封裝成類,都實現一個名叫drawGraphics的接口。最后,要記得給UI創建一個線程哦。


???就這樣我開始動手做了,但是很快就發現問題了。什么問題?在定位的時候,也就是設置每個圖形的顯示區域時,我自以為這里的Rect跟Java的Rectangle是一樣的,但我錯了。原來這廝跟MFC中的RECT結構才是一家人,害我折騰了許久。


????Rect(int left,int top,int right,int bottom)

?

?? ?left

?? ? ? ? ? ???矩形左上角X坐標值

????top

?? ? ? ? ? ? ?矩形左上角Y坐標值

?? ?right

?? ? ? ? ? ? ?矩形右下角X坐標值

????bottom

?? ? ? ? ? ? ?矩形右下角Y坐標值


???下面借用一張圖說明(忘了哪個博客找來的(*^__^*) 嘻嘻……),如Rect(150, 75, 260, 120) 一目了然吧。


?

畫了個Android鈥斺擟anvas類的使用

?? ?還有一點非常重要的是,屏幕最上方的狀態欄和標題欄總占去來50的高度,同時坐標原點下移到標題欄下方,即如果你的手機屏幕分辨率為(320X480),編程時如果沒有設置去除狀態欄和標題欄,你只能操控的范圍只有(320X430),而且坐標原點下移。記住咯。

?

//drawGraphics.java

package??com.scgm.android.drawable;

import?android.graphics.Canvas;

?

?

public?interface??drawGraphics {

public?void??draw(Canvas canvas);

}

?

?

?

package??com.scgm.android.drawable;

?

import?android.content.Context;

import??android.graphics.Canvas;

import?android.graphics.Color;

import?android.graphics.Paint;

import?android.view.View;

?

?

?

public?classGameView ?extends?View ?implements??Runnable{

?

?? ? ? ?//聲明Paint對象

?? ? ? private??Paint mPaint= null;

?? ? ? privatedrawGraphics drawGraphics= null;

?

?? ? ?

?? ? ? public?GameView(Context context) {

?? ? ? ? ? ?super(context);

?? ? ? ? ? // TODOAuto-generated constructor stub

?? ? ? ? ? //構建對象

?? ? ? ? ? mPaint= new?Paint();

?? ? ? ? ? //開啟線程

?? ? ? ? ? new??Thread(this).start();

?? ? ? }

?

?? ? ? public?void??onDraw(Canvas canvas) {

?? ? ? ? ? super.onDraw(canvas);

?? ? ? ? ? //設置畫布為黑色背景

?? ? ? ? ? //canvas.drawColor(Color.BLACK);

?? ? ? ? ? //消除鋸齒

?? ? ? ? ? mPaint.setAntiAlias(true);

?? ? ? ? ?//設置圖形為空心

?? ? ? ? ? mPaint.setStyle(Paint.Style.STROKE);

?? ? ? ? ? //繪制空心幾何圖形

?? ? ? ? ? drawGraphics= ?new??DrawCircle();

?? ? ? ? ? drawGraphics.draw(canvas);

?? ? ? ? ? drawGraphics= ?new??DrawLine();

?? ? ? ? ? drawGraphics.draw(canvas);

?? ? ? ? ? drawGraphics= newDrawRect();

?? ? ? ? ? drawGraphics.draw(canvas);

?? ? ? }

?

?? ? ? ?

?? ? ? ? ?@Override

?? ? ? ? ?public?void?run() {

?? ? ? ? ? ? ? // TODOAuto-generated method stub

?? ? ? ? ? ? ? while(!Thread.currentThread().isInterrupted()) {

?? ? ? ? ? ? ? ? ? ?try{

?? ? ? ? ? ? ? ? ? ? ? ? ?Thread.sleep(1000);

?? ? ? ? ? ? ? ? ? ?} catch(InterruptedException e) {

?? ? ? ? ? ? ? ? ? ? ?// TODO: handle exception

?? ? ? ? ? ? ? ? ? ? ?Thread.currentThread().interrupt();

?? ? ? ? ? ? ? ? ? ?}

?? ? ? ? ? ? ? ? ? ? //使用postInvalidate 可以直接在線程中更新界面

?? ? ? ? ? ? ? ? ? ? ?postInvalidate();?

?? ? ? ? ? ? ? }

?? ? ? ? }

?

}

?

//DrawRect.java

package?com.scgm.android.drawable;

?

import?android.graphics.Canvas;

import?android.graphics.Color;

import?android.graphics.Paint;

import?android.graphics.RectF;

?

?

?

public?class?DrawRect ?implements??drawGraphics{

?

?? ? ? private??Paint paint= ?null;

?

?? ? ? public?DrawRect(){

?? ? ? paint= new??Paint();

}

?

?? ? ?

?? ? ? ? @Override

?? ? ? ? public?void??draw(Canvas canvas) {

?? ? ? ? ? ? // TODOAuto-generated method stub

?? ? ? ? ? ? //定義圓角矩形對象

?? ? ? ? ? ? RectF rectF1 = newRectF(120,170,370,500);

?? ? ? ? ? ? RectF rectF2 = newRectF(40,150,90,400);

?? ? ? ? ? ? RectF rectF3 = newRectF(390,150,440,400);

?? ? ? ? ? ? RectF rectF4 = newRectF(140,520,200,650);

?? ? ? ? ? ? RectF rectF5 = newRectF(290,520,350,650);

?? ? ? ? ? ? paint.setAntiAlias(true);

?? ? ? ? ? ? //設置畫筆顏色為BLUE

?? ? ? ? ? ? paint.setColor(Color.GREEN);

?? ? ? ? ? ? //在畫布上繪制圓角矩形/圓弧/直線

?? ? ? ? ? ? canvas.drawRoundRect(rectF1, 20, 20, paint);

?? ? ? ? ? ? canvas.drawRoundRect(rectF2, 20, 20, paint);

?? ? ? ? ? ? canvas.drawRoundRect(rectF3, 20, 20, paint);

?? ? ? ? ? ? canvas.drawRoundRect(rectF4, 20, 20, paint);

?? ? ? ? ? ? canvas.drawRoundRect(rectF5, 20, 20, paint);

?? ? ? ?}

}

?

//DrawLine.java

package??com.scgm.android.drawable;

?

import?android.graphics.Canvas;

import??android.graphics.Color;

import?android.graphics.Paint;

?

?

public?class?DrawLine ?implements??drawGraphics{

?

?? ? ? private?Paint paint= ?null;

?

?? ? ? public??DrawLine(){

?? ? ? ? ? paint= ?new??Paint();

?? ? ? }

?? ? ?

?? ? ? ?@Override

?? ? ? ?publicvoiddraw(Canvas canvas) {

?? ? ? ? ? ?// TODOAuto-generated method stub

?? ? ? ? ? ?paint.setAntiAlias(true);

?? ? ? ? ? ?//繪制直線

?? ? ? ? ? ?paint.setColor(Color.GREEN);

?? ? ? ? ? ?//設置線條粗細

?? ? ? ? ? ?paint.setStrokeWidth(12);

?? ? ? ? ? ?canvas.drawLine(120,40,170,90, paint);

?? ? ? ? ? ?canvas.drawLine(320,90,370,40, paint);

?? ? ? }

}

?

//DrawCircle.java

package?com.scgm.android.drawable;

?

import?android.graphics.Canvas;

import??android.graphics.Color;

import??android.graphics.Paint;

import?android.graphics.RectF;

?

?

public?class?DrawCircle ?implements??drawGraphics{

?

?? ? ? ?private??Paint paint= ?null;

?? ? ? ?private??Paint paint_eye= ?null;

?

?? ? ? ?public??DrawCircle(){

?? ? ? ?paint= new??Paint();

?? ? ? ?paint_eye= new??Paint();

}

?? ? ?

?? ? ? ?@Override

?? ? ? ?public??void?draw(Canvas canvas) {

?? ? ? ? ? ? // TODOAuto-generated method stub

?? ? ? ? ? ? //繪制圓形(圓心x,圓心y,半徑r,畫筆p)

?? ? ? ? ? ? paint_eye.setAntiAlias(true);

?? ? ? ? ? ? paint.setAntiAlias(true);

?? ? ? ? ? ? RectF rectF = newRectF(120,60,370,240);

?? ? ? ? ? ? paint_eye.setColor(Color.WHITE);

?? ? ? ? ? ? paint.setColor(Color.GREEN);

?? ? ? ? ? ? canvas.drawCircle(190, 110, 18, paint_eye);

?? ? ? ? ? ? canvas.drawCircle(300, 110, 18, paint_eye);

?? ? ? ? ? ? canvas.drawArc(rectF, 180, 180,true, paint);

?? ? ? ?}

}

?

//GameStart.java

package??com.scgm.android.drawable;

?

import??android.app.Activity;

import?android.os.Bundle;?

?

public?class?GameStart ?extends??Activity {

?

?? ? ?private??GameView mGameView= ?null;?

?

?? ?

?? ? ?@Override

?? ? ?public??void??onCreate(Bundle??savedInstanceState) {?

?? ? ? ? ?super.onCreate(savedInstanceState);

?? ? ? ? ?this.mGameView= newGameView(this);

?? ? ? ? ?setContentView(mGameView);

?? ? ?}

}

?

?

運行效果圖:


?? ? ? ? ? ? ? ? ? ? ? ? 畫了個Android鈥斺擟anvas類的使用

?

?

?

?? ? ?還可以吧:-)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/388797.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/388797.shtml
英文地址,請注明出處:http://en.pswp.cn/news/388797.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據治理 主數據 元數據_我們對數據治理的誤解

數據治理 主數據 元數據Data governance is top of mind for many of my customers, particularly in light of GDPR, CCPA, COVID-19, and any number of other acronyms that speak to the increasing importance of data management when it comes to protecting user data.…

mysql 選擇前4個_mysql從4個表中選擇

不要認為GROUP BY是必需的 . 雖然如果一個孩子有2個父記錄,你可能想用它來將2個父母分組到一行 - 但不確定這是否是你的要求 . 因為如果一個孩子有2個父母,那么將為該孩子返回的父母是未定義的 .假設所有孩子都有父母,所有父母都會有姓&#…

提高機器學習質量的想法_如何提高機器學習的數據質量?

提高機器學習質量的想法The ultimate goal of every data scientist or Machine Learning evangelist is to create a better model with higher predictive accuracy. However, in the pursuit of fine-tuning hyperparameters or improving modeling algorithms, data might …

mysql 集群實踐_MySQL Cluster集群探索與實踐

MySQL集群是一種在無共享架構(SNA,Share Nothing Architecture)系統里應用內存數據庫集群的技術。這種無共享的架構可以使得系統使用低廉的硬件獲取高的可擴展性。MySQL集群是一種分布式設計,目標是要達到沒有任何單點故障點。因此,任何組成部…

Python基礎:搭建開發環境(1)

1.Python語言簡介 2.Python環境 Python環境產品存在多個。 2.1 CPython CPython是Python官方提供的。一般情況下提到的Python就是指CPython,CPython是基于C語言編寫的。 CPython實現的解釋器將源代碼編譯為字節碼(ByteCode),再由虛…

python數據結構之隊列(一)

隊列概念隊列(queue)是只允許在一端進行插入操作,而在另一端進行刪除操作的線性表。隊列是一種先進先出的(First In First Out)的線性表,簡稱FIFO。允許插入的一端為隊尾,允許刪除的一端為隊頭。…

Android實現圖片放大縮小

Android實現圖片放大縮小 package com.min.Test_Gallery; import Android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Color; import android.graphics.Matrix; import android.os.Bun…

matlab散點圖折線圖_什么是散點圖以及何時使用

matlab散點圖折線圖When you were learning algebra back in high school, you might not have realized that one day you would need to create a scatter plot to demonstrate real-world results.當您在高中學習代數時,您可能沒有意識到有一天需要創建一個散點圖…

java判斷題_【Java判斷題】請大神們進來看下、這些判斷題你都知道多少~

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓、判斷改錯題(每題2分,共20分)(正確的打√,錯誤的打并說明原因)1、 Java系統包提供了很多預定義類,我們可以直接引用它們而不必從頭開始編寫程序。 ( )2、 程序可以用字符‘*’替代一個TextField中的每個字…

PoPo數據可視化第8期

PoPo數據可視化 聚焦于Web數據可視化與可視化交互領域,發現可視化領域有意思的內容。不想錯過可視化領域的精彩內容, 就快快關注我們吧 :) 微信訂閱號:popodv_com谷歌決定關閉云可視化服務 Fusion Tables谷歌宣布即將關閉其 Fusion Tables 云服務&#x…

AC自動機題單

AC自動機題目 真的超級感謝xzy 真的幫到我很多 題單 [X] [luogu3808]【模板】AC自動機(簡單版) https://www.luogu.org/problemnew/show/P3808[X] [luogu3796]【模板】AC自動機(加強版)https://www.luogu.org/problemnew/show/P37…

java list用法_Java List 用法詳解及實例分析

Java List 用法詳解及實例分析Java中可變數組的原理就是不斷的創建新的數組,將原數組加到新的數組中,下文對Java List用法做了詳解。List:元素是有序的(怎么存的就怎么取出來,順序不會亂),元素可以重復(角標1上有個3,角標2上也可以…

python字符串和List:索引值以 0 為開始值,-1 為從末尾的開始位置;值和位置的區別哦...

String(字符串)Python中的字符串用單引號 或雙引號 " 括起來,同時使用反斜杠 \ 轉義特殊字符。 字符串的截取的語法格式如下: 變量[頭下標:尾下標]索引值以 0 為開始值,-1 為從末尾的開始位置。[一個是值&#x…

邏輯回歸 python_深入研究Python的邏輯回歸

邏輯回歸 pythonClassification techniques are an essential part of machine learning and data science applications. Approximately 70% of problems in machine learning are classification problems. There are lots of classification problems that are available, b…

spring定時任務(@Scheduled注解)

(一)在xml里加入task的命名空間 xmlns:task"http://www.springframework.org/schema/task" http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.1.xsd(二)啟用注…

net user 用戶名 密碼 /add 建立用戶

net user 用戶名 密碼 /add 建立用戶 other: net use \\ip\ipc$ " " /user:" " 建立IPC空鏈接 net use \\ip\ipc$ "密碼" /user:"用戶名" 建立IPC非空鏈接 net use h: \\ip\c$ "密碼" /user:"用戶名" 直接登陸后映…

JavaScript是如何工作的:與WebAssembly比較及其使用場景

*摘要:** WebAssembly未來可期。 原文:JavaScript是如何工作的:與WebAssembly比較及其使用場景作者:前端小智Fundebug經授權轉載,版權歸原作者所有。 這是專門探索 JavaScript及其所構建的組件的系列文章的第6篇。 如果…

友元 java_C++ 友元關系詳解

在C中,在某些情況下,允許特定的非成員函數訪問一個類的私有成員,同時仍然阻止一般的訪問,這是很方便做到的。例如,被重載的操作符,如輸入或輸出操作符,經常需要訪問類的私有數據成員。這些操作符…

Matplotlib中的“ plt”和“ ax”到底是什么?

Indeed, as the most popular and fundamental data visualisation library, Matplotlib is kind of confusing in some perspectives. It is usually to see that someone asking about的確,作為最受歡迎的基礎數據可視化庫,Matplotlib在某些方面令人困…

【數據庫的備份與還原】 .

差異備份,日志備份還原 IF DB_ID(db) IS NOT NULL DROP DATABASE db GO CREATE DATABASE db GO CREATE TABLE db.dbo.T(ID INT PRIMARY KEY IDENTITY(1,1)); GO BACKUP DATABASE db TO DISKd:/1.bak WITH FORMAT GO INSERT INTO db.dbo.T DEFAULT VALUES GO BACKUP DATAB…