热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Android实现字幕滚动的方法

这篇文章主要介绍了Android实现字幕滚动的方法,很实用的功能,需要的朋友可以参考下

本文实例介绍了安卓Android实现字幕滚动效果的方法。主要是一个现成的Java类文件实现的,该程序由Android达人Tony编写,本次是转发,还望原作者Tony不要介意。这个Android字幕滚动类的自定义功能比较多,可定义当前滚动到结尾时的停顿时间,单位:毫秒,还可设置当前的滚动速度,值越小,速度越快。

主要实现代码如下:

package com.tony.autoscroll;
import android.content.Context;
import android.os.Handler;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.ScrollView;
/**
 * @author Tony
 */
public class AutoScrollView extends ScrollView {
 private final Handler handler   = new Handler();
 private long     duration   = 50;
 private boolean    isScrolled  = false;
 private int      currentIndex = 0;
 private long     period    = 1000;
 private int      currentY   = -1;
 private double   x;
 private double   y;
 private int type = -1;
 /**
 * @param context
 */
 public AutoScrollView(Context context) {
 this(context, null);
 }
 /**
 * @param context
 * @param attrs
 */
 public AutoScrollView(Context context, AttributeSet attrs) {
 this(context, attrs, 0);
 }
 /**
 * @param context
 * @param attrs
 * @param defStyle
 */
 public AutoScrollView(Context context, AttributeSet attrs, int defStyle) {
 super(context, attrs, defStyle);
 }
 public boolean onTouchEvent(MotionEvent event) {
 int Action = event.getAction();
 switch (Action) {
  case MotionEvent.ACTION_DOWN:
  x=event.getX();
  y=event.getY();
  if (type == 0) {
   setScrolled(false);
        }
  break;
  case MotionEvent.ACTION_MOVE:
  double moveY = event.getY() - y;
  double moveX = event.getX() - x;
  Log.d("test", "moveY = " + moveY + " moveX = " + moveX );
  if ((moveY>20||moveY<-20) && (moveX <50 || moveX > -50) && getParent() != null) {
   getParent().requestDisallowInterceptTouchEvent(true); 
        }
  break;
  case MotionEvent.ACTION_UP:
  if (type == 0) {
   currentIndex = getScrollY();
   setScrolled(true);
        }
  break;
  default:
  break;
 }
    return super.onTouchEvent(event); 
 }
  @Override 
   public boolean onInterceptTouchEvent(MotionEvent p_event) 
   { 
  Log.d("test", "onInterceptTouchEvent");
     return true; 
   } 
 /**
 * 判断当前是否为滚动状态
 * @return the isScrolled
 */
 public boolean isScrolled() {
 return isScrolled;
 }
 /**
 * 开启或者关闭自动滚动功能
 * @param isScrolled
 *      true为开启,false为关闭
 */
 public void setScrolled(boolean isScrolled) {
 this.isScrolled = isScrolled;
 autoScroll();
 }
 /**
 * 获取当前滚动到结尾时的停顿时间,单位:毫秒
 * @return the period
 */
 public long getPeriod() {
 return period;
 }
 /**
 * 设置当前滚动到结尾时的停顿时间,单位:毫秒
 * @param period
 *the period to set
 */
 public void setPeriod(long period) {
 this.period = period;
 }
 /**
 * 获取当前的滚动速度,单位:毫秒,值越小,速度越快。
 * @return the speed
 */
 public long getSpeed() {
 return duration;
 }
 /**
 * 设置当前的滚动速度,单位:毫秒,值越小,速度越快。
 * @param speed
 *the duration to set
 */
 public void setSpeed(long speed) {
 this.duration = speed;
 }
 public void setType(int type){
 this.type = type;
 }
 private void autoScroll() {
 handler.postDelayed(new Runnable() {
  @Override
  public void run() {
  boolean flag = isScrolled;
  if (flag) {
   //Log.d("test", "currentY = " + currentY + " getScrollY() = "+ getScrollY() );
   if (currentY == getScrollY()) {
   try {
    Thread.sleep(period);
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
   currentIndex = 0;
   scrollTo(0, 0);
   handler.postDelayed(this, period);
   } else {
   currentY = getScrollY();
   handler.postDelayed(this, duration);
   currentIndex++;
   scrollTo(0, currentIndex * 1);
   }
  } else {
  //currentIndex = 0;
  //scrollTo(0, 0);
  }
  }
 }, duration);
 }
}

推荐阅读
  • Android与JUnit集成测试实践
    本文探讨了如何在Android项目中集成JUnit进行单元测试,并详细介绍了修改AndroidManifest.xml文件以支持测试的方法。 ... [详细]
  • 本文探讨了在一个物理隔离的环境中构建数据交换平台所面临的挑战,包括但不限于数据加密、传输监控及确保文件交换的安全性和可靠性。同时,作者结合自身项目经验,分享了项目规划、实施过程中的关键决策及其背后的思考。 ... [详细]
  • 在处理大数据量的SQL分页查询时,通常需要执行两次查询来分别获取数据和总记录数。本文介绍了一种优化方法,通过单次查询同时返回分页数据和总记录数,从而提高查询效率。 ... [详细]
  • 在尝试使用 Android 发送 SOAP 请求时遇到错误,服务器返回 '无法处理请求' 的信息,并指出某个值不能为 null。本文探讨了可能的原因及解决方案。 ... [详细]
  • 新浪微博热搜暂停更新;即刻APP回归;Android 11 Beta版发布 | 科技新闻速递
    为您带来最新的科技资讯,涵盖社交媒体动态、软件更新及行业重大事件。CSDN携手您共同关注科技前沿。 ... [详细]
  • 本文通过一个具体的实例,介绍如何利用TensorFlow框架来计算神经网络模型在多分类任务中的Top-K准确率。代码中包含了随机种子设置、模拟预测结果生成、真实标签生成以及准确率计算等步骤。 ... [详细]
  • 提升移动应用用户体验的8个设计策略
    随着移动应用成为数字世界连接的关键桥梁,用户体验(UX)设计的重要性日益凸显。本文将探讨为何优质的UX设计对移动应用的成功至关重要,并分享8个实用的设计技巧,帮助开发者优化用户体验。 ... [详细]
  • 在将 Android Studio 从 3.0 升级到 3.1 版本后,遇到项目无法正常编译的问题,具体错误信息为:org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:processDemoProductDebugResources'。 ... [详细]
  • 嵌套列表的扁平化处理
    本文介绍了一种方法,用于遍历嵌套列表中的每个元素。如果元素是整数,则将其添加到结果数组中;如果元素是一个列表,则递归地遍历这个列表。此方法特别适用于处理复杂数据结构中的嵌套列表。 ... [详细]
  • 实践指南:使用Express、Create React App与MongoDB搭建React开发环境
    本文详细介绍了如何利用Express、Create React App和MongoDB构建一个高效的React应用开发环境,旨在为开发者提供一套完整的解决方案,包括环境搭建、数据模拟及前后端交互。 ... [详细]
  • 本文详细介绍了如何在Android L版本中应用Material Design的主题和布局,包括Material主题的应用方法、自定义主题和颜色方案、状态栏和导航条的自定义,以及Material Design布局的特点和兼容性处理。 ... [详细]
  • 本文详细探讨了BCTF竞赛中窃密木马题目的解题策略,重点分析了该题目在漏洞挖掘与利用方面的技巧。 ... [详细]
  • 本文将在前几篇关于Android测试理论知识的基础上,通过ApiDemoTest实例详细探讨如何使用ApplicationTestCase进行Android应用测试。建议读者先阅读Android测试教程系列中的相关内容,以便更好地理解本文的实践部分。 ... [详细]
  • 本文详细介绍了`android.os.Binder.getCallingPid()`方法的功能和应用场景,并提供了多个实际的代码示例。通过这些示例,开发者可以更好地理解如何在不同的开发场景中使用该方法。 ... [详细]
  • 本文介绍了一个使用Slideview组件实现循环轮播效果的例子,并将其作为ListView顶部的一项。此ListView包含了两种不同的模板设计,一种以Slideview为核心,另一种则是标准的单元格模板,包含按钮和标签。 ... [详细]
author-avatar
谢文友6123
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有