Kotlin,Android:从字节数组绘制单个像素

问题描述

我正在尝试编写一个包含自行设计的GUI的小游戏,目的是自学android-kotlin。除了将像素从无符号字节数组传输到屏幕之外,我已经弄清楚了所有内容。问题:.drawRGB(r,g,b)方法确实为整个画布着色,而不是为单个像素着色,我需要一种操作单个像素的方法,类似于.drawSinglePixelRGB(r,b,xpos,ypos)方法,但是经过两个小时的研究,我仍然卡住了。

我当前的项目结构如下:我创建了一个AParentandroid.view.View,它包含一个Canvas,其中包含一个BitmapAParent类从我的ABasicElement类扩展的对象负载获取颜色数据,所有对象都有方法getPixel(xpos,ypos)返回一个UByte数组,该数组包含3个Byte-Values(0到255)表示红色,绿色和蓝色。

我只是试图将ByteArray数据显示在屏幕上,如果有比“从View,Canvas和Bitmap扩展”更好/更快的方法,我很乐意知道。否则,我将非常感谢如何将ByteArray-Data / pixel传输到View / Canvas / Bitmap的解决方案。

这是我当前的AParent类,不需要addElem()recalcSubElemRegister()方法来理解:

package de.gfx.basicv2

import android.content.Context
import android.graphics.Bitmap
import android.graphics.Canvas
import android.view.View

class AParent (context: Context) : View(context) {

    var xSize : Int = 1
    var ySize : Int = 1
    private var whichSubElem = IntArray(xSize * ySize){-1}
    private var subElemList = arraylistof<ABasicElement>()

    private lateinit var extraCanvas: Canvas
    private lateinit var extraBitmap: Bitmap

    override fun onSizeChanged(width: Int,height: Int,oldWidth: Int,oldHeight: Int) {
        super.onSizeChanged(width,height,oldWidth,oldHeight)
        
        // Reorganizing SubElements of the Parent
        xSize = width
        ySize = height
        whichSubElem = IntArray(xSize * ySize){-1}
        for(i in 0 until subElemList.size){
            subElemList[i].resize(xSize,ySize)
            recalcSubElemRegister(subElemList[i],i)
        }

        // Canvas and Bitmap related Stuff
        if (::extraBitmap.isInitialized) extraBitmap.recycle()
        extraBitmap = Bitmap.createBitmap(width,Bitmap.Config.ARGB_8888)
        extraCanvas = Canvas(extraBitmap)

        refreshBitmap() // only refresh Bitmap-data once for testing purposes
    }

    override fun onDraw(canvas: Canvas) {

        // Draw the bitmap.
        canvas.drawBitmap(extraBitmap,0f,null)
    }

    // Not drawing related Method for adding SubElements to the parent
    fun addElem(elem : ABasicElement) {
        val elemID = subElemList.size
        subElemList.add(elem)
        for (x in xSize*elem.xSpanPercent.first/100 until xSize*elem.xSpanPercent.second/100){
            for (y in ySize*elem.ySpanPercent.first/100 until ySize*elem.ySpanPercent.second/100){
                whichSubElem[(y*xSize)+x] = elemID
            }
        }
    }

    // Not drawing related Method for resizing the Register of SubElements
    fun recalcSubElemRegister(elem: ABasicElement,elemID: Int){
        for (x in xSize*elem.xSpanPercent.first/100 until xSize*elem.xSpanPercent.second/100){
            for (y in ySize*elem.ySpanPercent.first/100 until ySize*elem.ySpanPercent.second/100){
                whichSubElem[(y*xSize)+x] = elemID
            }
        }
    }

    // Method for getting the pixels from all the SubElements to the screen,help needed here
    fun refreshBitmap(){
        for (x in 0 until xSize){
            for (y in 0 until ySize){
                if (whichSubElem[(y*xSize)+x] != -1){
                    val pixColor = subElemList[whichSubElem[(y*xSize)+x]].getPixel(x,y)
                    extraCanvas.drawRGB(pixColor[0].toInt(),pixColor[1].toInt(),pixColor[2].toInt())
                    // --!! instead of .drawRGB a method to draw a single Pixel is needed
                }

            }
        }
    }

}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...