Android?中TextureView和SurfaceView的屬性方法及示例說明
實踐過程
SurfaceView屬性和方法
- surfaceCreated(@NonNull SurfaceHolder holder):surface創(chuàng)建時回調(diào)
- surfaceDestroyed(@NonNull SurfaceHolder holder):surface銷毀時回調(diào)
- surfaceChanged(@NonNull SurfaceHolder holder, int format, int width, int height):surface發(fā)生變化時回調(diào)
- SurfaceHolder.addCallback(context):添加回調(diào),也就是上面三個方法
- lockCanvas():獲取Canvas對象并鎖定畫布,調(diào)用Canvas進行繪圖,和unlockCanvasAndPost是依次成對出現(xiàn)。
- unlockCanvasAndPost():結束鎖定畫布,并且提交改變。和lockCanvas是依次成對出現(xiàn)。
TextureView屬性和方法
- getSurfaceTexture():此方法返回此視圖使用的 SurfaceTexture。
- getBitmap(整型寬度,整型高度):此方法返回返回關聯(lián)表面紋理內(nèi)容的位圖表示形式。
- getTransform(Matrix transform):此方法返回與此紋理視圖關聯(lián)的轉換。
- isOpaque():此方法指示此視圖是否不透明。
- lockCanvas():此方法開始編輯曲面中的像素。
- setOpaque(boolean opaque):此方法指示此紋理視圖的內(nèi)容是否不透明。
- setTransform(Matrix transform):此方法將轉換設置為與此紋理視圖關聯(lián)。
- unlockCanvasAndPost(Canvas canvas):此方法完成對曲面中像素的編輯。
- onSurfaceTextureAvailable(SurfaceTexture arg0, int arg1, int arg2):創(chuàng)建的監(jiān)聽,前提開啟硬件加速
- onSurfaceTextureDestroyed(SurfaceTexture arg0):銷毀的監(jiān)聽
- onSurfaceTextureSizeChanged(SurfaceTexture arg0, int arg1,int arg2):變化的監(jiān)聽
- onSurfaceTextureUpdated(SurfaceTexture arg0):更新的監(jiān)聽
TextureView示例
public class MainActivity extends Activity implements SurfaceTextureListener{ ??? private Camera mCamera; ??? private TextureView [mTextureView](); ??? protected void onCreate(Bundle savedInstanceState) { ??????? super.onCreate(savedInstanceState); ??????? mTextureView = new TextureView(this); ??????? mTextureView.setSurfaceTextureListener(this); ??????? setContentView(mTextureView); ??? } ??? public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { ??????? mCamera = Camera.open(); ??????? try { ??????????? mCamera.setPreviewTexture(surface); ??????????? mCamera.startPreview(); ????????????//可以修改透明度和旋轉方向 mTextureView.setAlpha(1.0f); mTextureView.setRotation(90.0f); ??????? } catch (IOException ioe) { ??????????? // 異常處理 ??????? } ??? } ??? public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { ??? } ??? public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { ??????? mCamera.stopPreview(); ??????? mCamera.release(); ??????? return true; ??? } ?? ?public void onSurfaceTextureUpdated(SurfaceTexture surface) { ??? } }
SurfaceView示例
Java版本自定義
public class ECGSurfaceViewJava extends SurfaceView implements SurfaceHolder.Callback { ??? //簡單模擬一下數(shù)據(jù) ??? public List<Integer> ecgDatas = new ArrayList<>(); ??? //矩陣? 畫布 畫筆 顏色 ??? private Rect rect; ??? private Canvas mCanvas; ??? private Paint mPaint;? //畫波形的畫筆 ??? private String line_color = "#01FC00";? //畫筆默認是綠色的 ??? private int wave_speed = 30;//定義波速:30mm/s ??? private int sleepTime = 8;//每次鎖屏的時間間距,單位ms 連線的時間長度,,如果大則會卡頓效果 ??? private SurfaceHolder surfaceHolder; ??? private boolean isCanRun = true; ??? private int mStartX = 0; ??? private int mStartY = 0; ??? private Runnable drawRunnable = new Runnable() { ??????? @Override ??????? public void run() { ??????????? while (isCanRun) { ?????????????? //在這獲取改view的寬度? 如果mStartX超過則歸位 這樣實現(xiàn)反復從頭畫,我這800只是簡單表示下效果 ??????????????? if (mStartX > 800) { ??????????????????? mStartX = 0; ??????????????? } ??????????????? //繪制區(qū)域不斷向右變化 ??????????????? rect.set(mStartX, 0, mStartX + 16, 300); ????????? ??????mCanvas = surfaceHolder.lockCanvas(rect);? //提交繪制區(qū)域 ??????????????? if (mCanvas == null) return; ??????????????? //很重要,如果反復從頭繪制,會覆蓋上一次的繪制 ??????????????? mCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); ??????????????? if (ecgDatas.size() > 0) { ??????????????????? mCanvas.drawLine(mStartX, mStartY, mStartX + 16, ecgDatas.get(0), mPaint); ??????????????????? //這個點的重點是下一個點的起點 ??????????????????? mStartX = mStartX + 16; ??????????????????? mStartY = ecgDatas.get(0); ??????????????????? ecgDatas.remove(0); ??????????????? } else { ??????????????????? initData(); ??????????????? } ??????????????? surfaceHolder.unlockCanvasAndPost(mCanvas);??? //這種方式把上次繪制的遮蓋了 因此出現(xiàn)了斷點 ??????????? } ??????? } ??? }; ??? public ECGSurfaceViewJava(Context context, AttributeSet attrs) { ??????? super(context, attrs); ??????? this.surfaceHolder = this.getHolder();//獲取holder ??????? this.surfaceHolder.addCallback(this); ??????? rect = new Rect();? //繪制矩陣內(nèi) ??????? mPaint = new Paint(); ??????? mPaint.setColor(Color.parseColor(line_color));?? //畫筆顏色 ??????? mPaint.setAntiAlias(true);?? //抗鋸齒 ??????? mPaint.setStrokeWidth(2); ??????? initData(); ??? } ??? private void initData() { ??????? ecgDatas.clear(); ??????? for (int i = 0; i < 200; i++) { ??????????? ecgDatas.add((int) (Math.random() * 200)); ??????? } ??????? mStartY = ecgDatas.get(0); ??? } ??? @Override ??? public void surfaceCreated(SurfaceHolder holder) { ??????? new Thread(drawRunnable).start(); ??? } ??? @Override ??? public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { ??? } ??? @Override ??? public void surfaceDestroyed(SurfaceHolder holder) { ??????? isCanRun = false; ??? } }
Kotlin版本自定義
class ECGSurfaceViewKotlin(context: Context?, attrs: AttributeSet?) : SurfaceView(context, attrs), SurfaceHolder.Callback { ??? //簡單模擬一下數(shù)據(jù) ??? var ecgDatas: MutableList<Int> = ArrayList() ??? //矩陣? 畫布 畫筆 顏色 ??? private var rect: Rect? = null ??? private var mCanvas: Canvas? = null ??? //畫波形的畫筆 ??? private var mPaint: Paint? = null ??? private val line_color = "#01FC00" //畫筆默認是綠色的 ??? private val wave_speed = 30 //定義波速:30mm/s ??? private val sleepTime = 8 //每次鎖屏的時間間距,單位ms 連線的時間長度,,如果大則會卡頓效果 ??? var surfaceHolder: SurfaceHolder? = null ??? private var isCanRun = true ??? private var mStartX = 0 ??? private var mStartY = 0 ? ??? private val drawRunnable = Runnable { ??????? while (isCanRun) { ?????????? //在這獲取改view的寬度? 如果mStartX超過則歸位 這樣實現(xiàn)反復從頭畫,我這800只是簡單表示下效果 ??????????? if (mStartX > 800) { ??????????????? mStartX = 0 ??????????? } ??????????? //繪制區(qū)域不斷向右變化 ??????????? rect!![mStartX, 0, mStartX + 16] = 300 ??????????? mCanvas = surfaceHolder!!.lockCanvas(rect) //提交繪制區(qū)域 ??????????? if (mCanvas == null) return@Runnable ??????????? //很重要,如果反復從頭繪制,會覆蓋上一次的繪制 ??????????? mCanvas!!.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR) ??????????? if (ecgDatas.size > 0) { ??????????????? mCanvas!!.drawLine(mStartX.toFloat(), mStartY.toFloat(), (mStartX + 16).toFloat(), ecgDatas[0].toFloat(), mPaint) ??????????????? //這個點的重點是下一個點的起點 ??????????????? mStartX = mStartX + 16 ??????????????? mStartY = ecgDatas[0] ??????????????? ecgDatas.removeAt(0) ??????????? } else { ??????????????? initData() ??????????? } ??????????? surfaceHolder!!.unlockCanvasAndPost(mCanvas!!) //這種方式把上次繪制的遮蓋了 因此出現(xiàn)了斷點 ??????? } ??? } ??? init { ??????? surfaceHolder = this.holder //獲取holder ??????? surfaceHolder!!.addCallback(this) ??????? rect = Rect() //繪制矩陣內(nèi) ??????? mPaint = Paint() ??????? mPaint!!.setColor(Color.parseColor(line_color)) //畫筆顏色 ??????? mPaint!!.setAntiAlias(true) //抗鋸齒 ?????? ?mPaint!!.setStrokeWidth(2f) ??????? initData() ??? } ??? private fun initData() { ??????? ecgDatas.clear() ??????? for (i in 0..199) { ??????????? ecgDatas.add((Math.random() * 200).toInt()) ??????? } ??????? mStartY = ecgDatas[0] ??? } ??? override fun surfaceCreated(holder: SurfaceHolder?) { ??????? Thread(drawRunnable).start() ??? } ??? override fun surfaceChanged(holder: SurfaceHolder?, format: Int, width: Int, height: Int) { ??? } ??? override fun surfaceDestroyed(holder: SurfaceHolder?) { ?????? ?isCanRun = false ??? } }
布局直接使用即可:
<cn.appstudy.customView.ECGSurfaceViewJava ??????? android:layout_width="match_parent" ??????? android:layout_height="200dp"/> ? <cn.appstudy.customView.ECGSurfaceViewKotlin android:layout_width="match_parent" android:layout_height="200dp" android:layout_marginTop="220dp" />
上面小空只是簡單寫了下示例,如果是畫心電圖其實還有更多的邏輯,比如多個心電圖同步,比如超出屏幕后回到起始位置,比如實時更新心電圖數(shù)據(jù),再比如心電圖速度控制等等。
而且上面心電圖示例是從左到右的,還有可能從上到下,從右到左的等等,更多功能就交給大佬們?nèi)ラ_發(fā)了。
到此這篇關于Android 中TextureView和SurfaceView的屬性方法及示例說明的文章就介紹到這了,更多相關Android extureView和SurfaceView 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
實例講解Android中的AIDL內(nèi)部進程通信接口使用
這篇文章主要通過實例介紹了Android中的AIDL內(nèi)部進程通信接口使用,文中通過一個音樂播放的服務編寫例子來講解AIDL的傳遞對象及一般使用步驟,需要的朋友可以參考下2016-04-04Android AlertDialog實現(xiàn)分享對話框/退出對話框/下載對話框
這篇文章主要介紹了Android AlertDialog實現(xiàn)分享對話框/退出對話框/下載對話框的相關資料,需要的朋友可以參考下2016-04-04Android進階CameraX與Camera2使用比對詳解
這篇文章主要為大家介紹了Android進階CameraX與Camera2使用比示例對詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-01-01Flutter Http分塊下載與斷點續(xù)傳的實現(xiàn)
這篇文章主要介紹了Flutter Http分塊下載與斷點續(xù)傳的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-03-03Android Jetpack導航組件Navigation創(chuàng)建使用詳解
這篇文章主要為大家介紹了Android Jetpack導航組件Navigation創(chuàng)建及使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11