国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android編程之SurfaceView學習示例詳解

2020-04-11 11:20:18
字體:
來源:轉載
供稿:網友

本文實例講述了Android編程之SurfaceView學習示例。分享給大家供大家參考,具體如下:

SurfaceView是View的子類,使用的方式與任何View所派生的類都是完全相同的,可以像其他View那樣應用動畫,并把它們放到布局中。

SurfaceView封裝的Surface支持使用本章前面所描述的所有標準Canvas方法進行繪圖,同時也支持完全的OpenGL ES庫。

使用OpenGL,你可以再Surface上繪制任何支持的2D或者3D對象,與在2D畫布上模擬相同的效果相比,這種方法可以依靠硬件加速(可用的時候)來極大地提高性能。

對于顯示動態的3D圖像來說,例如,那些使用Google Earth功能的應用程序,或者那些提供沉浸體驗的交互式游戲,SurfaceView特別有用。它還是實時顯示攝像頭預覽的最佳選擇。

SurfaceView 和 View 的明顯不同之處在于:

1、繼承SurfaceView  的視圖可以另起一個線程,或者說在子線程中更新視圖。
2、 SurfaceView 的畫圖方法是在子線程中執行的 而 View類的那個示例 的畫圖方法是在UI線程中執行的。
3、SurfaceView在繪圖之前必須使用lockCanvas 方法鎖定畫布,并得到畫布,然后再畫布上繪制;當繪制完成后,使用unlockCanvasAndPost 方法解鎖畫布,然后就顯示到屏幕上。
SurfaceView 類的事件處理規則和View一樣。

具體示例:

Activity

public class Activity01 extends Activity {   GameSurfaceView mGameSurfaceView;   @Override   public void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     mGameSurfaceView = new GameSurfaceView(this);     setContentView(mGameSurfaceView);   }   @Override   public boolean onTouchEvent(MotionEvent event) {     if(event.getAction() == MotionEvent.ACTION_DOWN){       mGameSurfaceView.x = event.getX();       mGameSurfaceView.y = event.getY();     }     return true;   }   @Override   public boolean onKeyDown(int keyCode, KeyEvent event) {     if(keyCode == KeyEvent.KEYCODE_BACK){       this.finish();     }     return true;   } }

GameSurfaceView

public class GameSurfaceView extends SurfaceView implements SurfaceHolder.Callback, Runnable {   boolean mbLoop = false;   SurfaceHolder mSurfaceHolder = null;   int count = 0;   float x = 50, y = 50;   int screenWidth = 480, screenHeight = 800;   public GameSurfaceView(Context context) {     super(context);     mbLoop = true;     mSurfaceHolder = this.getHolder();     mSurfaceHolder.addCallback(this);     this.setFocusable(true);   }   @Override   public void surfaceCreated(SurfaceHolder holder) {     new Thread(this).start();  // start paint thread   }   @Override   public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {     screenWidth = width;    // reset width when screen orientation is changed     screenHeight = height;   // reset height when screen orientation is changed   }   @Override   public void surfaceDestroyed(SurfaceHolder holder) {     mbLoop = false;   }   @Override   public void run() {     while (mbLoop) {       synchronized (mSurfaceHolder) {         onDraw();       }       try {         Thread.sleep(200);       } catch (Exception e) {       }     }   }   public void onDraw() {     Canvas canvas = mSurfaceHolder.lockCanvas();     if (mSurfaceHolder == null || canvas == null) {       return;     }     if (count < 100) {       count++;     } else {       count = 0;     }     Paint mPaint = new Paint();     mPaint.setAntiAlias(true);     mPaint.setColor(Color.CYAN);     canvas.drawRect(0, 0, screenWidth, screenHeight, mPaint);  // repaint background color     switch (count % 4) {     case 0:       mPaint.setColor(Color.BLUE);       break;     case 1:       mPaint.setColor(Color.GREEN);       break;     case 2:       mPaint.setColor(Color.RED);       break;     case 3:       mPaint.setColor(Color.YELLOW);       break;     default:       mPaint.setColor(Color.WHITE);       break;     }     canvas.drawCircle(x, y, 50, mPaint);     mSurfaceHolder.unlockCanvasAndPost(canvas);   } }

運行效果:

完整實例代碼代碼點擊此處本站下載

希望本文所述對大家Android程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 巴楚县| 麦盖提县| 嘉鱼县| 木里| 神农架林区| 喀什市| 兴山县| 自治县| 鄂温| 竹溪县| 灵台县| 宜昌市| 罗江县| 桦川县| 永胜县| 云林县| 台州市| 息烽县| 丰宁| 宁城县| 清新县| 额敏县| 宜春市| 屯门区| 客服| 和顺县| 固始县| 孟州市| 凤台县| 福泉市| 河北区| 高雄市| 措美县| 弥渡县| 揭东县| 巴里| 绿春县| 咸丰县| 马山县| 金坛市| 稷山县|