textview - 覆盖 onDraw 时不显示 EditText 光标

标签 textview android

出于语法突出显示的目的,我已经在 CustomEditText 中覆盖了 onDraw,并将尝试使用 Canvas 颜色而不是 span 进行绘制(太慢了)。由于未调用 super.onDraw(),因此光标不再可见。是否可以显示光标?

最佳答案

我的解决方案是使用默认渲染器绘制屏幕,​​然后使用适当的颜色过度绘制。诀窍是调用 super.onDraw mid 方法。有关信息,我正在使用来自 920-Text-Editor-master 的库 libhighlight.so。代码仍然需要改进,但我对结果很满意。

   Highlight highlighter = new Highlight(); 

    @Override
    public void onDraw(final Canvas canvas)
    {
        int currentLine = getLayout().getLineForOffset(getSelectionStart());    
        int firstVisibleLineNumber = getLayout().getLineForVertical(getScrollY());
        int lastVisibleLineNumber = getLayout().getLineForVertical(getScrollY() + getHeight());
        int charWidth = (int) getPaint().measureText("8");

        for (int line = firstVisibleLineNumber; line < lastVisibleLineNumber; line++)
        {
            if (line == currentLine)
            {
                Rect r = new Rect();
                getLineBounds(line, r);
                canvas.drawRect(r, bgndPaint);
            }

            canvas.drawText(String.valueOf(line + 1),
                            5,
                            getLineBounds(line, null),
                            paintNumbers);
        }


        canvas.save();
        super.onDraw(canvas);
        canvas.restore();

        if (showSyntax == true)
        {
            int ret[] = highlighter.parse(getText().toString(), "/storage/emulated/0/projects/myIde/assets/html.conf");
            int spanQty = ret.length;
            if (spanQty < 1 || spanQty % 3.0F != 0)
            {
                return;
            }

            int styleQty = getText().toString().length();
            int[] style = new int[styleQty];
            for (int a = 0; a < styleQty;++a)
                style[a] = 0;

            for (int i = 0; i < spanQty; i++)
            {
                int group = ret[i];
                int start = ret[++i];
                int end   = ret[++i];

                int color = textColor;

                switch (group)
                {
                    case Highlight.GROUP_TAG_ID:
                        color = colorKeyword;
                        break;

                    case Highlight.GROUP_STRING_ID:
                        color = colorString;
                        break;

                    case Highlight.GROUP_KEYWORD_ID:
                        break;

                    case Highlight.GROUP_FUNCTION_ID:
                        break;

                    case Highlight.GROUP_COMMENT_ID:
                        color = colorComments;
                        break;

                    case Highlight.GROUP_ATTR_NAME_ID:
                        color = colorColor1;
                        break;

                    default:
                        continue;
                }

                for (int c = start; c < end; ++c)
                {
                    style[c] = color;
                }
            }


            for (int line = firstVisibleLineNumber; line < lastVisibleLineNumber; line++)
            {
                int start = getLayout().getLineStart(line);
                int end = getLayout().getLineEnd(line);

                String text = getText().toString().substring(start, end);

                for (int i = 0; i < text.length(); ++i)
                {
                    String c = text.substring(i, i + 1);

                    if (style[start + i] != 0)
                    {
                        getPaint().setColor(style[start + i]);
                        canvas.drawText(c, getPaddingLeft() + (i * charWidth), getLineBounds(line, null), getPaint());
                    }
                }
            }
        }
    }

关于textview - 覆盖 onDraw 时不显示 EditText 光标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23781182/

相关文章:

android - 在警告对话框中显示 TextView

android - 编辑文本 : how to set clipToPadding to false

android - 包含长 TextView 时缺少线性布局背景

android - 如何测试 Intent 是否已广播

Android TextView淡入淡出动画不起作用

Android TextView 需要 FadingEdge 渐变方向

android - Ionic 4 加载本地资源不适用于 IOS

android - PlaceAutocompleteFragment : automatically open SearchView

Android - 如何检索已注册地理围栏的列表

Android Toolbar + Tab Layout + Drawer,滚动时隐藏工具栏并将TabLayout带到顶部