❶ 我在使用 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語言的優點,其最主要的就是易學,而且可以調用各種庫。