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); } }