Android 中文本行的垂直 fling 滚动

2024-03-15

我已经实现了 Android Note Pad 示例代码中的编辑器代码。现在我想添加垂直滚动文本行的功能。我想要完成的一个例子是 Andorid 中选项行的快速滚动

我在谷歌上搜索了滚动器和投掷的示例,但找不到任何适合我需要的东西。我还没有找到任何与我想做的事情有一点距离的东西。


我通过鲜血、汗水和泪水找到了我的问题的答案。我将其发布在这里希望对其他人有所帮助。以下方法位于 Android Note Pad 示例代码的 LinedEditText 类中。

===========================

    public void InitScroller(Context context) {
        mScroller = new Scroller(context);       // Get a scroller object
        mScrollY = 0 ;                          // Set beginning of program as top of screen.
        mMinScroll = getLineHeight ()/2;            // Set minimum scroll distance
        mFlingV = 750;                         // Minimum fling velocity

    }

 @Override
 public boolean onTouchEvent(MotionEvent event) {
     super.onTouchEvent(event);

  if (mVelocityTracker == null) {                       // If we do not have velocity tracker
         mVelocityTracker = VelocityTracker.obtain();   // then get one
     }
     mVelocityTracker.addMovement(event);               // add this movement to it

  final int action = event.getAction();  // Get action type
  final float y = event.getY();          // Get the displacement for the action

  switch (action) {

     case MotionEvent.ACTION_DOWN:          // User has touched screen
         if (!mScroller.isFinished()) {     // If scrolling, then stop now
             mScroller.abortAnimation();
         }
         mLastMotionY = y;                  // Save start (or end) of motion
         mScrollY = this.getScrollY();              // Save where we ended up
         mText.setCursorVisible (true);
         didMove = false;

         break;

     case MotionEvent.ACTION_MOVE:          // The user finger is on the move
         didMove = true;
         final int deltaY = (int) (mLastMotionY - y);  // Calculate distance moved since last report
         mLastMotionY = y;                             // Save the start of this motion

         if (deltaY < 0) {                              // If user is moving finger up screen
             if (mScrollY > 0) {                        // and we are not at top of text
                 int m = mScrollY - mMinScroll;         // Do not go beyond top of text
                 if (m < 0){
                     m = mScrollY; 
                 }else m = mMinScroll;

              scrollBy(0, -m);                           // Scroll the text up
             }
         } else 
             if (deltaY > 0) {                           // The user finger is moving up
                 int max = getLineCount() * getLineHeight () - sHeight;   // Set max up value
                 if (mScrollY < max-mMinScroll){
                     scrollBy(0, mMinScroll);           // Scroll up
                 }
             }
         postInvalidate();
         break;

     case MotionEvent.ACTION_UP:                       // User finger lifted up
         final VelocityTracker velocityTracker = mVelocityTracker;      // Find out how fast the finger was moving
         velocityTracker.computeCurrentVelocity(mFlingV);          
         int velocityY = (int) velocityTracker.getYVelocity();

         if (Math.abs(velocityY) > mFlingV){                                // if the velocity exceeds threshold
             int maxY = getLineCount() * getLineHeight () - sHeight;        // calculate maximum Y movement
             mScroller.fling(0, mScrollY, 0, -velocityY, 0, 0, 0, maxY);    // Do the filng
         }else{
             if (mVelocityTracker != null) {                                // If the velocity less than threshold
                 mVelocityTracker.recycle();                                // recycle the tracker
                 mVelocityTracker = null;
             }
         }
         break;
     }

     mScrollY = this.getScrollY();              // Save where we ended up

  return true ;                                 // Tell caller we handled the move event
 }



 public void computeScroll() {                  // Called while flinging to execute a fling step
     if (mScroller.computeScrollOffset()) {      
         mScrollY = mScroller.getCurrY();       // Get where we should scroll to 
         scrollTo(0, mScrollY);                 // and do it
         postInvalidate();                      // the redraw the sreem
     }
 }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 中文本行的垂直 fling 滚动 的相关文章

随机推荐

  • 有没有办法在成员名称循环中对 N C++ 类成员应用操作(可能通过预处理器)?

    问题 我有一个 C 类 其中有大量 gt 100 成员 其行为几乎相同 同类型 在函数中 每个成员都有与其他成员完全相同的代码 例如从构造函数中的映射进行赋值 其中映射键与成员键相同 这种行为的相同性在许多函数 gt 20 中重复出现 当然
  • Android - 手风琴小部件

    我正在寻找创建一个的最佳方法手风琴式小部件 如本页所示 http labs adobe com technologies spry samples accordion AccordionSample html 有没有办法使用标准 Andro
  • Omniauth“与”STI 和设计

    我想通了 没有结果 我有一个名为 User 的模型以及带有 STI 粉丝和艺术家的模型 如下所示 class User lt ActiveRecord Base devise database authenticatable registe
  • AngularJS - 为什么需要 $apply 来正确解决 $q 承诺?

    我正在尝试在我的角度应用程序中编写一个小型服务 这将使我能够选择全局 Javascript 对象中指定的配置参数 我不想尝试访问全局配置对象 除非文档已准备好 因为我无法保证脚本元素在 HTML 中插入的顺序 但是 我不明白为什么我需要打电
  • css 内联块与浮动

    我正在做一些测试float and inline block我注意到它们之间存在差异 正如你可以看到的这个例子 http codepen io anon pen kwrtD 如果我使用display inline blockdiv 之间有一
  • 如何检测OutofMemoryError的原因?

    我抱怨我的服务器应用程序在高负载时崩溃 这是一个运行在以下位置的网络应用程序Tomcat 5 我看到线程转储 并且发现存在 OutOfMemory 错误 1TISIGINFO 转储事件 systhrow 00040000 详细信息 java
  • java.lang.ClassCastException:DTOObject 无法转换为 DTOObject

    我在 Spring Boot 1 4 0M3 上运行的应用程序中遇到一个奇怪的问题 该应用程序使用 Spring 缓存实现 其中提供程序是 Redis 我收到 classCastException 无法转换相同的对象 我使用 Mongodb
  • C 中用户定义的数组大小

    我正在阅读 C 插图 第一个练习题问 MATMUL 程序将固定大小的矩阵相乘 使程序处理任何指定的尺寸 下面是我迄今为止提出的代码 但是我读到所有属性都需要在主函数之前声明 那么如何获得自定义大小的数组而不在主函数中声明它们呢 define
  • NSPopover - 焦点丢失时隐藏? (在弹出窗口外单击)

    我正在使用doubleClickAction of a NSTableView显示一个NSPopover 像这样的东西 NSInteger selectedRow dataTableView clickedRow NSInteger sel
  • 立即调用函数表达式:括号放在哪里?

    我看过IIFE的写法 function console log do cool stuff 也 function console log do more cool stuff 它们在我使用过的任何环境中似乎都一样工作 尽管有时我被告知一种方
  • Tomcat 6 - 请求的资源...不可用

    我正在尝试开始使用 Java 和 Stripes Framework 进行开发 我的 web xml 文件中有以下内容
  • Dropbox sdk 存储库 maven

    即使这听起来像是一个愚蠢的问题 我也无法找到 dropbox sdk 所在的存储库 所以在我的 pom xml 中我声明了这个依赖项
  • 如何在多个 Pod 上挂载相同的持久卷?

    我有一个三节点 GCE 集群和一个具有三个副本的单 Pod GKE 部署 我像这样创建了 PV 和 PVC Create a persistent volume for web content apiVersion v1 kind Pers
  • R 中的时间序列突破/变化/干扰检测:strucchange、changepoint、BreakoutDetection、bfast 等

    我希望这成为 R 中各种时间序列突破 变化 干扰检测方法的路标 我的问题是描述以下每个包的动机和方法差异 也就是说 什么时候使用一种方法比另一种方法更有意义 相似 差异等 有问题的包 结构变化 http cran r project org
  • 从 NXC 中的文件返回负值

    我将值保存到 NXC 不是 eXactly C 中的 csv 文件 然后在稍后的时间点调用它们 我遇到的问题是 当从单元格中调用任何负值时 它会显示为 0123 而不是 123 这会导致我所有的额外计算失败 当前的代码是 OpenFileR
  • X-RequestDigest:运行共享点页面记录的 Web 测试时出现错误

    我已成功记录并重播我的 sharepoint webtest 但一两周后 当我在 Visual Studio 中重播它时 我收到 403 FORBIDDEN 错误 我了解 X RequestDigest 的证书 令牌详细信息已过期 需要在我
  • 如何实现运行时多种策略的使用

    我需要处理从服务返回的记录列表 然而 记录的处理算法根据记录上的某个字段而完全改变 为了实现这一点 我定义了一个 IProcessor 接口 它只有一个方法 public interface IProcessor ICollection
  • 在 Windows 64 中编译 32 位应用程序时无法解析的外部符号

    所以我正在尝试将遗留应用程序从 32 位编译为 64 位 我重新编译了它使用的所有库 并使其查找 WIN SDK6 0A x64 位的库 我在用 Visual Studio 专业版 2008 视觉C dotNet 框架 3 5 SP1 Wi
  • GeoJson c# 示例解析世界上的国家并为每个国家生成Geojson

    寻找如何使用 geojson net 解析 反序列化 Geojson 文件的示例 由于某种原因 没有如何使用 geojson net 包的示例 我想在我的网站上使用它和 google 地图 api 目前我使用多边形形状 但希望转向使用 ge
  • Android 中文本行的垂直 fling 滚动

    我已经实现了 Android Note Pad 示例代码中的编辑器代码 现在我想添加垂直滚动文本行的功能 我想要完成的一个例子是 Andorid 中选项行的快速滚动 我在谷歌上搜索了滚动器和投掷的示例 但找不到任何适合我需要的东西 我还没有