Android應用開發基礎篇(8)—–SurfaceView

來源:互聯網
上載者:User

一、概述

      SurfaceView也是一個用來畫圖的組件,不過由於它的效率比較高,因此一般多用在遊戲編程中,在網路攝影機編程中也會用到,還有它和View比較大的不同是它可以在非UI線程裡畫圖。下面的實現中會提到使用SurfaceView來畫圖需要注意的幾個地方。


二、要求

     會使用SurfaceView來畫圖。


三、實現

     建立工程MySurface,修改/res/layout/main.xml檔案,在裡面添加一個Button和一個SurfaceView,完整的main.xml檔案如下:

 1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:layout_width="fill_parent"
4 android:layout_height="fill_parent"
5 android:orientation="vertical" >
6
7
8 <Button
9 android:id="@+id/button"
10 android:layout_width="fill_parent"
11 android:layout_height="wrap_content"
12 android:text="畫線"
13 />
14
15 <SurfaceView
16 android:id="@+id/surface"
17 android:layout_width="fill_parent"
18 android:layout_height="fill_parent"
19 />
20
21 </LinearLayout>

修改MySurfaceActivity.java檔案,主要實現Button的監聽和SurfaceHolder.Callback的介面,完整的內容如下:

 

 1 package com.nan.surface;
2
3
4 import android.app.Activity;
5 import android.graphics.Canvas;
6 import android.graphics.Color;
7 import android.graphics.Paint;
8 import android.graphics.Rect;
9 import android.os.Bundle;
10 import android.view.SurfaceHolder;
11 import android.view.SurfaceView;
12 import android.view.View;
13 import android.widget.Button;
14
15
16 public class MySurfaceActivity extends Activity
17 {
18 private int OldX = 0;
19 private int OldY = 0;
20 private Button mButton = null;
21 private SurfaceView mSurfaceView = null;
22 private SurfaceHolder mSurfaceHolder = null;
23 private Paint mPaint = null;
24
25 @Override
26 public void onCreate(Bundle savedInstanceState)
27 {
28 super.onCreate(savedInstanceState);
29 setContentView(R.layout.main);
30
31 mButton = (Button)findViewById(R.id.button);
32 mSurfaceView = (SurfaceView)findViewById(R.id.surface);
33 mSurfaceHolder = mSurfaceView.getHolder();
34 mSurfaceHolder.addCallback(new MyHolder());
35
36 mPaint = new Paint();
37 //畫筆的顏色
38 mPaint.setColor(Color.RED);
39 //畫筆的粗細
40 mPaint.setStrokeWidth(10.0f);
41 //按鈕監聽
42 mButton.setOnClickListener(new View.OnClickListener()
43 {
44
45 public void onClick(View v)
46 {
47 // TODO Auto-generated method stub
48 //鎖定整個SurfaceView
49 Canvas mCanvas = mSurfaceHolder.lockCanvas();
50 mCanvas.drawLine(OldX, OldY, OldX+10, OldY+10, mPaint);
51 //橫座標增加
52 OldX = OldX + 10;
53 //縱座標增加
54 OldY = OldY + 10;
55 // 繪製完成,釋放畫布,提交修改
56 mSurfaceHolder.unlockCanvasAndPost(mCanvas);
57 //重新鎖一次
58 //mSurfaceHolder.lockCanvas(new Rect(0, 0, 0, 0));
59 //mSurfaceHolder.unlockCanvasAndPost(mCanvas);
60 }
61 });
62 }
63
64 //定義一個類,實現Callback介面
65 public class MyHolder implements SurfaceHolder.Callback
66 {
67
68 public void surfaceChanged(SurfaceHolder holder, int format, int width,
69 int height)
70 {
71 // TODO Auto-generated method stub
72 //add your code
73 }
74
75 public void surfaceCreated(SurfaceHolder holder)
76 {
77 // TODO Auto-generated method stub
78 //add your code
79 }
80
81 public void surfaceDestroyed(SurfaceHolder holder)
82 {
83 // TODO Auto-generated method stub
84 //add your code
85 }
86
87 }
88
89 }

此時運行該程式,並點擊幾下“畫線”按鈕,效果如下所示:

可以看到,畫出來的線是斷斷續續的,把上面程式的第58,59行的注釋去掉,再運行一次,效果如下:

 

可以看到,線已經沒有斷開的現象了。

還有一點需要注意的是,如果希望程式在後台運行時還能畫圖且不報程式出錯的問題,就要修改成以下這樣的形式:

 

 1                 //鎖定整個SurfaceView
2 Canvas mCanvas = mSurfaceHolder.lockCanvas();
3 try
4 {
5 if(mCanvas!=null)
6 {
7 mCanvas.drawLine(OldX, OldY, OldX+10, OldY+10, mPaint);
8 //橫座標增加
9 OldX = OldX + 10;
10 //縱座標增加
11 OldY = OldY + 10;
12 //繪製完成,釋放畫布,提交修改
13 mSurfaceHolder.unlockCanvasAndPost(mCanvas);
14 }
15 }
16 catch(Exception e)
17 {
18 e.printStackTrace();
19 }
20 finally
21 {
22 if(mCanvas!=null)
23 {
24 //重新鎖一次
25 mSurfaceHolder.lockCanvas(new Rect(0, 0, 0, 0));
26 mSurfaceHolder.unlockCanvasAndPost(mCanvas);
27 }
28 }

再運行,效果同第2幅圖的一樣。



相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.