Android中SurfaceView用法簡單實例
本文實例講述了Android中SurfaceView用法。分享給大家供大家參考,具體如下:
這里貼上一個小程序代碼,主要運用SurfaceView來實現(xiàn)在屏幕上畫一個圓,你可以通過按方向鍵和觸摸屏幕來改變圓的位置
代碼:
Activity:
package com.view;
import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;
public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 隱藏狀態(tài)欄
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
// 把Activity的標(biāo)題去掉
requestWindowFeature(Window.FEATURE_NO_TITLE);
// 設(shè)置布局
this.setContentView(new MySurfaceView(this));
}
}
SurfaceView:
package com.view;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
public class MySurfaceView extends SurfaceView implements Runnable, Callback {
private SurfaceHolder mHolder; // 用于控制SurfaceView
private Thread t; // 聲明一條線程
private boolean flag; // 線程運行的標(biāo)識,用于控制線程
private Canvas mCanvas; // 聲明一張畫布
private Paint p; // 聲明一支畫筆
private int x = 50, y = 50, r = 10; // 圓的坐標(biāo)和半徑
public MySurfaceView(Context context) {
super(context);
mHolder = getHolder(); // 獲得SurfaceHolder對象
mHolder.addCallback(this); // 為SurfaceView添加狀態(tài)監(jiān)聽
p = new Paint(); // 創(chuàng)建一個畫筆對象
p.setColor(Color.WHITE); // 設(shè)置畫筆的顏色為白色
setFocusable(true); // 設(shè)置焦點
}
/**
* 自定義一個方法,在畫布上畫一個圓
*/
public void Draw() {
mCanvas = mHolder.lockCanvas(); // 獲得畫布對象,開始對畫布畫畫
mCanvas.drawRGB(0, 0, 0); // 把畫布填充為黑色
mCanvas.drawCircle(x, y, r, p); // 畫一個圓
mHolder.unlockCanvasAndPost(mCanvas); // 完成畫畫,把畫布顯示在屏幕上
}
/**
* 當(dāng)SurfaceView創(chuàng)建的時候,調(diào)用此函數(shù)
*/
@Override
public void surfaceCreated(SurfaceHolder holder) {
t = new Thread(this); // 創(chuàng)建一個線程對象
flag = true; // 把線程運行的標(biāo)識設(shè)置成true
t.start(); // 啟動線程
}
/**
* 當(dāng)SurfaceView的視圖發(fā)生改變的時候,調(diào)用此函數(shù)
*/
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
/**
* 當(dāng)SurfaceView銷毀的時候,調(diào)用此函數(shù)
*/
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
flag = false; // 把線程運行的標(biāo)識設(shè)置成false
}
/**
* 當(dāng)屏幕被觸摸時調(diào)用
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
x = (int) event.getX(); // 獲得屏幕被觸摸時對應(yīng)的X軸坐標(biāo)
y = (int) event.getY(); // 獲得屏幕被觸摸時對應(yīng)的Y軸坐標(biāo)
return true;
}
/**
* 當(dāng)用戶按鍵時調(diào)用
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_DPAD_UP){ //當(dāng)用戶點擊↑鍵時
y--; //設(shè)置Y軸坐標(biāo)減1
}
return super.onKeyDown(keyCode, event);
}
@Override
public void run() {
while (flag) {
Draw(); // 調(diào)用自定義畫畫方法
try {
Thread.sleep(50); // 讓線程休息50毫秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
MySurfaceView首先繼承SurfaceView,然后實現(xiàn)Runnable和Callback接口
重寫了Runnable的run方法和Callback的surfaceCreated(SurfaceHolder holder),surfaceChanged(SurfaceHolder holder, int format, int width,int height),surfaceDestroyed(SurfaceHolder holder)方法,
還實現(xiàn)了onTouchEvent(MotionEvent event),onKeyDown(int keyCode, KeyEvent event)方法來,詳細的在代碼里已注釋。
希望本文所述對大家Android程序設(shè)計有所幫助。
相關(guān)文章
Android 加載大圖及多圖避免程序出現(xiàn)OOM(OutOfMemory)異常
這篇文章主要介紹了Android 加載大圖及多圖避免程序出現(xiàn)OOM(OutOfMemory)異常的相關(guān)資料,需要的朋友可以參考下2017-03-03
Android數(shù)據(jù)加密之SHA安全散列算法
這篇文章主要為大家詳細介紹了Android數(shù)據(jù)加密之SHA安全散列算法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-09-09
360瀏覽器文本框獲得焦點后被android軟鍵盤遮罩該怎么辦
最近接了個項目,項目需求是這樣的,站點上篩選按鈕點擊后彈出層(fixed),當(dāng)輸入框獲取焦點以后彈出系統(tǒng)自帶的軟鍵盤,在android上十款瀏覽器挨個測試比對,發(fā)現(xiàn)在360瀏覽器彈出鍵盤以后獲取焦點的文本框被軟鍵盤覆蓋了,下面分享我的解決辦法2015-12-12
android 捕獲系統(tǒng)異常并上傳日志具體實現(xiàn)
這篇文章介紹了android 捕獲系統(tǒng)異常并上傳日志具體實現(xiàn),有需要的朋友可以參考一下2013-09-09
Android錄制語音文件wav轉(zhuǎn)mp3的方法示例
這篇文章主要介紹了Android錄制語音文件wav轉(zhuǎn)mp3的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-09-09
Android實現(xiàn)帶指示器的自動輪播式ViewPager
這篇文章主要為大家詳細介紹了Android實現(xiàn)帶指示器的自動輪播式ViewPager的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-02-02
Android ListView實現(xiàn)上拉加載下拉刷新和滑動刪除功能
這篇文章主要為大家詳細介紹了Android ListView實現(xiàn)上拉加載下拉刷新和滑動刪除功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-12-12
Android中ViewPager獲取當(dāng)前顯示的Fragment
這篇文章主要介紹了Android中ViewPager獲取當(dāng)前顯示的Fragment的兩種方法,一種是使用 getSupportFragmentManager().findFragmentByTag()方法,另一種是重寫適配器的 setPrimaryItem()方法,有需要的朋友可以參考借鑒,下面來一起看看吧。2017-01-01

