自己实现的一个不会奇奇怪怪换行的TextView.

public class TextDrawView extends View {
    private int textColor = 0xffafafaf;
    private float textSize = 12;
    private String textToDraw = "";
    private List<String> textLines=new ArrayList<String>();
    private float lineMul=1.3f;
    TextPaint textPaint;

    public TextDrawView(Context context) {
        super(context);
        init();
    }

    public TextDrawView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public TextDrawView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    public void init() {
        textPaint = new TextPaint();
        textPaint.setAntiAlias(true);
        setTextColor(textColor);
        setTextSize(textSize);
    }

    public void setTextColor(int textColor) {
        this.textColor = textColor;
        textPaint.setColor(textColor);
    }

    /**
     * 单位sp
     */
    public void setTextSize(float textSize) {
        Context context = this.getContext();
        Resources r = Resources.getSystem();
        if (context != null) {
            r = context.getResources();
        }
        this.textSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, textSize, r.getDisplayMetrics());
        textPaint.setTextSize(this.textSize);
    }

    public void setText(String textToDraw) {
        if (textToDraw == null) {
            return;
        }
        this.textToDraw = textToDraw;
        invalidate();
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        LogUtils.i("neal", "onmeasure");
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        textLines.clear();
        while (textToDraw.length() > 0) {
            int size = textPaint.breakText(textToDraw, true, getMeasuredWidth(),
                    null);
            textLines.add(textToDraw.substring(0, size));
            textToDraw = textToDraw.substring(size);
        }
        int width, height;
        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
        int heightMode = MeasureSpec.getMode(heightMeasureSpec);
        int widthSize = MeasureSpec.getSize(widthMeasureSpec);
        int heightSize = MeasureSpec.getSize(heightMeasureSpec);
        if (widthMode == MeasureSpec.EXACTLY) {
            width = widthSize;
        } else {
            width = getMeasuredWidth();
        }
        if (heightMode == MeasureSpec.EXACTLY) {
            height = heightSize;
        } else {
            height = textLines.size()*(int)(textPaint.getTextSize()*lineMul)+1;
        }
        setMeasuredDimension(width, height);

    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        LogUtils.i("neal", "ondraw");
        float x=0;
        float y=textPaint.getTextSize();
        for(String text:textLines){
            canvas.drawText(text,x,y,textPaint);
            y=y+textPaint.getTextSize()*lineMul;
        }

    }
}

很简单的原理,就是自己用canvas去drawtext.

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-21 16:46:24

自己实现的一个不会奇奇怪怪换行的TextView.的相关文章

奇奇怪怪

我觉得,上帝的确是在掷色子. 在寒风瑟瑟的2月,即将迎来春季的2月,枯萎的人们已经失去希望的2月, 在无比光辉而冰冷的2月, 脑子里突然浮起一个气泡:lrh在2017年2月2日晚上复习了概率论和数学期望. 又一个气泡:lrh在2016年12月7日哭干所有眼泪之后,纵身从广饶一中二校区教学楼顶轻轻跃下. 又一个气泡:lrh在2016年3月20日考试超常发挥,从而告别初中生活,成为初中的人赢. 又一个气泡:lrh在2016年2月21日某天深夜, 用一把平常用来削苹果的瑞士折叠刀割断了左手桡动脉.次日

JavaScript中的&quot;奇奇怪怪&quot;

filter等方法的隐式转化 var list = [1,,2,,0,5,9];console.log(list[1]); // console: undefinedconsole.log(list[1] !== null); // console.log: undefined list = list.filter(item => item !== null);// console: [1, 2, 0, 5, 9] 通过prototype骗过引擎 var proto = {};var obj =

一些奇奇怪怪但很激励我的话

靠作弊和打表取得高分的学生在这条路上是走不了太远的.(来自知乎某回答) 当你学习到一定高度之后,许多别人眼中看似精妙的算法,在你眼中都成为了暴力,所以,暴力才是正解.(来自一位教练) 独行的路上亦可有光.(来自一位我很敬重的学姐) 希望就在前方.(来自同机房的一位大佬) 原文地址:https://www.cnblogs.com/valentino/p/11185233.html

一个仿爱奇艺视频,腾讯视频,搜狐视频首页推荐位轮播图类库

前言:本篇只是一个介绍这个一个类库,具体实现思路代码会下篇中进行分析出来, 一个仿爱奇艺视频,腾讯视频,搜狐视频首页推荐位轮播图类库,  github地址: https://github.com/hejunlin2013/SuperIndicator , 如果觉得还行,欢迎点个star. SuperIndicator a superindicatorlibray for viewpager, banner 仿爱奇艺视频,腾讯视频,搜狐视频首页推荐位轮播图 专业轮播图库,没有之一 也可以应用于广告

奇淫怪巧之给Delphi的PrintDialog增加一个页码选定范围打印的Edit 转

奇淫怪巧之给Delphi的PrintDialog增加一个页码选定范围打印的Edit 在Delphi中使用PrintDialog打印对话框的时候,这个控件有三个选项,就是PrintRang那个属性的三个选项,其中有一个选项三,让我们自定义选择页码范围来打印.但是比较蛋疼的是,这个地方选中了之后啥子效果都没有.无法制定自己的页码范围,很是蛋疼.这里实际上应该要有一个Edit之类的编辑框的,这样可以让用户输入1,2,3-4之类的页码范围来整就比较人性化了.起初以为是自己没有指定某属性神马的导致,于是在

[奇淫怪巧] 利用正则表达式判断素数

最近在学习正则表达式,偶然间看到利用正则表达式判断一个数是不是素数的帖子.当时就震惊了,觉得好神奇.那个判断素数的函数是这样子的: public static bool IsPrime(int i) { return !Regex.IsMatch(new String('*', i), "^.?$|^(..+?)\\1+$"); } 有没有觉得很神奇?我当时就觉得相当的有想象力的一种实现.那让我们看一下这个正则表达式是如何做判断素数的. 第一步,创建了一个长度为i,并以'*'填充的字符

你不知道的 docker 命令的奇淫怪巧

你不知道的 docker 命令的奇淫怪巧 Intro 介绍并收录一些可能会用到的一些简单实用却很少有人用的 docker 命令 dangling images build 自己的 docker 镜像的时候,有时会遇到用一个甚至多个中间层镜像,这会一定程度上减少最终打包出来 docker 镜像的大小,但是会产生一些tag 为 none 的无用镜像,也称为悬挂镜像 (dangling images) 列出所有的 dangling images: docker images -f "dangling=

你可能不知道的 docker 命令的奇淫怪巧

原文:你可能不知道的 docker 命令的奇淫怪巧 你可能不知道的 docker 命令的奇淫怪巧 Intro 介绍并收录一些可能会用到的一些简单实用却很少有人用的 docker 命令 dangling images build 自己的 docker 镜像的时候,有时会遇到用一个甚至多个中间层镜像,这会一定程度上减少最终打包出来 docker 镜像的大小,但是会产生一些tag 为 none 的无用镜像,也称为悬挂镜像 (dangling images) 列出所有的 dangling images:

Android中一个关于ListView的奇怪问题

今天在做项目的时候发现了一个比较奇怪的问题,是关于ListView的,即ListView的android:height属性会影响程序中ListView的getView()方法的调用次数,如果设置ListView的android:height属性为0dp,同时设置android:weight=1,或者直接设置android:height属性为"wrap_content",那么ListView在展示数据的时候,getView()被执行的次数并不会是传入数据集合的size,而会比size的值