Drawing interface stuck has always been the pain of Android developers. Today, let's look at surface view, known as sub thread drawing, double buffering mechanism, no stuck.
SurfaceView has the following features:
1 have independent drawing surface; 2. We need to dig a hole in the host window to show ourselves; 3. Its UI can be drawn in a separate thread, so that complex UI can be drawn. 4. At the same time, it will not affect the main thread of the application program and respond to user input, that is, it will not jam.
Because View is drawn in the main UI thread, the main thread will be blocked when drawing. If there are more ontouch events processed, the interface card will be caused.
And surfaceView is another thread drawing, plus double buffering mechanism, so it should be efficient. No card.
Two interfaces for surfaceView:
1,SurfaceHolder.CallBack
2,Runnable
The methods to be implemented in the first interface correspond to the life cycle of SurfaceView, namely creation, change and destruction. The specific code is as follows:
//Life cycle of Surface @Override public void surfaceCreated(SurfaceHolder holder) { } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceDestroyed(SurfaceHolder holder) { }
Insert the code slice here and the second interface needs to implement the run method for draw ing operation in the sub thread.
Note that surfaceView calls surfaceCreated in callback only when it is displayed. When it is displayed, it will not be called during initialization.
Surfacetestroyed in callback is called when it is hidden.
An example is as follows:
package com.bryant.view.surfaceview; import android.content.Context; import android.graphics.Canvas; import android.util.AttributeSet; import android.view.SurfaceHolder; import android.view.SurfaceView; /** * Created by bryant on 2019/6/2 * Test code. */ public class SurfaceViewCsCode extends SurfaceView implements SurfaceHolder.Callback,Runnable{ private SurfaceHolder mHolder; private Canvas mCanvas; private boolean mIsDrawing; //Construction method public SurfaceViewCsCode (Context context) { super(context); initView(); } public SurfaceViewCsCode (Context context, AttributeSet attrs) { super(context, attrs); } public SurfaceViewCsCode (Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } private void initView() { mHolder=getHolder(); mHolder.addCallback(this); setFocusable(true); setFocusableInTouchMode(true); this.setKeepScreenOn(true); } @Override public void surfaceCreated(SurfaceHolder holder) { mIsDrawing=true; new Thread(this).start(); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceDestroyed(SurfaceHolder holder) { mIsDrawing=false; } @Override public void run() { while (mIsDrawing){ draw(); //Control refresh rate by thread sleep time try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } } } private void draw() { try { mCanvas=mHolder.lockCanvas(); //Initialize the canvas and draw something on it }catch (Exception e){ }finally { //Judge whether the canvas is empty to avoid black screen if(mCanvas!=null){ mHolder.unlockCanvasAndPost(mCanvas); } } } }