class SurfaceViewTest :SurfaceView,SurfaceHolder.Callback,Runnable{
constructor( context:Context) :super( context)
constructor( context: Context,attrs:AttributeSet) :super( context,attrs)
constructor( context: Context,attrs: AttributeSet,defStyleAttr:Int) :super( context, attrs, defStyleAttr)
private var mHolder:SurfaceHolder
private var mCanvas:Canvas?= null
private var mIsDrawing:Boolean = false
private var mPath:Path
private var mX = 0f
private var mY = 0f
private var mPaint:Paint
init {
mHolder = holder
mHolder.addCallback( this)
isFocusable = true
isFocusableInTouchMode = true
keepScreenOn = true
mPath = Path( )
mPaint = Paint( )
mPaint.color = Color.parseColor( "#D7D7D7" )
mPaint.style = Paint.Style.STROKE
mPaint.strokeWidth = 10f
mPaint.isAntiAlias = true
}
override fun surfaceChanged( holder: SurfaceHolder, format: Int, width: Int, height: Int) {
}
override fun surfaceDestroyed( holder: SurfaceHolder) {
mIsDrawing = false
}
override fun surfaceCreated( holder: SurfaceHolder) {
mIsDrawing = true
Thread( this) .start( )
}
override fun run( ) {
while ( mIsDrawing) {
draw( )
mX += 1
mY = ( 100* sin( mX*2*Math.PI/180) +400) .toFloat( )
mPath.lineTo( mX,mY)
}
}
private fun draw( ) {
try {
//获取canvas( 这里获取得是上次得canvas对象)
mCanvas = mHolder.lockCanvas( )
if ( mX> getDisplayMetricsWidth( )) {
//移动画布
mCanvas?.translate( -( mX-getDisplayMetricsWidth( )) ,0f)
}
mCanvas?.drawColor( Color.WHITE)
mCanvas?.drawPath( mPath,mPaint)
} finally {
if ( mCanvas!= null) {
//每次绘制后都需要对画布内容提交
mHolder.unlockCanvasAndPost( mCanvas)
}
}
}
private fun getDisplayMetricsWidth( ) :Int{
val dm = resources.displayMetrics
return dm.widthPixels
}
}
< ?xml version= "1.0" encoding= "utf-8" ?>
< FrameLayout
xmlns:android= "http://schemas.android.com/apk/res/android"
android:layout_width= "match_parent"
android:layout_height= "match_parent" >
< com.example.dailyInterview.surfaceView.SurfaceViewTest
android:layout_width= "match_parent"
android:layout_height= "match_parent" />
< /FrameLayout>
class SurfaceViewActivity:AppCompatActivity( ) {
companion object{
fun startAct( context: Context) {
context.startActivity( Intent( context,SurfaceViewActivity::class.java))
}
}
override fun onCreate( savedInstanceState: Bundle?) {
super.onCreate( savedInstanceState)
setContentView( R.layout.activity_surface)
}
}