在SurfaceView上画一条线

问题描述 投票:0回答:1

当我按下按钮并尝试在 SurfaceView 上绘制一条黄线时,屏幕上会出现一些随机混乱。 如何以最快的方式正确访问手机屏幕,并在应用程序中在其上绘制线条、矩形和其他基本形状?

我使用代码

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/mylinearlayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="MY BUTTON"
        android:id="@+id/mybutton"
        />
    <SurfaceView
        android:id="@+id/mysurfaceview"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        tools:context=".MainActivity"/>
</LinearLayout>

package com.example.myapp

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import android.graphics.Color
import android.graphics.Paint
import android.view.SurfaceView
import android.widget.Button

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val sv=findViewById<SurfaceView>(R.id.mysurfaceview)
        val b=findViewById<Button>(R.id.mybutton)
        b.setOnClickListener() {
            val mycanvas=sv.holder.lockCanvas()
            val mypaint= Paint()
            mypaint.setColor(Color.YELLOW)
            mypaint.isAntiAlias=true
            mypaint.strokeWidth=5f
            mypaint.style=Paint.Style.FILL
            mycanvas.drawLine(20f,20f,450f,520f,mypaint)
            sv.holder.unlockCanvasAndPost(mycanvas)
        }
    }
}

产生这个:

截图

kotlin android-canvas surfaceview
1个回答
0
投票

绘图前应先清除画布。

要么使背景透明:

mycanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR)

或使用纯色:

mycanvas.drawColor(Color.WHITE)

您的代码中还有另一个问题 - 您没有按照 docs 中的描述处理 Surface 生命周期事件。这可能会导致崩溃。考虑实现一个自定义视图类

© www.soinside.com 2019 - 2024. All rights reserved.