Canvas не рисует в SurfaceView - PullRequest
       7

Canvas не рисует в SurfaceView

2 голосов
/ 18 марта 2019

Я создаю метод переопределения с именем draw в SurfaceView. Я хочу видеть краску, которую я установил в своем SurfaceView, но ничего не появляется, когда я касаюсь экрана и пытаюсь нарисовать линию. Что я должен сделать, чтобы сделать эту работу?

   private var mPaint: Paint
   private val mPaths: ArrayList<Path> = ArrayList<Path>()
   private val mEraserPath: Path = Path()

   init {
        mPaint = Paint()
        mPaint.isAntiAlias = true
        mPaint.isDither = true
        mPaint.style = Paint.Style.STROKE
        mPaint.strokeJoin = Paint.Join.ROUND
        mPaint.strokeCap = Paint.Cap.ROUND
        mPaint.strokeWidth = 3f
        mPaint.alpha = 255
        mPaint.color = android.graphics.Color.BLACK
        mPaint.xfermode = PorterDuffXfermode(PorterDuff.Mode.CLEAR)
       }

   override fun draw(canvas: Canvas) {
        canvas.drawPaint(mPaint)
        val action: EditAction? = this.getEditAction()
        for (path: Path in mPaths) {
            when (action) {
                EditAction.COLOR -> {
                    setPaintColor(this.getStrokeColor()) // android.graphics.Color.BLACK
                    setPaintSize(this.getStrokeSize()) // 5f
                    canvas.drawPath(path, mPaint)
                }
                EditAction.SIZE -> {
                    setPaintColor(this.getStrokeColor()) // android.graphics.Color.BLACK
                    setPaintSize(this.getStrokeSize()) // 5f
                    canvas.drawPath(path, mPaint)
                }
                EditAction.ERASER -> {

                }
            }
        }
        canvas.drawPath(mEraserPath, mPaint)
        super.draw(canvas)
    }

1 Ответ

2 голосов
/ 18 марта 2019

Вместо использования draw используйте вместо этого функции SurfaceHolder.Callback, как показано ниже. У меня есть мф

class SlowSurfaceView @JvmOverloads constructor(
        context: Context,
        attrs: AttributeSet? = null,
        defStyleAttr: Int = 0)
    : SurfaceView(context, attrs, defStyleAttr), SurfaceHolder.Callback {

    private var mPaint: Paint = Paint()

    init {
        holder.addCallback(this)
        mPaint.isAntiAlias = true
        mPaint.isDither = true
        mPaint.style = Paint.Style.STROKE
        mPaint.strokeJoin = Paint.Join.ROUND
        mPaint.strokeCap = Paint.Cap.ROUND
        mPaint.strokeWidth = 3f
        mPaint.alpha = 255
        mPaint.color = android.graphics.Color.RED
        mPaint.xfermode = PorterDuffXfermode(PorterDuff.Mode.CLEAR)
    }

    override fun surfaceChanged(holder: SurfaceHolder, format: Int, width: Int, height: Int) {
        // Do nothing for now
    }

    override fun surfaceDestroyed(holder: SurfaceHolder) {
    }

    override fun surfaceCreated(holder: SurfaceHolder) {
        if (isAttachedToWindow) {
            val canvas = holder.lockCanvas()
            canvas?.let {
                it.drawRect(Rect(100, 100, 200, 200), mPaint)
                holder.unlockCanvasAndPost(it)
            }
        }
    }

    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec)

        val desiredWidth = suggestedMinimumWidth + paddingLeft + paddingRight
        val desiredHeight = suggestedMinimumHeight + paddingTop + paddingBottom

        setMeasuredDimension(View.resolveSize(desiredWidth, widthMeasureSpec),
                View.resolveSize(desiredHeight, heightMeasureSpec))
    }
}

См. Выше, измените код, и, надеюсь, вы получите то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...