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程序设计有所帮助。