Android实现字幕滚动的方法
本文实例介绍了安卓Android实现字幕滚动效果的方法。主要是一个现成的Java类文件实现的,该程序由Android达人Tony编写,本次是转发,还望原作者Tony不要介意。这个Android字幕滚动类的自定义功能比较多,可定义当前滚动到结尾时的停顿时间,单位:毫秒,还可设置当前的滚动速度,值越小,速度越快。
主要实现代码如下:
packagecom.tony.autoscroll;
importandroid.content.Context;
importandroid.os.Handler;
importandroid.util.AttributeSet;
importandroid.util.Log;
importandroid.view.MotionEvent;
importandroid.widget.ScrollView;
/**
*@authorTony
*/
publicclassAutoScrollViewextendsScrollView{
privatefinalHandlerhandler=newHandler();
privatelongduration=50;
privatebooleanisScrolled=false;
privateintcurrentIndex=0;
privatelongperiod=1000;
privateintcurrentY=-1;
privatedoublex;
privatedoubley;
privateinttype=-1;
/**
*@paramcontext
*/
publicAutoScrollView(Contextcontext){
this(context,null);
}
/**
*@paramcontext
*@paramattrs
*/
publicAutoScrollView(Contextcontext,AttributeSetattrs){
this(context,attrs,0);
}
/**
*@paramcontext
*@paramattrs
*@paramdefStyle
*/
publicAutoScrollView(Contextcontext,AttributeSetattrs,intdefStyle){
super(context,attrs,defStyle);
}
publicbooleanonTouchEvent(MotionEventevent){
intAction=event.getAction();
switch(Action){
caseMotionEvent.ACTION_DOWN:
x=event.getX();
y=event.getY();
if(type==0){
setScrolled(false);
}
break;
caseMotionEvent.ACTION_MOVE:
doublemoveY=event.getY()-y;
doublemoveX=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;
caseMotionEvent.ACTION_UP:
if(type==0){
currentIndex=getScrollY();
setScrolled(true);
}
break;
default:
break;
}
returnsuper.onTouchEvent(event);
}
@Override
publicbooleanonInterceptTouchEvent(MotionEventp_event)
{
Log.d("test","onInterceptTouchEvent");
returntrue;
}
/**
*判断当前是否为滚动状态
*@returntheisScrolled
*/
publicbooleanisScrolled(){
returnisScrolled;
}
/**
*开启或者关闭自动滚动功能
*@paramisScrolled
*true为开启,false为关闭
*/
publicvoidsetScrolled(booleanisScrolled){
this.isScrolled=isScrolled;
autoScroll();
}
/**
*获取当前滚动到结尾时的停顿时间,单位:毫秒
*@returntheperiod
*/
publiclonggetPeriod(){
returnperiod;
}
/**
*设置当前滚动到结尾时的停顿时间,单位:毫秒
*@paramperiod
*theperiodtoset
*/
publicvoidsetPeriod(longperiod){
this.period=period;
}
/**
*获取当前的滚动速度,单位:毫秒,值越小,速度越快。
*@returnthespeed
*/
publiclonggetSpeed(){
returnduration;
}
/**
*设置当前的滚动速度,单位:毫秒,值越小,速度越快。
*@paramspeed
*thedurationtoset
*/
publicvoidsetSpeed(longspeed){
this.duration=speed;
}
publicvoidsetType(inttype){
this.type=type;
}
privatevoidautoScroll(){
handler.postDelayed(newRunnable(){
@Override
publicvoidrun(){
booleanflag=isScrolled;
if(flag){
//Log.d("test","currentY="+currentY+"getScrollY()="+getScrollY());
if(currentY==getScrollY()){
try{
Thread.sleep(period);
}catch(InterruptedExceptione){
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);
}
}