Android基于TextView实现的跑马灯效果实例
本文实例讲述了Android基于TextView实现的跑马灯效果。分享给大家供大家参考,具体如下:
packagesweet.venst.act; importjava.io.BufferedReader; importjava.io.File; importjava.io.FileInputStream; importjava.io.FileNotFoundException; importjava.io.IOException; importjava.io.InputStream; importjava.io.InputStreamReader; importjava.io.UnsupportedEncodingException; importandroid.content.Context; importandroid.graphics.Canvas; importandroid.graphics.Color; importandroid.graphics.Paint; importandroid.os.Parcel; importandroid.os.Parcelable; importandroid.util.AttributeSet; importandroid.util.DisplayMetrics; importandroid.view.Display; importandroid.view.View; importandroid.view.WindowManager; importandroid.view.View.MeasureSpec; importandroid.view.View.OnClickListener; importandroid.widget.TextView; publicclassAutoScrollTextViewextendsTextView{ publicfinalstaticStringTAG=AutoScrollTextView.class.getSimpleName(); privatefloattextLength=0f;//文本长度 privateintviewWidth=0; privateintviewHight=300; privatefloatstep=0f;//文字的横坐标 privatefloaty=0f;//文字的纵坐标 privatefloattemp_view_plus_text_length=0.0f;//用于计算的临时变量 privatefloattemp_view_plus_two_text_length=0.0f;//用于计算的临时变量 publicbooleanisStarting=false;//是否开始滚动 privatePaintpaint=null;//绘图样式 privateStringtext="";//文本内容 publicAutoScrollTextView(Contextcontext) { super(context); } publicAutoScrollTextView(Contextcontext,AttributeSetattrs) { super(context,attrs); } publicAutoScrollTextView(Contextcontext,AttributeSetattrs,intdefStyle) { super(context,attrs,defStyle); } @Override protectedvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec) { //TODOAuto-generatedmethodstub super.onMeasure(widthMeasureSpec,heightMeasureSpec); intmeasureWidth=measureWidth(widthMeasureSpec); intmeasureHight=measureHeight(heightMeasureSpec); //intmeasureWidth=1024; //intmeasureHight=300; viewWidth=measureWidth; viewHight=measureHight; setMeasuredDimension(viewWidth,viewHight); } privateintmeasureWidth(intwidthMeasureSpec) { intspecMode=MeasureSpec.getMode(widthMeasureSpec); intspecSize=MeasureSpec.getSize(widthMeasureSpec); if(specMode==MeasureSpec.UNSPECIFIED){ returnviewWidth; } else{ returnviewWidth; } } privateintmeasureHeight(intwidthMeasureSpec){ intspecMode=MeasureSpec.getMode(widthMeasureSpec); intspecSize=MeasureSpec.getSize(widthMeasureSpec); if(specMode==MeasureSpec.UNSPECIFIED){ returnviewHight; }else{ returnviewHight; } } publicvoidsetScrollText(Stringtext) { this.text=text; inittextLength(text); //invalidate(); } publicvoidinit(Contextcx){ paint=getPaint(); paint.setTextSize(40); paint.setColor(Color.WHITE); text=getText().toString(); textLength=paint.measureText(text); viewWidth=getWidth(); if(viewWidth==0){ DisplayMetricsdm=newDisplayMetrics(); dm=cx.getApplicationContext().getResources().getDisplayMetrics(); viewWidth=dm.widthPixels; } step=textLength; temp_view_plus_text_length=viewWidth+textLength; temp_view_plus_two_text_length=viewWidth+textLength*2; y=getTextSize()+getPaddingTop(); } privatevoidinittextLength(Stringtext){ textLength=paint.measureText(text); step=textLength; temp_view_plus_text_length=viewWidth+textLength; temp_view_plus_two_text_length=viewWidth+textLength*2; } @Override publicParcelableonSaveInstanceState(){ ParcelablesuperState=super.onSaveInstanceState(); SavedStatess=newSavedState(superState); ss.step=step; ss.isStarting=isStarting; returnss; } @Override publicvoidonRestoreInstanceState(Parcelablestate){ if(!(stateinstanceofSavedState)){ super.onRestoreInstanceState(state); return; } SavedStatess=(SavedState)state; super.onRestoreInstanceState(ss.getSuperState()); step=ss.step; isStarting=ss.isStarting; } publicstaticclassSavedStateextendsBaseSavedState{ publicbooleanisStarting=false; publicfloatstep=0.0f; SavedState(ParcelablesuperState){ super(superState); } @Override publicvoidwriteToParcel(Parcelout,intflags){ super.writeToParcel(out,flags); out.writeBooleanArray(newboolean[]{isStarting}); out.writeFloat(step); } publicstaticfinalParcelable.Creator<SavedState>CREATOR=newParcelable.Creator<SavedState>(){ publicSavedState[]newArray(intsize){ returnnewSavedState[size]; } publicSavedStatecreateFromParcel(Parcelin){ returnnewSavedState(in); } }; privateSavedState(Parcelin){ super(in); boolean[]b=null; in.readBooleanArray(b); if(b!=null&&b.length>0) isStarting=b[0]; step=in.readFloat(); } } publicvoidstartScroll(){ isStarting=true; //invalidate(); } publicvoidstopScroll(){ isStarting=false; //invalidate(); } publicvoidonDraw(Canvascanvas){ canvas.save(); canvas.drawText(text,temp_view_plus_text_length-step,y,paint); if(!isStarting){ return; } step+=3.2;//0.5为文字滚动速度。 if(step>temp_view_plus_two_text_length) step=textLength; canvas.restore(); //invalidate(); postInvalidate(); } }
更多关于Android相关内容感兴趣的读者可查看本站专题:《Android开发入门与进阶教程》、《Android多媒体操作技巧汇总(音频,视频,录音等)》、《Android基本组件用法总结》、《Android视图View技巧总结》、《Android布局layout技巧总结》及《Android控件用法总结》
希望本文所述对大家Android程序设计有所帮助。