如何在Java Canvas中绘制JSON文本?

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

我如何用JSON编写漂亮格式的Android Canvas对象/字符串?

例如,

val jsonText = "{"profile":{"name": "Robert","account_id": "31"}}"

将被绘制到看起来像Canvas的地方,

enter image description here

java android json android-canvas pretty-print
2个回答
2
投票

Canvas函数有一些局限性,因为它在一行中绘制了所有文本。如果文本的宽度超过了画布的宽度,则文本将被剪切。因此,我们将staticLayout用于同一内容以在段落或多行方法中显示文本。

下面的代码用于在画布中显示json格式的文本,其中json从资产文件中加载。

fun drawTextOnCanvas(activity: FragmentActivity) {
var canvas = Canvas(bitmap)
var textPaint=TextPaint()
textPaint.density=20f
textPaint.bgColor=Color.BLACK

val jsonText = activity.loadJSONFromAsset("demo.json")
val jsonObject = JSONObject(jsonText);
val text=jsonObject.toString(1)
val staticLayout=StaticLayout.Builder.obtain(text,0,text.length,textPaint,150)

staticLayout.build().draw(canvas)}

希望这会有所帮助!


0
投票

生成PDF

import android.graphics.Color
import android.graphics.Paint
import android.graphics.pdf.PdfDocument
import com.google.gson.GsonBuilder    

class PdfGeneratorService(){

    private val ROW_INC = 20F
    private val COL_INC = 15F

    fun jsonFormat(jsonStr: String): String {

        var indentCount = 0

        val builder = StringBuilder()
        for (c in jsonStr) {
            if (indentCount > 0 && '\n' == builder.last()) {
                for (x in 0..indentCount) builder.append("    ")
            }
            when (c) {
                '{', '[' -> {
                    builder.append(c).append("\n")
                    indentCount++
                }
                ',' -> builder.append(c).append("\n")
                '}', ']' -> {
                    builder.append("\n")
                    indentCount--
                    for (x in 0..indentCount) builder.append("    ")
                    builder.append(c)
                }
                else -> builder.append(c)
            }
        }

        return builder.toString()
    }

    private fun createPdf(textToPdf: String) {
        try {
            val gSon = GsonBuilder().setPrettyPrinting().create()
            val text = gSon.toJson(jsonFormat(textToPdf))

            val rawLines = text.split("\\n")
            val jsonLines = rawLines.map { it.replace("\\", "") }
            val maxLengthString = jsonLines.maxBy { it.length }

            val paint = Paint()
            paint.color = Color.BLACK
            paint.fontSpacing

            val pageWidth = paint.measureText(maxLengthString).toInt() + 2 * COL_INC.toInt() // 2, two side padding
            val pageHeight = (ROW_INC * rawLines.size + ROW_INC).toInt()

            val document = PdfDocument()
            val pageInfo: PdfDocument.PageInfo = PdfDocument.PageInfo.Builder(pageWidth, pageHeight, 1).create()
            val page: PdfDocument.Page = document.startPage(pageInfo)
            val canvas = page.canvas

            for (line in jsonLines) {
                canvas.drawText(line, column, row, paint)
                row += ROW_INC
            }

            document.finishPage(page)
            document.writeTo(FileOutputStream(File(PATH_TO_PDF_FILE)))
            document.close()
        }catch (e: java.lang.Exception){
            Log.e("classTag", e)
        }
    }
}

您可以找到有关如何使用Gson的文章

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