十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊
量身定制 + 運營維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
SurfaceView是視圖(View)的繼承類,這個視圖里內(nèi)嵌了一個專門用于繪制的Surface。你可以控制這個Surface的格式和尺寸。Surfaceview控制這個Surface的繪制位置。

surface是縱深排序(Z-ordered)的,這表明它總在自己所在窗口的后面。surfaceview提供了一個可見區(qū)域,只有在這個可見區(qū)域內(nèi)的surface部分內(nèi)容才可見,可見區(qū)域外的部分不可見。surface的排版顯示受到視圖層級關(guān)系的影響,它的兄弟視圖結(jié)點會在頂端顯示。這意味者 surface的內(nèi)容會被它的兄弟視圖遮擋,這一特性可以用來放置遮蓋物(overlays)(例如,文本和按鈕等控件)。注意,如果surface上面有透明控件,那么它的每次變化都會引起框架重新計算它和頂層控件的透明效果,這會影響性能。
你可以通過SurfaceHolder接口訪問這個surface,getHolder()方法可以得到這個接口。surfaceview變得可見時,surface被創(chuàng)建;surfaceview隱藏前,surface被銷毀。這樣能節(jié)省資源。如果你要查看 surface被創(chuàng)建和銷毀的時機,可以重載surfaceCreated(SurfaceHolder)和 surfaceDestroyed(SurfaceHolder)。
surfaceview的核心在于提供了兩個線程:UI線程和渲染線程。這里應(yīng)注意:
1>所有SurfaceView和SurfaceHolder.Callback的方法都應(yīng)該在UI線程里調(diào)用,一般來說就是應(yīng)用程序主線程。渲染線程所要訪問的各種變量應(yīng)該作同步處理。
2>由于surface可能被銷毀,它只在SurfaceHolder.Callback.surfaceCreated()和 SurfaceHolder.Callback.surfaceDestroyed()之間有效,所以要確保渲染線程訪問的是合法有效的surface。
注:摘自http://www.cnblogs.com/xuling/archive/2011/06/06/android.html
接下來我們定義一個MySurfaceView類,用來實現(xiàn)拖動文本的效果。但是我們希望通過不停的定時刷新界面來達(dá)到我們想要的效果。
首先我們繼承自SurfaceView,并實現(xiàn)android.view.SurfaceHolder.Callback接口。因為我們想不停的定時刷新界面所以這里也需要實現(xiàn)Runnable。
重寫run()函數(shù)、surfaceCreated()函數(shù)、surfaceChanged()函數(shù)、surfaceDestroyed()函數(shù)、onTouchEvent()函數(shù)。
代碼如下:
publicclass MySurfaceView extends SurfaceView implements Callback,Runnable{
private String tag = "MySurfaceView";
private SurfaceHolder surfaceHolder;
private Paint paint;
privateinttextX = 10,textY = 10;
private Thread mThread;
privatebooleanflag;//線程標(biāo)識位
private Canvas canvas;
public MySurfaceView ( Context context )
{
super(context) ;
Log.d(tag, "MySurfaceView");
surfaceHolder = this.getHolder();
//一定要有addCallback()函數(shù),沒有則響應(yīng)不了監(jiān)聽
surfaceHolder.addCallback(this);
paint = new Paint();
paint.setColor(Color.WHITE);
setFocusable(true);
}
@Override
publicvoid run()
{
while(flag){
Log.d(tag, "thread is run");
long start = System.currentTimeMillis();
myDraw();//繪圖
long end = System.currentTimeMillis();
if(end - start < 50){
try
{
Thread.sleep(50 -(end - start));
}
catch ( InterruptedException e )
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
@Override
publicvoid surfaceCreated(SurfaceHolder holder)
{
// TODO Auto-generated method stub
Log.d(tag, "surfaceCreated");
flag = true;
mThread = new Thread(this);
mThread.start();
}
@Override
publicvoid surfaceChanged(SurfaceHolder holder, int format, int width, int height)
{
Log.d(tag, "surfaceChanged");
// TODO Auto-generated method stub
}
@Override
publicvoid surfaceDestroyed(SurfaceHolder holder)
{
Log.d(tag, "surfaceDestroyed");
flag = false;
}
publicvoid myDraw(){
Log.d(tag, "myDraw");
canvas = surfaceHolder.lockCanvas();
if(canvas != null){
Log.d(tag, "canvas is not null");
//每次繪畫都給畫布重新上色以覆蓋上一次繪畫的文本----刷屏
canvas.drawRGB(0, 0, 0);
canvas.drawText("GAME", textX, textY, paint);
surfaceHolder.unlockCanvasAndPost(canvas);
}else{
Log.d(tag, "canvas is null");
}
}
@Override
publicboolean onTouchEvent(MotionEvent event)
{
Log.d(tag,"onTouchEvent");
//獲取滑動的坐標(biāo)
textX = ( int ) event.getX();
textY = ( int ) event.getY();
returntrue ;
}
}
其實刷屏方式不止代碼中用到的一種方法,還有以下三種:
1)、每次繪圖都繪制一個等同于屏幕大小的圖形覆蓋在畫布上。
publicvoid myDraw(){
Log.d(tag, "myDraw");
canvas = surfaceHolder.lockCanvas();
if(canvas != null){
Log.d(tag, "canvas is not null");
//每次繪畫都給畫布重新上色以覆蓋上一次繪畫的文本----刷屏
canvas.drawRect(0,0,this.getWith(),this.getHeight(),paint);
Paint paintText = new Paint();
paintText.setColor(Color.WHITE);
canvas.drawText("GAME", textX, textY, paintText);
surfaceHolder.unlockCanvasAndPost(canvas);
}else{
Log.d(tag, "canvas is null");
}
}
2)、每次繪圖之前,在畫布上填充一種顏色。
publicvoid myDraw(){
Log.d(tag, "myDraw");
canvas = surfaceHolder.lockCanvas();
if(canvas != null){
Log.d(tag, "canvas is not null");
//每次繪畫都給畫布重新上色以覆蓋上一次繪畫的文本----刷屏
canvas.drawColor(Color.BLACK);
canvas.drawText("GAME", textX, textY, paint);
surfaceHolder.unlockCanvasAndPost(canvas);
}else{
Log.d(tag, "canvas is null");
}
}
3)、每次繪圖之前,繪制一張等同于屏幕大小的圖片覆蓋在畫布上。
其實不管那種方法其原理都是在繪制畫布之前對畫布進(jìn)行一次整體覆蓋。就像小時候喜歡在書頁角上畫走動的小人一樣,每翻過一頁都將上一頁覆蓋掉,速度快了看起來就連貫了,其實這也是動畫的原理。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。