標籤:des android style io ar color os 使用 sp
SurfaceView組件可以實現高效率的繪製二維圖或者顯示映像,在遊戲開發中經常用到。在android中,已經提供了SurfaceView組件。使用時,一般是通過繼承的方法實現自訂surfaceView,也可以在MainActivity中通過介面surfaceHolder.callback介面實現,這裡介紹通過介面實現surfaceView繪圖,當然,繪圖可以是靜態圖(在指定地區只繪製一次),也可以是動態圖(指定地區-->繪製-->再迴圈)。
SurfaceView組件的使用流程:通過findViewById()執行個體化SurfaceView組件,得到執行個體化對象;利用getHolder()方法得到SurfaceViewHolder類對象,為該對象添加callBack(Context context)回調;在surfaceCreate()方法中添加surfaceView剛顯示的初始化代碼,這個方法在執行個體化SurfaceView組件時執行,比如可以初始化背景顏色,繪圖區顯示出的形狀、座標等;surfaceChanged()方法主要是在surfaceView對象大小、形狀改變時調用;surfaceDestroyed()方法是在surfaceView銷毀時調用,一般是添加kill代碼。
在SurfaceView組件顯示地區上,實現繪製二維圖形需要三個類:Paint、Canvas和SurfaceHolder類。其中Paint類指的是畫筆,可以設定畫筆的顏色(類似於紅筆芯還是藍筆芯),畫筆顯示的線寬(類似於0.35mm還是0.5mm)等;Canvas類相當於畫布,它通過SurfaceHolder類中的lockCanvas()方法獲得,這個lockCanvas()方法可以帶有參數,用來指定鎖定畫布的地區(也就是說,畫布鎖定的地區不一定是surfaceView定義的全部地區,也可以是參數指定的部分地區),當鎖定了地區之後,就可以通過Canvas類執行個體對象所提供的方法來繪製點、線、圓、矩形、映像等,這些方法中的參數一般會有Paint類對象。
需要注意的一點是,在鎖定畫布地區進行繪製圖形或者映像的代碼,一般是開一個獨立線程進行的,這個線程可以在surfaceCreate()方法中開啟。
唉,圖片加不上去,只能貼代碼了。
package com.main.dfa_surfaceview; import android.support.v7.app.ActionBarActivity;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.os.Bundle;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.Toast; public class MainActivity extends ActionBarActivity implements SurfaceHolder.Callback { Button btn1=null; SurfaceView sfc=null; SurfaceHolder holder=null; Paint paint_one=null; Paint paint_two=null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn1=(Button)findViewById(R.id.btn1); sfc=(SurfaceView)findViewById(R.id.surfaceView1); holder=sfc.getHolder(); //得到surfaceView的holder,類似於surfaceView的控制器 holder.addCallback(this); paint_one=new Paint(); //擷取畫筆執行個體 paint_two=new Paint(); paint_one.setColor(Color.BLUE); //畫筆顏色 paint_two.setColor(Color.GREEN); paint_one.setStrokeWidth(20); //設定線寬 paint_two.setStrokeWidth(10); btn1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub Toast.makeText(MainActivity.this, "asdgdsgas", Toast.LENGTH_SHORT).show(); MyThread mthread=new MyThread(); mthread.start(); } }); } @Override public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { // TODO Auto-generated method stub } @Override public void surfaceCreated(SurfaceHolder arg0) { // TODO Auto-generated method stub //當surfaceView建立的時候執行 init_background();//初始化繪圖介面 } @Override public void surfaceDestroyed(SurfaceHolder arg0) { // TODO Auto-generated method stub } private void init_background(){ Canvas canvas=null; canvas=holder.lockCanvas();//擷取目標畫圖地區 canvas.drawColor(Color.RED);//畫布背景顏色 holder.unlockCanvasAndPost(canvas); //解除鎖定並顯示 } private class MyThread extends Thread{ public void run(){ Canvas canvas=null; canvas=holder.lockCanvas();//擷取目標畫圖地區,無參數表示鎖定的是全部繪圖區 canvas.drawColor(Color.RED);//畫布背景顏色設定 canvas.drawCircle(100, 100, 50, paint_one);//以(100,100)為圓心,畫一個半徑為50像素的圓 canvas.drawCircle(50, 50, 50, paint_two); holder.unlockCanvasAndPost(canvas); //解除鎖定並顯示 } }}
android中SurfaceView組件使用解析