GVKun编程网logo

Android Canvas.drawText() 双十进制数未正确呈现(双十进制计数器是什么意思)

1

针对AndroidCanvas.drawText()双十进制数未正确呈现和双十进制计数器是什么意思这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展androidcanvasdrawText(

针对Android Canvas.drawText() 双十进制数未正确呈现双十进制计数器是什么意思这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展android canvas drawText()文字居中效果、Android canvas 里面 paint 旋转 canvas 有锯齿、android – 为什么我的Canvas.drawText()调用不起作用、android – 使用Canvas.drawText()定位文本等相关知识,希望可以帮助到你。

本文目录一览:

Android Canvas.drawText() 双十进制数未正确呈现(双十进制计数器是什么意思)

Android Canvas.drawText() 双十进制数未正确呈现(双十进制计数器是什么意思)

如何解决Android Canvas.drawText() 双十进制数未正确呈现

在尝试渲染一些文本和数字时出现奇怪的行为。问题很可能与线程有关。我的问题是,当我使用 Canvas.drawText() 绘制时,数字始终显示为 0.0,但如果我 Log.d(),则数字不是 0.0,而是大约 60。

这是我的代码:

游戏视图:

  1. class GameView(
  2. context: Context?,attrs: AttributeSet
  3. ) : SurfaceView(context,attrs),SurfaceHolder.Callback {
  4. private var gameLoop: GameLoop = GameLoop(this,holder)
  5. private val paint: Paint = Paint()
  6. init {
  7. holder.addCallback(this)
  8. isFocusable = true
  9. }
  10. fun update() {
  11. // Todo: update game state
  12. }
  13. override fun surfaceCreated(surfaceHolder: SurfaceHolder) {
  14. gameLoop.startLoop()
  15. }
  16. override fun surfaceChanged(surfaceHolder: SurfaceHolder,p1: Int,p2: Int,p3: Int) {
  17. // do nothing
  18. }
  19. override fun surfaceDestroyed(surfaceHolder: SurfaceHolder) {
  20. gameLoop.stopLoop()
  21. }
  22. override fun draw(drawCanvas: Canvas) {
  23. super.draw(drawCanvas)
  24. drawInfo(drawCanvas)
  25. }
  26. private fun drawInfo(canvas: Canvas) {
  27. val averageUps = gameLoop.getAverageUps()
  28. val averageFps = gameLoop.getAverageFps()
  29. val color = ContextCompat.getColor(context,DEBUG_TEXT_COLOR)
  30. paint.color = color
  31. paint.textSize = DEBUG_TEXT_SIZE
  32. canvas.drawText("UPS: $averageUps",40f,DEBUG_TEXT_SIZE,paint)
  33. canvas.drawText("FPS: $averageFps",DEBUG_TEXT_SIZE*2 + 10f,paint)
  34. }
  35. companion object {
  36. const val DEBUG_TEXT_SIZE = 40f
  37. const val DEBUG_TEXT_COLOR = R.color.light_blue_A200
  38. }
  39. }

游戏循环:

  1. class GameLoop(
  2. private val gameView: GameView,private val surfaceHolder: SurfaceHolder
  3. ) : Thread() {
  4. private var isRunning: Boolean = false
  5. private var averageUps: Double = 0.0
  6. private var averageFps: Double = 0.0
  7. fun getAverageUps(): Double {
  8. return averageUps
  9. }
  10. fun getAverageFps(): Double {
  11. return averageFps
  12. }
  13. fun startLoop() {
  14. isRunning = true
  15. start()
  16. }
  17. override fun run() {
  18. super.run()
  19. var updateCount = 0
  20. var frameCount = 0
  21. var startTime = 0L
  22. var elapsedtime = 0L
  23. var sleepTime = 0L
  24. var canvas: Canvas? = null
  25. startTime = System.currentTimeMillis()
  26. while (isRunning) {
  27. try {
  28. canvas = surfaceHolder.lockCanvas()
  29. synchronized(canvas) {
  30. gameView.update()
  31. updateCount++
  32. gameView.draw(canvas)
  33. }
  34. } catch (iae: IllegalArgumentException) {
  35. iae.printstacktrace()
  36. } finally {
  37. if (canvas != null) {
  38. surfaceHolder.unlockCanvasAndPost(canvas)
  39. frameCount++
  40. }
  41. }
  42. elapsedtime = System.currentTimeMillis() - startTime
  43. sleepTime = (updateCount*UPS_PERIOD - elapsedtime)
  44. if (sleepTime > 0) {
  45. try {
  46. sleep(sleepTime)
  47. } catch (ie: InterruptedException) {
  48. ie.printstacktrace()
  49. }
  50. }
  51. while (sleepTime < 0 && updateCount < MAX_UPS-1) {
  52. gameView.update()
  53. updateCount++
  54. elapsedtime = System.currentTimeMillis() - startTime
  55. sleepTime = (updateCount*UPS_PERIOD - elapsedtime)
  56. }
  57. elapsedtime = System.currentTimeMillis() - startTime
  58. if (elapsedtime >= 1000.0) {
  59. averageUps = updateCount.todouble() / (elapsedtime/1000.0)
  60. averageFps = frameCount.todouble() / (elapsedtime/1000.0)
  61. updateCount = 0
  62. frameCount = 0
  63. startTime = System.currentTimeMillis()
  64. }
  65. }
  66. }
  67. fun stopLoop() {
  68. // Todo: finish me...
  69. }
  70. companion object {
  71. private const val MAX_UPS: Long = 60
  72. const val UPS_PERIOD: Long = 1000/MAX_UPS
  73. }
  74. }

问题出在 GameView.drawInfo(canvas: Canvas) 中。输出总是“UPS: 0.0 FPS: 0.0”,但是当我注销 averageUps 和 averageFps 时,它们都在 ~60 左右。

希望你能帮我解决这个问题:-)

解决方法

回答我自己的问题: 问题出在包含 GameView 的活动中。 我在 xml 中有 GameView。 当我手动实例化 GameView 并使用 setContentView(gameView) 放置它时,所有渲染开始工作。

android canvas drawText()文字居中效果

android canvas drawText()文字居中效果

本文跟大家分享下我关于drawText()文字居中的方法。

先附上drawText()的方法说明


说实话当时看了这个,我也没明白这个x,y坐标到底表达的啥意思,还一直以为是绘制文字中心的坐标,后来发现这个理解是错误的
要想理解这个首先看张图


像图上这样安卓的文字绘制是相对于基线绘制的,也就是图中的红线,而top+bottom的长度就等于字体高度.即等于|top|+|bottom|绝对值

实际绘制的时候取决于基线上一个点来绘制文字,而这个点有三种分别对应为left,center,right如下图


而drawText()方法中x,y坐标所指的点就是上图基线上三个点中的一个,具体是哪一个根据paint的setTextAlign()方法设置,默认为left
示例代码如下

Rect rect = new Rect(100,100,500,500);//画一个矩形 
    Paint rectPaint = new Paint(); 
    rectPaint.setColor(Color.BLUE); 
    rectPaint.setStyle(Paint.Style.FILL); 
    canvas.drawRect(rect,rectPaint); 
 
    Paint textPaint = new Paint(); 
    textPaint.setColor(Color.WHITE); 
    textPaint.setTextSize(50); 
    textPaint.setStyle(Paint.Style.FILL); 
    //该方法即为设置基线上那个点究竟是left,还是right 这里我设置为center 
    textPaint.setTextAlign(Paint.Align.CENTER); 
 
    Paint.FontMetrics fontMetrics = textPaint.getFontMetrics(); 
    float top = fontMetrics.top;//为基线到字体上边框的距离,即上图中的top 
    float bottom = fontMetrics.bottom;//为基线到字体下边框的距离,即上图中的bottom 
 
    int baseLineY = (int) (rect.centerY() - top/2 - bottom/2);//基线中间点的y轴计算公式 
 
    canvas.drawText("你好世界",rect.centerX(),baseLineY,textPaint); 

这里有点要注意textPaint.getFontMetrics()这个方法一定要在设置字体大小或者样式等等一系列会影响字体的方法后在调用,不然获取到的top和bottom值不准.

效果如下


正好是在中间的,即证明等式是没有问题的,再来分析这个等式是如何计算的


之所以drawText()方法中x,y指的是基线中间的那个点,是因为setTextAlign(Paint.Align.Center)
那么要想在正中间显示文字,x只要为矩形的中点x坐标即可 x = rect.centerX()
要计算的就是基线中间图上红色点的y坐标了,看图可以发现红色点的y为矩形中点黑色点的y坐标+图中黑色点和红色点之间的距离
矩形y坐标为 rect.centerY()
黑色点和红色点之间的距离为相对于基线的(top+bottom)/2 - bottom
而 top是相对于基线的所以为负数,所以公式为 (-top+bottom)/2 - bottom简化下为-top/2 - bottom/2
所以最后计算为rect.centerY - top/2 - bottom/2.

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。

Android canvas 里面 paint 旋转 canvas 有锯齿

Android canvas 里面 paint 旋转 canvas 有锯齿

this.paint.setAntiAlias(true);
        this.paint.setStyle(Paint.Style.STROKE);//设置空心  
     this.paint.setColor(colorCircle);  

       canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG | Paint.LINEAR_TEXT_FLAG));

     canvas.rotate(xuzhuan);
        RectF oval1 = new RectF(a, b, c, d);
        canvas.drawRect(oval1, this.paint);

android – 为什么我的Canvas.drawText()调用不起作用

android – 为什么我的Canvas.drawText()调用不起作用

大家好:
我正在编写一个继承自TextView的类,并覆盖它的onDraw()方法,但在该方法中,我对canvas.drawText()的调用似乎不起作用,代码如下所示:
protected void onDraw(Canvas canvas) {
    // super.onDraw(canvas);
    Paint paint = new Paint();
    paint.setColor(android.graphics.Color.WHITE);
    paint.setTextSize(20);

    String text = "hello";
    canvas.drawText(text,paint);
}

解决方法

它没有绘制任何东西,因为文本坐标是左下角.由于您正在尝试绘制0,它将在屏幕上方绘制.

尝试将最后一行更改为:

canvas.drawText(text,20,paint);

android – 使用Canvas.drawText()定位文本

android – 使用Canvas.drawText()定位文本

我是Android开发的新手,现在正在尝试创建一个简单的应用程序.用户可以选择图像并向其添加文本.用户可以选择不同的字体和文本大小.对于预览,我在RelativeLayout中使用ImageView,创建的文本将从代码中添加到布局中(使用TextView).当用户按下保存按钮时,图像将与文本一起保存.

Canvas.drawText中的所有问题.我找不到计算右X和Y的好公式.绘制文本后总是处于错误的位置. Y位置总是根据字体而不同,X也做一个小缩进.

这是截图(首先是TextView,下面是图片文字):

Screenshot

这是我找到位置的代码:

public float[] getPosition(ImageView imageView, TextView textView) {
    Matrix matrix = new Matrix();
    imageView.getimageMatrix().invert(matrix);
    float[] coord = {textView.getX(), textView.getY()+textView.getHeight()};
    matrix.mapPoints(coord);
    return coord;
}

以下是绘制代码:

float[] coord = bundle.getFloatArray("coord");
        Canvas canvas = new Canvas(bitmap);
        Paint paint = new Paint();
        paint.setAntiAlias(true);
        paint.setTypeface(fontsList.get(bundle.getInt("font")));
        paint.setAlpha((int)(255*bundle.getFloat("alpha"))); 
        paint.setTextSize(bundle.getFloat("size")*bundle.getFloat("scale"));
        paint.setColor(bundle.getInt("color"));
        canvas.drawText(text, coord[0],coord[1],paint);

解决方法:

canvas.drawText()的X和Y参数指定原点.绘制文本的方式,原点的Y值位于文本的基线(字母所在的行)上,而原点的X值位于最左侧,最右侧或精确中心,具体取决于当前对齐Paint对象上的设置.

当您调用getX()和getY()时,您将获得TextView左上角的当前像素坐标.这不是TextView绘制的文本的来源.使用当前的Align设置,X值很好;但是,Y值不匹配.

如果要将文本与TextView的文本匹配,请尝试将textView.getBaseline()添加到getY()返回的值.

同样值得考虑使用其中一个文本布局类(例如StaticLayout或DynamicLayout)来绘制文本.在这种情况下,它将使用画布原点作为绘制文本的左上角绘制,因此您不需要计算基线.

今天的关于Android Canvas.drawText() 双十进制数未正确呈现双十进制计数器是什么意思的分享已经结束,谢谢您的关注,如果想了解更多关于android canvas drawText()文字居中效果、Android canvas 里面 paint 旋转 canvas 有锯齿、android – 为什么我的Canvas.drawText()调用不起作用、android – 使用Canvas.drawText()定位文本的相关知识,请在本站进行查询。

本文标签: