導航:首頁 > 編程語言 > canvas編程代碼

canvas編程代碼

發布時間:2022-12-28 09:33:08

❶ 我在使用 DELPHI 編程的時候 用CANVAS.MOVETO (0,0) ; CANVAS LINETO

這里注意TForm和TImage兩種控制項的TCanvas屬性區別
Tform.canvas繪制完圖像後,並不保存,如果窗體的圖像被其他窗體或控制項遮蓋,相應部分圖像將不再重繪而丟失。因此,你所繪制的圖像要在Form的Onpaint事件中人工重新繪制一次。

而Timage.canvas繪制圖像後隨時保存,不會有上面的效果。畢竟Timage是專門用來做圖像的。

❷ 微信小程序中canvas.drawImage畫圖

描述:在頁面載入是使用canvas.drawImage畫圖,點擊頁面下面按鈕在已繪制好的圖形上繼續畫圖。使用ctx.draw()弄了多次,均會把之前的圖清掉重新繪制,看文檔得知,在ctx.draw()時,傳入參數true即可保存原來繪制的圖,在此記錄一下。
詳見如下:
canvas使用:
index.wxml中

js中

❸ HTML5中Canvas的事件處理介紹

DOM是Web前端領域非常重要的組成部分,不僅在處理HTML元素時會用到DOM,圖形編程也同樣會用到。比如SVG繪圖,各種圖形都是以DOM節點的形式插入到頁面中,這就意味著可以使用DOM方法對圖形進行操作。比如有一個 元素,可以直接用jquery增加click事件$('#p1').click(function(){…})"。然而這種DOM處理方法在HTML5的Canvas里不再適用,Canvas使用的是另外一套機制,無論在Canvas上繪制多少圖形,Canvas都是一個整體,圖形本身實際都是Canvas的一部分,不可單獨獲取,所以也就無法直接給某個圖形增加javaScript事件。

Canvas的限制

在Canvas里,所有圖形都繪制在幀上,繪制方法不會將繪制好的圖形元素作為一個返回值輸出,js也無法獲取到已經繪制好的圖形元素。比如:

代碼如下:

cvs = document.getElementById('mycanvas');

ctx = canvas.getContext('2d');

theRect = ctx.rect(10, 10, 100, 100);

ctx.stroke();

console.log(theRect); //undefined

這段代碼在canvas標簽里繪制了一個矩形,首先可以看到繪制圖形的rect方法沒有返回值。如果打開瀏覽器的開發者工具,還可以看到canvas標簽內部沒有增加任何內容,而在js里獲取到的canvas元素以及當前的上下文,也都沒有任何錶示新增圖形的內容。

所以,前端常用的dom方法在canvas里是不適用的。比如點擊上面Canvas里的矩形,實際點擊的是整個Canvas元素。

給Canvas元素綁定事件

由於事件只能達到Canvas元素這一層,所以,如果想進一步深入,識別點擊發生在Canvas內部的`哪一個圖形上,就需要增加代碼來進行處理。基本思路是:給Canvas元素綁定事件,當事件發生時,檢查事件對象的位置,然後檢查哪些圖形覆蓋了該位置。比如上面的例子里畫過一個矩形,該矩形覆蓋x軸10-110、y軸10-110的范圍。只要滑鼠點擊在這個范圍里,就可以視為點擊了該矩形,也就可以手動觸發矩形需要處理的點擊事件。思路其實比較簡單,但是實現起來還是稍微有點復雜。不僅要考慮這個判斷過程的效率,有些地方還需要重新判斷事件類型,設置要重新定義一個Canvas內部的捕獲和冒泡機制。

首先要做的,是給Canvas元素綁定事件,比如Canvas內部某個圖形要綁定點擊事件,就需要通過Canvas元素代理該事件:

代碼如下:

cvs = document.getElementById('mycanvas');

cvs.addEventListener('click', function(e){

//...

}, false);

接下來需要判斷事件對象發生的位置,事件對象e的layerX和layerY屬性表示Canvas內部坐標系中的坐標。但是這個屬性Opera不支持,Safari也打算移除,所以要做一些兼容寫法:

代碼如下:

function getEventPosition(ev){

var x, y;

if (ev.layerX || ev.layerX == 0) {

x = ev.layerX;

y = ev.layerY;

} else if (ev.offsetX || ev.offsetX == 0) { // Opera

x = ev.offsetX;

y = ev.offsetY;

}

return {x: x, y: y};

}

//註:使用上面這個函數,需要給Canvas元素的position設為absolute。

現在有了事件對象的坐標位置,下面就要判斷Canvas里的圖形,有哪些覆蓋了這個坐標。

isPointInPath方法

Canvas的isPointInPath方法可以判斷當前上下文的圖形是否覆蓋了某個坐標,比如:

代碼如下:

cvs = document.getElementById('mycanvas');

ctx = canvas.getContext('2d');

ctx.rect(10, 10, 100, 100);

ctx.stroke();

ctx.isPointInPath(50, 50); //true

ctx.isPointInPath(5, 5); //false

接下來增加一個事件判斷,就可以判斷一個點擊事件是否發生在矩形上:

代碼如下:

cvs.addEventListener('click', function(e){

p = getEventPosition(e);

if(ctx.isPointInPath(p.x, p.y)){

//點擊了矩形

}

}, false);

以上就是處理Canvas事件的基本方法,但是上面的代碼還有局限,由於isPointInPath方法僅判斷當前上下文環境中的路徑,所以當Canvas里已經繪制了多個圖形時,僅能以最後一個圖形的上下文環境來判斷事件,比如:

代碼如下:

❹ java編程 關於canvas

直接加進去是沒有問題的,會不會你在上面多加了一個Panel?

final JFrame frame = new JFrame();
JPanel imagePanel = new JPanel(new BorderLayout());
imagePanel.add(new JPanel(), BorderLayout.NORTH); //如果加這句話的話就會出現橫條,沒有則無
Canvas canvas = new Canvas() {
public void paint(Graphics g) {
g.drawImage(image, 0, 0, frame.getWidth(), frame.getHeight(), null);
}
};
frame.setContentPane(imagePanel);
imagePanel.add(canvas, BorderLayout.CENTER);

❺ 微信小程序:canvas使用

canvas簡單理解成一張可以自定義大小(有上限)的畫布,在畫布上可以寫字,畫圖形,放置圖片。一般可以用來動態生成截圖,方便用戶保存和轉發。

官方資料:
https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.html

❻ canvas做太陽系怎樣才能讓地球繞著太陽轉

今天研究的是利用HTML5的Canvas畫圖來模擬太陽系運轉,首先,在這個太陽系裡分為畫軌道和畫星球兩個部分,
對於每一個星球我們要知道它的顏色和公轉周期,如下圖。

採用面向對象編程的思想,代碼如下

stars.html
[html] view plain
<!DOCTYPE HTML>

<html>
<head></head>
<body>
<canvas id="canvas" width="1000" height="1000" style="background:#000">
你的瀏覽器不支持canvas標簽!
</canvas>

<script src="stars.js">
</script>

</body>
</html>

stars.js
[javascript] view plain
/******************************************/
/* */
/* 本節代碼體現了用JavaScript編寫面向對 */
/* 象程序的思想,希望能認真閱讀理解。 */
/* */
/******************************************/

//設置2d繪圖環境
var ctx = document.getElementById("canvas").getContext("2d");

//畫軌道
function drawTrack(){
for(var i = 0; i < 8; i++){
ctx.beginPath();
ctx.arc(500, 500, (i + 1) * 50, 0, 360, false);
ctx.closePath();
ctx.strokeStyle = "#fff";
ctx.stroke();
}
}

//畫星球的類
function Star(x, y, radius, cycle, sColor, eColor){

//設置星球類的屬性
this.x = x; //星球的坐標點
this.y = y;

this.radius = radius; //星球的半徑
this.cycle = cycle; //設置周期
this.sColor = sColor; //星球的顏色,起始顏色和結束顏色
this.eColor = eColor;

this.color = null;
//設置一個計時器
this.time = 0;

//給星球類定義一個方法
this.draw = function(){
ctx.save(); //保存之前的內容
ctx.translate(500, 500); //重置0,0坐標
ctx.rotate(this.time * (360 / this.cycle) * Math.PI / 180); //旋轉角度

//畫星球
ctx.beginPath();
ctx.arc(this.x, this.y, this.radius, 0, 360, false);
ctx.closePath();
//設置星球的填充顏色
this.color = ctx.createRadialGradient(this.x, this.y, 0, this.x, this.y, this.radius);
this.color.addColorStop(0, this.sColor);
this.color.addColorStop(1, this.eColor);
ctx.fillStyle = this.color;
ctx.fill();
//恢復之前畫布的內容
ctx.restore();
this.time += 1;
}
}

//創建一個太陽的構造函數
function Sun(){
Star.call(this, 0, 0, 20, 0, "#FFFF00", "#FF9900");
}

//創建一個水星的構造函數
function Mercury(){
Star.call(this, 0, -50, 10, 87.70, "#A69697", "#5C3E40");
}

//創建一個金星的構造函數
function Venus(){
Star.call(this, 0, -100, 10, 224.701, "#C4BBAC", "#1F1315");
}

//創建一個地球的構造函數
function Earth(){
Star.call(this, 0, -150, 10, 365.2422, "#78B1E8", "#050C12");
}

//創建一個火星的構造函數
function Mars(){
Star.call(this, 0, -200, 10, 686.98, "#CEC9B6", "#76422D");
}

//創建一個木星的構造函數
function Jupiter(){
Star.call(this, 0, -250, 10, 4332.589, "#C0A48E", "#322222");
}
//創建一個土星的構造函數
function Saturn(){
Star.call(this, 0, -300, 10, 10759.5, "#F7F9E3", "#5C4533");
}
//創建一個天王星的構造函數
function Uranus(){
Star.call(this, 0, -350, 10, 30799.095, "#A7E1E5", "#19243A");
}
//創建一個海王星的構造函數
function Neptune(){
Star.call(this, 0, -400, 10, 60152, "#0661B2", "#1E3B73");
}

var sun = new Sun();
var mercury = new Mercury();
var venus = new Venus();
var earth = new Earth();
var mars = new Mars();
var jupiter = new Jupiter();
var saturn = new Saturn();
var uranus = new Uranus();
var neptune = new Neptune();

function Move(){
ctx.clearRect(0, 0, 1000, 1000);
drawTrack();
sun.draw();
mercury.draw();
venus.draw();
earth.draw();
mars.draw();
jupiter.draw();
saturn.draw();
uranus.draw();
neptune.draw();
}

setInterval(Move,10);

❼ 安卓編程語言開發 canvas 關於ondraw繪制問題

自定義View的實現方式大概可以分為三種,自繪控制項、組合控制項、以及繼承控制項。本文將介紹自繪控制項的用法。自繪控制項的意思是,這個控制項上的內容是用onDraw函數繪制出來的。關於onDraw函數的介紹可參看 android視圖繪制流程完全解析,帶你一步步深入了解View(二) 。
例子1:在layout文件中使用自繪控制項
出處:http://blog.csdn.net/guolin_blog/article/details/17357967

下面我們准備來自定義一個計數器View,這個View可以響應用戶的點擊事件,並自動記錄一共點擊了多少次。新建一個CounterView繼承自View,代碼如下所示:
[java] view plain
public class CounterView extends View implements OnClickListener {

private Paint mPaint;

private Rect mBounds;

private int mCount;

public CounterView(Context context, AttributeSet attrs) {
super(context, attrs);
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mBounds = new Rect();
setOnClickListener(this);
}

@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
mPaint.setColor(Color.BLUE);
canvas.drawRect(0, 0, getWidth(), getHeight(), mPaint);
mPaint.setColor(Color.YELLOW);
mPaint.setTextSize(30);
String text = String.valueOf(mCount);
mPaint.getTextBounds(text, 0, text.length(), mBounds);
float textWidth = mBounds.width();
float textHeight = mBounds.height();
canvas.drawText(text, getWidth() / 2 - textWidth / 2, getHeight() / 2
+ textHeight / 2, mPaint);
}

@Override
public void onClick(View v) {
mCount++;
invalidate();
}

}
可以看到,首先我們在CounterView的構造函數中初始化了一些數據,並給這個View的本身注冊了點擊事件,這樣當CounterView被點擊的時候,onClick()方法就會得到調用。而onClick()方法中的邏輯就更加簡單了,只是對mCount這個計數器加1,然後調用invalidate()方法。通過 Android視圖狀態及重繪流程分析,帶你一步步深入了解View(三) 這篇文章的學習我們都已經知道,調用invalidate()方法會導致視圖進行重繪,因此onDraw()方法在稍後就將會得到調用。

在布局文件中加入如下代碼:
[html] view plain
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<com.example.customview.CounterView
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_centerInParent="true" />

</RelativeLayout>
可以看到,這里我們將CounterView放入了一個RelativeLayout中。注意,自定義的View在使用的時候一定要寫出完整的包名,不然系統將無法找到這個View。

例子2:通過實例化對象的方式使用自定義控制項
出處:http://blog.csdn.net/ameyume/article/details/6031024

Android繪圖操作,通過繼承View實現,在onDraw函數中實現繪圖。
下面是一個簡單的例子:

[java] view plain
public class AndroidTest extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

MyView mv = new MyView(this);
setContentView(mv);
}

public class MyView extends View {

MyView(Context context) {
super(context);
}

@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);

// 首先定義一個paint
Paint paint = new Paint();

// 繪制矩形區域-實心矩形
// 設置顏色
paint.setColor(Color.BLUE);
// 設置樣式-填充
paint.setStyle(Style.FILL);
// 繪制一個矩形
canvas.drawRect(new Rect(0, 0, getWidth(), getHeight()), paint);

// 繪空心矩形
// 設置顏色
paint.setColor(Color.RED);
// 設置樣式-空心矩形
paint.setStyle(Style.STROKE);
// 繪制一個矩形
canvas.drawRect(new Rect(10, 10, 100, 30), paint);

// 繪文字
// 設置顏色
paint.setColor(Color.GREEN);
// 繪文字
canvas.drawText("Hello", 10, 50, paint);

// 繪圖
// 從資源文件中生成點陣圖
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
// 繪圖
canvas.drawBitmap(bitmap, 10, 60, paint);
}

}

❽ Java應用程序中定義了Canvas然後怎麼在裡面繪圖

html5

<canvas id="myCanvas" width="200" height="100" style="border:1px solid #c3c3c3;">
您的瀏覽器不支持 HTML5 canvas 標簽。
</canvas>

<script>

var c=document.getElementById("myCanvas");
var ctx=c.getContext("2d");
ctx.fillStyle="#FF0000";
ctx.fillRect(0,0,150,75);
</script>

python tkinter怎麼用canvas實現按順序畫圖

python簡述:

Python是一種解釋型、面向對象、動態數據類型的高級程序設計語言。自從20世紀90年代初Python語言誕生至今,它逐漸被廣泛應用於處理系統管理任務和Web編程。Python[1]已經成為最受歡迎的程序設計語言之一。2011年1月,它被TIOBE編程語言排行榜評為2010年度語言。自從2004年以後,python的使用率是呈線性增長。

tkinter模塊介紹

tkinter模塊(「Tk 介面」)是Python的標准Tk GUI工具包的介面.Tk和Tkinter可以在大多數的Unix平台下使用,同樣可以應用在Windows和Macintosh系統里.,Tk8.0的後續版本可以實現本地窗口風格,並良好地運行在絕大多數平台中。

由於Tkinter是內置到python的安裝包中、只要安裝好Python之後就能import Tkinter庫、而且IDLE也是用Tkinter編寫而成、對於簡單的圖形界面Tkinter還是能應付自如。

八、顯示文字

用create_text在畫布上寫字。這個函數只需要兩個坐標(文字x和y的位置),還有一個具名參數來接受要顯示的文字。例如:

>>> from tkinter import*>>> tk = Tk()>>> canvas = Canvas(tk,width=400,height=400)>>> canvas.pack()>>> canvas.create_text(150,100,text='Happy birthday to you')

註:用tkinter只能裝入GIF圖片,也就是擴展名是.gif的圖片文件。

想要顯示其他類型的圖片,如PNG和JPG,需要用到其他的模塊,比如Python圖像庫。

十、創建基本的動畫

創建一個填了色的三角形,讓它在屏幕上橫向移動:

import timefrom tkinter import*tk = Tk()canvas = Canvas(tk,width=400,height=200)canvas.pack()canvas.create_polygon(10,10,10,60,50,35) ##創建三角形for x in range(0,60): canvas.move(1,5,0) ##把任意畫好的對象移動到把x和y坐標增加給定值的位置 tk.update() ##強制tkinter更新屏幕(重畫) time.sleep(0.05) ##讓程序休息二十分之一秒(0.05秒),然後再繼續

三角形橫向移動

延伸一下,如果想讓三角形沿對角線在屏幕上移動,我們可以第8行為:

import timefrom tkinter import*tk = Tk()canvas = Canvas(tk,width=400,height=400)canvas.pack()canvas.create_polygon(10,10,10,60,50,35) ##創建三角形for x in range(0,60): canvas.move(1,5,5) ##把任意畫好的對象移動到把x和y坐標增加給定值的位置 tk.update() ##強制tkinter更新屏幕(重畫) time.sleep(0.05) ##讓程序休息二十分之一秒(0.05秒),然後再繼續

三角形沿對角線移動

如果要讓三角形在屏幕上沿對角線回到開始的位置,要用-5,-5(在結尾處加上這段代碼)

import timefrom tkinter import*tk = Tk()canvas = Canvas(tk,width=400,height=400)canvas.pack()canvas.create_polygon(10,10,10,60,50,35) ##創建三角形for x in range(0,60): canvas.move(1,5,5) ##把任意畫好的對象移動到把x和y坐標增加給定值的位置 tk.update() ##強制tkinter更新屏幕(重畫) time.sleep(0.05) ##讓程序休息二十分之一秒(0.05秒),然後再繼續for x in range(0,60): canvas.move(1,-5,-5) tk.update() time.sleep(0.05)

對角線運動並回到初始位置

十一、讓對象對操作有反應

我們可以用「消息綁定」來讓三角形在有人按下某鍵時有反應。

要開始處理事件,我們首先要創建一個函數。當我們告訴tkinter將某個特定函數綁到(或關聯到)某個特定事件上時就完成了綁定。

換句話說,tkinter會自動調用這個函數來處理事件。

例如,要讓三角形在按下回車鍵時移動,我們可以定義這個函數:

def movetriangle(event): canvas.move(1,5,0)

這個函數只接受一個參數(event),tkinter用它來給函數傳遞關於事件的信息。現在我們用畫布canvas上的bind_all函數來告訴tkinter當特定事件發生時應該調用這個函數。代碼如下:

from tkinter import*tk = Tk()canvas = Canvas(tk,width=400,height=400)canvas.pack()canvas.create_polygon(10,10,10,60,50,35)def movetriangle(event): canvas.move(1,5,0)canvas.bind_all('<KeyPress-Return>',movetringle) ##讓tkinter監視KeyPress事件,當該事件發生時調用movetriangle函數

那麼我們如何根據按鍵的不同而改變三角形的方向呢?比如用方向鍵。

我們可以嘗試改下movetriangle函數:

def movetriangle(event): if event.keysym == 'up': canvas.move(1,0,-3) ##第一個參數使畫布上所畫的形狀的ID數字,第二個是對x(水平方向)坐標增加的值,第三個是對y(垂直方向)坐標增加的值 elif event.keysym == 'down': canvas.move(1,0,3) elif event.keysym == 'left': canvas.move(1,-3,0) else canvas.move(1,3,0)

最後代碼匯總在一起為:

from tkinter import*tk = Tk()canvas = Canvas(tk,width=400,height=400)canvas.pack()canvas.create_polygon(10,10,10,60,50,35)def movetriangle(event): if event.keysym == 'Up': canvas.move(1,0,-3) ##第一個參數使畫布上所畫的形狀的ID數字,第二個是對x(水平方向)坐標增加的值,第三個是對y(垂直方向)坐標增加的值 elif event.keysym == 'Down': canvas.move(1,0,3) elif event.keysym == 'Left': canvas.move(1,-3,0) else: canvas.move(1,3,0)canvas.bind_all('<KeyPress-Up>',movetriangle) ##讓tkinter監視KeyPress事件,當該事件發生時調用movetriangle函數canvas.bind_all('<KeyPress-Down>',movetriangle)canvas.bind_all('<KeyPress-Left>',movetriangle)canvas.bind_all('<KeyPress-Right>',movetriangle)

方向鍵控制三角形的移動

十二、更多使用ID的方法

只要用了畫布上面以create_開頭的函數,它總會返回一個ID。這個函數可以在其他的函數中使用。

如果我們修改代碼來把返回值作為一個變數保存,然後使用這個變數,那麼無論返回值是多少,這段代碼都能工作:

>>> mytriangle = canvas.create_polygon(10,10,10,60,50,35)>>> canvas.move(mytriangle,5,0)

我們可以用itemconfig來改變三角形的顏色,這需要把ID作為第一個參數:

>>> canvas.itemconfig(mytrigle,fill='bue') ##把ID為變數mytriangle中的值的對象的填充顏色改為藍色

也可以給三角形一條不同顏色的輪廓線,同樣適用ID作為第一個參數:

>>> canvas.itemconfig(mytrigle,outline='red')

總結做出了簡單的動畫。學會了如何用事件綁定來讓圖形響應按鍵,這在寫計算機游戲時很有用。在tkinter中以create開頭的函數是如何返回一個ID數字。

已經學習Python兩天,最開始是想著是通過覺得用它寫個動畫或者畫個圖形比較方便,而且界面美觀,比黑洞洞的dos窗口好多了,准備寫個程序送個一女孩作為生日禮物(去年答應好的)。經過這兩天的學習,我慢慢發覺了Python語言的優點,其最主要的就是易學,而且可以調用各種庫。

閱讀全文

與canvas編程代碼相關的資料

熱點內容
dvd光碟存儲漢子演算法 瀏覽:757
蘋果郵件無法連接伺服器地址 瀏覽:962
phpffmpeg轉碼 瀏覽:671
長沙好玩的解壓項目 瀏覽:144
專屬學情分析報告是什麼app 瀏覽:564
php工程部署 瀏覽:833
android全屏透明 瀏覽:736
阿里雲伺服器已開通怎麼辦 瀏覽:803
光遇為什麼登錄時伺服器已滿 瀏覽:302
PDF分析 瀏覽:484
h3c光纖全工半全工設置命令 瀏覽:143
公司法pdf下載 瀏覽:381
linuxmarkdown 瀏覽:350
華為手機怎麼多選文件夾 瀏覽:683
如何取消命令方塊指令 瀏覽:349
風翼app為什麼進不去了 瀏覽:778
im4java壓縮圖片 瀏覽:362
數據查詢網站源碼 瀏覽:150
伊克塞爾文檔怎麼進行加密 瀏覽:892
app轉賬是什麼 瀏覽:163