編輯:初級開發
有點吃不開了,這個時候就要用到SurfaceVIEw類。
因為比較高級,所以就該裝B,單純一個繼承自SurfaceView類是不行的,必須實現一個SurfaceHolder.Callback接口來指明SurfaceVIEw創建、改變、刪除時的回調方法,並且
在SurfaceView中通過一個SurfaceHolder對象來控制SurfaceVIEw。
如果將該SurfaceView作為某個Activity的全屏View,則直接調用setContentView(new MyView());就好了;但若是作為屏幕VIEw的一部份,就應該修改對應的layout XML文件
了,添加類似的布局代碼:
<com.example.fq.MyVIEw
android:id="@+id/sv"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
其中com.example.fq.MyVIEw為對應自定義類的全名。
由於默認的XML文件解析方法是調用View的View(Context , AttributeSet )構造函數構造View,因此你的自定義SurfaceVIEw中也應該有一個參數為(Context , AttributeSet )
的構造函數,並且在構造函數中執行父類的對應函數super( Context , AttributeSet )。
在繪圖時,必須首先用Canvas c=holder.lockCanvas();鎖定並獲得畫布,隨後進行繪制,再調用holder.unlockCanvasAndPost(c);將繪制內容進行呈現
下面是個例子:
MyVIEw.Java:
public class MyView extends SurfaceVIEw implements SurfaceHolder.Callback {
private SurfaceHolder holder=null; //控制對象
private Vector<Float> xs=new Vector<Float>();
private Vector<Float> ys=new Vector<Float>();
public MyVIEw(Context context,AttributeSet attr) {
super(context,attr);
// TODO Auto-generated constructor stub
holder=getHolder();
holder.addCallback(this);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
new Thread(new MyLoop()).start();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
public void doDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
canvas.drawColor(Color.WHITE);//這裡是繪制背景
Paint p=new Paint(); //筆觸
p.setAntiAlias(true); //反鋸齒
p.setColor(Color.BLACK);
p.setStyle(Style.STROKE);
for(int i=0;i<xs.size();i++)
canvas.drawCircle(xs.elementAt(i),ys.elementAt(i),10, p);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
if(event.getAction()==MotionEvent.ACTION_DOWN){
xs.add(event.getX());
ys.add(event.getY());
}
return true;
}
class MyLoop implements Runnable{
//熟悉游戲編程的應該很面熟吧,主循環
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
try{
Canvas c=holder.lockCanvas();
doDraw(c);
holder.unlockCanvasAndPost(c);
Thread.sleep(20);
}catch(Exception e){
}
}
}
}
Main.Java
public class Main extends Activity {
private MyVIEw sv=null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentVIEw(R.layout.main);
sv=(CalendarView)findVIEwById(R.id.sv);
}
}
main.XML
<?XML version="1.0" encoding="utf-8"?>
<LinearLayout XMLns:android="http://schemas.android.com/apk/res/android"
android:orIEntation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<com.example.fq.MyVIEw
android:id="@+id/sv"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
</LinearLayout>
android 有一種叫消息隊列的說法,這裡我們可以這樣理解:假如一個隧道就是一個消息隊列,那麼裡面的每一部汽車就是一個一個消息,這裡我們先忽略掉超車等種種因素,只那麼
本文節選於機械工業出版社推出的《android應用開發揭秘》一書,作者為楊豐盛。本書內容全面,詳細講解了Android框架、android組件、用戶界面開發、游戲開發、
本人嘗試,裡面提供得軟件在索愛x8上失敗了 提示說不能網絡共享 。看來自己編譯x8迫在眉睫啊 (有幸下載到了x8得源代碼。。。)--------------------
下面展示一段在android1.5上讀取手機通訊錄的代碼1 //鏈接通訊錄數據庫 2 ContentResolver content = getContentResol