zoukankan      html  css  js  c++  java
  • 仿英语流利说取词放大控件的实现

    1 取词放大控件

    英语流利说是一款很帮的口语学习app。在app的修炼页面长按屏幕,会弹出一个放大镜,当手指移到某个单词的附近,能够看到该英文单词会被选中,效果例如以下图所看到的:
    这里写图片描写叙述

    2 代码演示样例

    该控件挺有意思,于是我写了个简单的demo,点击下载,程序执行后的效果例如以下:
    这里写图片描写叙述

    3 实现原理

    该控件的实现原理比較简单,以下介绍几个比較重要的类

    1 WordView

    在实习该控件的过程中,我发现看似普通的TextView。其功能异常的强大。TextView的源代码值得研究。WordView的主要功能是依据touch的位置。选择其附近的单词。然后更改选中单词的颜色,关键代码例如以下:

    public void trySelectWord(MotionEvent event) {
        Layout layout = getLayout();
        if (layout == null) {
            return;
        }
        int line  = layout.getLineForVertical(getScrollY() + (int) event.getY());
        final int index = layout.getOffsetForHorizontal(line, (int) event.getX());
        Word selectedWord = getWord(index);
    
        if (selectedWord != null) {
            mSpannableString.setSpan(mForegroundColorSpan,
                    selectedWord.getStart(), selectedWord.getEnd(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            setText(mSpannableString);
            mSelectedWord = getText().subSequence(selectedWord.getStart(), selectedWord.getEnd()).toString();
            mOnWordSelectListener.onWordSelect();
        }
    }

    2 ExercisePanel

    该控件主要用来显示放大镜,原理比較简单,就不介绍了。

  • 相关阅读:
    Arpa's weak amphitheater and Mehrdad's valuable Hoses
    Arpa's loud Owf and Mehrdad's evil plan
    穷游中国在统题
    2016 ACM Amman Collegiate Programming Contest D Rectangles
    区间求和
    Redis 连接池的问题
    eBay 使用ReviseInventoryStatusCall调整库存和价格
    eBay Notification介绍
    Quartz.Net 配置模板范例
    Quartz.net misfire实践
  • 原文地址:https://www.cnblogs.com/blfshiye/p/5058634.html
Copyright © 2011-2022 走看看