/* 定義displaymetrics對象 */
displaymetrics dm = new displaymetrics();
/* 取得視窗屬性 */
getwindowmanager().getdefaultdisplay().getmetrics(dm);
1.基本圖像繪制
/* 建立兩個圖檔對象 */
bitmap mbitqq = null;
bitmap mbitdesttop = null;
int midtx = 0;
public gameview(context context)
{
super(context);
mpaint = new paint();
midtx = 0;
/* 從資源檔案中裝載圖檔 */
//getresources()->得到resources
//getdrawable()->得到資源中的drawable對象,參數為資源索引id
//getbitmap()->得到bitmap
mbitqq = ((bitmapdrawable) getresources().getdrawable(r.drawable.qq)).getbitmap();
mbitdesttop = ((bitmapdrawable) getresources().getdrawable(r.drawable.desktop)).getbitmap();
new thread(this).start();
}
public void ondraw(canvas canvas)
super.ondraw(canvas);
/* 清屏效果 */
canvas.drawcolor(color.gray);
/* 在螢幕(0,0)處繪制圖檔mbitqq */
gameview.drawimage(canvas, mbitqq, 0, 0);
/* 在制定位置按指定裁剪的漁區進行繪制 */
//getwidth()->得到圖檔的寬度
//getheight()->得到圖檔的高度
gameview.drawimage(canvas, mbitdesttop, midtx, mbitqq.getheight(), mbitdesttop.getwidth(), mbitdesttop.getheight()/2, 0, 0);
2。旋轉圖檔
public void ondraw(canvas canvas)
/* 重置mmatrix */
mmatrix.reset();
/* 設定旋轉 */
mmatrix.setrotate(angle);
/* 按mmatrix得旋轉建構新的bitmap */
bitmap mbitqq2 = bitmap.createbitmap(mbitqq, 0, 0, bitqqwidth,bitqqheight, mmatrix, true);
/* 繪制旋轉之後的圖檔 */
gameview.drawimage(canvas, mbitqq2, (320-bitqqwidth)/2, 10);
mbitqq2 = null;
3。縮放圖檔
/* 設定縮放 */
mmatrix.postscale(scale,scale);
4。混合渲染
/* 得到圖檔的寬度和高度 */
bitqqwidth = mbitqq.getwidth();
bitqqheight = mbitqq.getheight();
/* 建立bitmapshader對象 */
mbitmapshader = new bitmapshader(mbitqq,shader.tilemode.repeat,shader.tilemode.mirror);
/* 建立lineargradient并設定漸變的顔色數組 */
mlineargradient = new lineargradient(0,0,100,100,
new int[]{color.red,color.green,color.blue,color.white},
null,shader.tilemode.repeat);
/* 這裡筆者了解為“混合渲染”--大家可以有自己的了解,能明白這個意思就好*/
mcomposeshader = new composeshader(mbitmapshader,mlineargradient,porterduff.mode.darken);
/* 建構radialgradient對象,設定半徑的屬性 */
//這裡使用了bitmapshader和lineargradient進行混合
//當然也可以使用其他的組合
//混合渲染的模式很多,可以根據自己需要來選擇
mradialgradient = new radialgradient(50,200,50,
new int[]{color.green,color.red,color.blue,color.white},
/* 建構sweepgradient對象 */
msweepgradient = new sweepgradient(30,30,new int[]{color.green,color.red,color.blue,color.white},null);
/* 開啟線程 */
//将圖檔裁剪為橢圓形
/* 建構shapedrawable對象并定義形狀為橢圓 */
mshapedrawableqq = new shapedrawable(new ovalshape());
/* 設定要繪制的橢圓形的東西為shapedrawable圖檔 */
mshapedrawableqq.getpaint().setshader(mbitmapshader);
/* 設定顯示區域 */
mshapedrawableqq.setbounds(0,0, bitqqwidth, bitqqheight);
/* 繪制shapedrawableqq */
mshapedrawableqq.draw(canvas);
//繪制漸變的矩形
mpaint.setshader(mlineargradient);
canvas.drawrect(bitqqwidth, 0, 320, 156, mpaint);
//顯示混合渲染效果
mpaint.setshader(mcomposeshader);
canvas.drawrect(0, 300, bitqqwidth, 300+bitqqheight, mpaint);
//繪制環形漸變
mpaint.setshader(mradialgradient);
canvas.drawcircle(50, 200, 50, mpaint);
//繪制梯度漸變
mpaint.setshader(msweepgradient);
canvas.drawrect(150, 160, 300, 300, mpaint);
5。圖檔水紋處理
public class gameview extends view implements runnable
{
int backwidth;
int backheight;
short[] buf2;
short[] buf1;
int[] bitmap2;
int[] bitmap1;
/* 裝載圖檔 */
bitmap image = bitmapfactory.decoderesource(this.getresources(),r.drawable.qq);
backwidth = image.getwidth();
backheight = image.getheight();
buf2 = new short[backwidth * backheight];
buf1 = new short[backwidth * backheight];
bitmap2 = new int[backwidth * backheight];
bitmap1 = new int[backwidth * backheight];
/* 加載圖檔的像素到數組中 */
image.getpixels(bitmap1, 0, backwidth, 0, 0, backwidth, backheight);
void dropstone(int x,// x坐标
int y,// y坐标
int stonesize,// 波源半徑
int stoneweight)// 波源能量
for (int posx = x - stonesize; posx < x + stonesize; posx++)
for (int posy = y - stonesize; posy < y + stonesize; posy++)
if ((posx - x) * (posx - x) + (posy - y) * (posy - y) < stonesize * stonesize)
buf1[backwidth * posy + posx] = (short) -stoneweight;
void ripplespread()
for (int i = backwidth; i < backwidth * backheight - backwidth; i++)
{
// 波能擴散
buf2[i] = (short) (((buf1[i - 1] + buf1[i + 1] + buf1[i - backwidth] + buf1[i + backwidth]) >> 1) - buf2[i]);
// 波能衰減
buf2[i] -= buf2[i] >> 5;
}
// 交換波能資料緩沖區
short[] ptmp = buf1;
buf1 = buf2;
buf2 = ptmp;
/* 渲染你水紋效果 */
void render()
int xoff, yoff;
int k = backwidth;
for (int i = 1; i < backheight - 1; i++)
for (int j = 0; j < backwidth; j++)
{
// 計算偏移量
xoff = buf1[k - 1] - buf1[k + 1];
yoff = buf1[k - backwidth] - buf1[k + backwidth];
// 判斷坐标是否在視窗範圍内
if ((i + yoff) < 0)
{
k++;
continue;
}
if ((i + yoff) > backheight)
if ((j + xoff) < 0)
if ((j + xoff) > backwidth)
// 計算出偏移象素和原始象素的記憶體位址偏移量
int pos1, pos2;
pos1 = backwidth * (i + yoff) + (j + xoff);
pos2 = backwidth * i + j;
bitmap2[pos2++] = bitmap1[pos1++];
k++;
}
/* 繪制經過處理的圖檔效果 */
canvas.drawbitmap(bitmap2, 0, backwidth, 0, 0, backwidth, backheight, false, null);
// 觸筆事件
public boolean ontouchevent(motionevent event)
return true;
// 按鍵按下事件
public boolean onkeydown(int keycode, keyevent event)
// 按鍵彈起事件
public boolean onkeyup(int keycode, keyevent event)
dropstone(backwidth/2, backheight/2, 10, 30);
return false;
public boolean onkeymultiple(int keycode, int repeatcount, keyevent event)
/**
* 線程處理
*/
public void run()
while (!thread.currentthread().isinterrupted())
try
thread.sleep(50);
catch (interruptedexception e)
thread.currentthread().interrupt();
ripplespread();
render();
//使用postinvalidate可以直接線上程中更新界面
postinvalidate();
}