返回顶部
首页 > 资讯 > 移动开发 >Android TextView drawText BaseLine理解,设置内容垂直、水平居中
  • 469
分享到

Android TextView drawText BaseLine理解,设置内容垂直、水平居中

居中Android 2022-06-06 13:06:31 469人浏览 八月长安
摘要

Android TextView drawText BaseLine理解   解决问题:如何设置绘制文本在盒子中 垂直居中 1. getHeight/2 设置为 drawTex

Android TextView drawText BaseLine理解 
 解决问题:如何设置绘制文本在盒子中 垂直居中
1. getHeight/2 设置为 drawText 绘制坐标,不能居中
  上代码XML:


 
        

Java代码:


package com.denganzhi.cusomerwidget.View;
import android.content.Context;
import android.graphics.canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.OvalShape;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;

public class MyView extends View {
    public MyView(Context context) {
        super(context);
    }
    Paint paint=null;
    Context context;
    public MyView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        this.context=context;
        //设置画笔
        paint=new Paint();
        paint.setColor(Color.BLACK);
        paint.setTextSize(80);
        paint.setTypeface(Typeface.DEFAULT_BOLD);  // 设置粗体
        paint.setAntiAlias(true);  // 消除锯齿
    }
    public MyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
    int pxW = dip2px(context,100);
    int pxH = dip2px(context,100);
    //pxW:200
    Log.e("denganzhi","pxW:"+pxW);
        // canvas 画板,背景色
        canvas.drawColor(Color.GREEN);
        Paint.FontMetrics fontMetrics = paint.getFontMetrics();
        // 这些坐标都是现对于baseLine的,top和ascent 是负数,在baseline的上面
        // bottom 、descent 是正数
       float top=fontMetrics.top;
       float bottom= fontMetrics.bottom;
       float asscent= fontMetrics.ascent;
       float descent=fontMetrics.descent;
       // top:-84.49219 bottom:21.679688 asscent:-74.21875descent:19.53125  Y100
        Log.e("denganzhi","top:"+top+" bottom:"+bottom+ " asscent:"+asscent+ "descent:"+descent +" centerY"+ getHeight()/2);
        // 画笔, 这个坐标是左下角的坐标,错误计算方法,baseLine 盒子 中心点,文字不能居中
          canvas.drawText("g我f",10,pxH/2,paint);
  // float newBaseLineY= getHeight()/2 + (( bottom-top)/2 - bottom);
   String drawStr="g我f";
   // X 轴居中
        //获取文本的宽度,和上面类似,但是是一个比较粗略的结果
        float measureText = paint.measureText(drawStr);
        Log.e("denganzhi1", "measureText="+measureText);
        // X 轴居中,盒子/2-文字宽度的/2 坐标开始绘制 文本
        float newBaseLineX = getWidth()/2 - measureText/2;
  // canvas.drawText(drawStr,newBaseLineX,newBaseLineY,paint);
    }
    public static int dip2px(Context context, float dpValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }
}

 文字未能垂直居中

分析: 文本绘制最坐标是getHeight()/2, baseline,文字在水平中心轴的上方,如果要实现文字水平居中,那么往下移动

 正确代码:

  float top=fontMetrics.top;
  float bottom= fontMetrics.bottom;
  float asscent= fontMetrics.ascent;
  float descent=fontMetrics.descent;
  float newBaseLineY= getHeight()/2 + (( bottom-top)/2 - bottom);

 float newBaseLineX = getWidth()/2 - measureText/2;
 


package com.denganzhi.cusomerwidget.View;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.OvalShape;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;

public class MyView extends View {
    public MyView(Context context) {
        super(context);
    }
    Paint paint=null;
    Context context;
    public MyView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        this.context=context;
        //设置画笔
        paint=new Paint();
        paint.setColor(Color.BLACK);
        paint.setTextSize(80);
        paint.setTypeface(Typeface.DEFAULT_BOLD);  // 设置粗体
        paint.setAntiAlias(true);  // 消除锯齿
    }
    public MyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
    int pxW = dip2px(context,100);
    int pxH = dip2px(context,100);
    //pxW:200
    Log.e("denganzhi","pxW:"+pxW);
        // canvas 画板,背景色
        canvas.drawColor(Color.GREEN);
        Paint.FontMetrics fontMetrics = paint.getFontMetrics();
        // 这些坐标都是现对于baseLine的,top和ascent 是负数,在baseline的上面
        // bottom 、descent 是正数
       float top=fontMetrics.top;
       float bottom= fontMetrics.bottom;
       float asscent= fontMetrics.ascent;
       float descent=fontMetrics.descent;
       // top:-84.49219 bottom:21.679688 asscent:-74.21875descent:19.53125  Y100
        Log.e("denganzhi","top:"+top+" bottom:"+bottom+ " asscent:"+asscent+ "descent:"+descent +" centerY"+ getHeight()/2);
        // 画笔, 这个坐标是左下角的坐标,错误计算方法,baseLine 盒子 中心点,文字不能居中
      //    canvas.drawText("g我f",10,pxH/2,paint);
   float newBaseLineY= getHeight()/2 + (( bottom-top)/2 - bottom);
   String drawStr="g我f";
   // X 轴居中
        //获取文本的宽度,和上面类似,但是是一个比较粗略的结果
        float measureText = paint.measureText(drawStr);
        Log.e("denganzhi1", "measureText="+measureText);
        // X 轴居中,盒子/2-文字宽度的/2 坐标开始绘制 文本
        float newBaseLineX = getWidth()/2 - measureText/2;
   canvas.drawText(drawStr,newBaseLineX,newBaseLineY,paint);
    }
    public static int dip2px(Context context, float dpValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }
}

输出效果:

pxW:200
top:-84.49219 bottom:21.679688 asscent:-74.21875descent:19.53125 centerY100
measureText=155.0

运行效果:

效果分析:


作者:小置同学


--结束END--

本文标题: Android TextView drawText BaseLine理解,设置内容垂直、水平居中

本文链接: https://lsjlt.com/news/29115.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Android TextView drawText BaseLine理解,设置内容垂直、水平居中
    Android TextView drawText BaseLine理解   解决问题:如何设置绘制文本在盒子中 垂直居中 1. getHeight/2 设置为 drawTex...
    99+
    2022-06-06
    居中 Android
  • div内容水平居中与div内容垂直居中的方法
    本文小编为大家详细介绍“div内容水平居中与div内容垂直居中的方法”,内容详细,步骤清晰,细节处理妥当,希望这篇“div内容水平居中与div内容垂直居中的方法”文章能帮助大家解决疑惑,下面跟着小编的思路慢...
    99+
    2024-04-02
  • div内容水平居中与div内容垂直居中怎么实现
    这篇文章主要讲解了“div内容水平居中与div内容垂直居中怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“div内容水平居中与div内容垂直居中怎么实...
    99+
    2024-04-02
  • CSS如何设置水平和垂直居中
    这篇文章主要介绍“CSS如何设置水平和垂直居中”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“CSS如何设置水平和垂直居中”文章能帮助大家解决问题。首先我先创建一个公共的模板样式<templat...
    99+
    2023-07-04
  • 如何设置css文字水平垂直居中
    这篇文章主要讲解了“如何设置css文字水平垂直居中”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何设置css文字水平垂直居中...
    99+
    2024-04-02
  • HTML怎么实现ul li内容垂直居中和水平居中
    本文小编为大家详细介绍“HTML怎么实现ul li内容垂直居中和水平居中”,内容详细,步骤清晰,细节处理妥当,希望这篇“HTML怎么实现ul li内容垂直居中和水平居中”文章能帮助大家解决疑惑,下面跟着小编...
    99+
    2024-04-02
  • css3中flex怎么实现div内容水平垂直居中
    这篇文章给大家分享的是有关css3中flex怎么实现div内容水平垂直居中的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、flex-direction: (元素排列方向)※ flex-direction:row...
    99+
    2023-06-08
  • css垂直水平居中设置的方法是什么
    CSS有多种方法可以实现垂直水平居中,以下是其中几种常用的方法:1. 使用flexbox布局:可以使用flexbox的属性来实现元素...
    99+
    2023-08-08
    css
  • Android Studio最新版本中实现TextView字体加粗、水平居中和垂直居中的方法
    Android Studio最新版本中实现TextView字体加粗、水平居中和垂直居中的方法 在Android应用程序开发中,TextView是常用的控件之一,用于在界面上显示文本内容。有时候我们需要...
    99+
    2023-10-24
    android studio android ide Android
  • CSS怎么设置未知大小图片在已知大小容器水平垂直居中
    本篇内容主要讲解“CSS怎么设置未知大小图片在已知大小容器水平垂直居中”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“CSS怎么设置未知大小图片在已知大小容器水平...
    99+
    2024-04-02
  • 如何设置一个层在浏览器中同时左右居中上下居中水平垂直居中
    本篇内容介绍了“如何设置一个层在浏览器中同时左右居中上下居中水平垂直居中”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作