First on:
watermark/2/text/ahr0cdovl2jsb2cuy3nkbi5uzxqvdgfuz25lbmd3dq==/font/5a6l5l2t/fontsize/400/fill/i0jbqkfcma==/ Dissolve/70/gravity/center "height=" 369 "width=" 199 ">
watermark/2/text/ahr0cdovl2jsb2cuy3nkbi5uzxqvdgfuz25lbmd3dq==/font/5a6l5l2t/fontsize/400/fill/i0jbqkfcma==/ Dissolve/70/gravity/center "height=" 369 "width=" 202 ">
watermark/2/text/ahr0cdovl2jsb2cuy3nkbi5uzxqvdgfuz25lbmd3dq==/font/5a6l5l2t/fontsize/400/fill/i0jbqkfcma==/ Dissolve/70/gravity/center "height=" 441 "width=" 265 ">
Code:
Package Com.example.scrolltextview;import Java.util.hashmap;import Java.util.iterator;import java.util.Map;import Android.content.context;import Android.content.res.typedarray;import Android.graphics.paint;import Android.os.handler;import Android.os.message;import Android.util.attributeset;import Android.util.Log;import Android.view.layoutinflater;import Android.view.view;import Android.view.viewgroup;import Android.widget.arrayadapter;import Android.widget.linearlayout;import Android.widget.scroller;import Android.widget.spinneradapter;import Android.widget.textview;public class Scrolltextview extends ViewGroup {private static final int SCROLL = 0;private static final int JUSTIFY = 1;private static final int animation_duration = 3000;privat e int morientation;private int msize;private int mindex;private int mposition;private Scroller mscroller;private Map<V Iew, integer> mviews;private spinneradapter madapter;private int mpackedviews;private int mAnimationDuration; private float MeAsuredwidth = 0;private Float textSize = 0;private float measuredheight = 0;private String text= null;private string[] Dat A;private Boolean flag = True;public Scrolltextview (context context, AttributeSet Attrs) {Super (context, attrs); int[] Lin Erarlayoutattrs = {Android. R.attr.orientation,}; TypedArray a = Context.obtainstyledattributes (Attrs, linerarlayoutattrs); morientation = A.getinteger (0, Linearlayout.horizontal); a.recycle (); manimationduration = Animation_duration;mscroller = new Scroller (context); Mindex = -1;mposition = -1;mpackedviews = -1;mviews = new Hashmap<view, integer> (); setfocusable (true); Setfocusableintouchmode (TRUE);} Public float getcharacterwidth (String text, float size) {if (null = = text | | "". Equals (text)) return 0;float width = 0; Paint paint = new paint ();p aint.settextsize (size), float text_width = paint.measuretext (text),//Get overall length width = text_width /text.length ();//The length of the character return width;} public void SetText (String text) {This.text = Text;data = new String[]{this.text}; LaYoutinflater inflater= (Layoutinflater) GetContext (). Getsystemservice (GetContext (). Layout_inflater_service); TextView view = (TextView) inflater.inflate (R.layout.scroll_text_view, null); textSize = View.gettextsize (); Measuredheight = Textsize;textsize = Getcharacterwidth (text,textsize);} public void Beginscroll () {Thread.Start ();} Thread thread = new Thread (new Runnable () {Boolean enabled = true; @Overridepublic void Run () {//TODO auto-generated Metho D stubwhile (enabled) {try {thread.sleep (4000);} catch (Interruptedexception e) {//TODO auto-generated catch Blocke.printstacktrace ();} Setnextview (); enabled = Mindex + 1 < Madapter.getcount ();}}); @Overrideprotected void onmeasure (int widthmeasurespec, int heightmeasurespec) {super.onmeasure (Widthmeasurespec, HEIGHTMEASURESPEC); measuredwidth = Getmeasuredwidth (); msize = Morientation = Linearlayout.horizontal?
Getmeasuredwidth (): Getmeasuredheight (); if (flag && text!=null) {int length = Text.length (); LOG.I ("AAA", "Length*textsize:" +length*textsize+ "Measuredwidth:" +measuredwidth); if (Length*textsize >= measuredwidth) {int textcountinoneline = (int) (measuredwidth/textsize-1); int linecount = (int) (length% textcountinoneline==0)? (length/textcountinoneline):(length/textcountinoneline+1)); LOG.I ("AAA", "Length:" +length+ "Textcountinoneline:" +textcountinoneline+ "LineCount:" +linecount ");d ata = new string[ linecount];for (int i=0;i<linecount;i++) {if ((i+1) *textcountinoneline<length) data[i] = text.substring (i* Textcountinoneline, (i+1) *textcountinoneline); Elsedata[i] = text.substring (i*textcountinoneline, length); LOG.I ("AAA", "Data:" +data[i]);}} Else{data = new String[]{text};} arrayadapter<string> adapter = new Arrayadapter<string> (GetContext (), R.layout.scroll_text_view, data); Setadapter (adapter); flag = false;} View view = Getchildat (0), if (view!=null) {measurechild (view, WidtHmeasurespec, widthmeasurespec); measuredheight = View.getmeasuredheight ();} Setmeasureddimension ((int) measuredwidth, (int) measuredheight);} private int getpackedviews (int offset) {int size = Msize;int start = offset/size;int numviews = offset% size! = 0?
1:0;return Start << 1 | Numviews;} Handler Handler = new Handler () {@Overridepublic void Handlemessage (Message msg) {mscroller.computescrolloffset (); int Currx = Mscroller.getcurrx (); int delta = Mposition-currx;mposition = Currx;int packed = getpackedviews (mposition); manage Views (packed); scroll (delta), if (!mscroller.isfinished ()) {handler.sendemptymessage (msg.what);} else {if (Msg.what = = SCROLL) {justify ();} else {mindex = Mposition/msize;}}}; private void Justify () {int offset = mposition% msize;if (offset! = 0) {int endposition = mposition-offset;if (offset & Gt MSIZE/2) {endposition + = msize;} Mscroller.startscroll (mposition, 0, endposition-mposition, 0, manimationduration); Handler.sendemptymessage (JUSTIFY );} else {mindex = mposition/msize;}} private void scroll (int offset) {if (morientation = = Linearlayout.horizontal) {for (View View:mViews.keySet ()) {View.off Setleftandright (offset);}} else {for (View View:mViews.keySet ()) {view.offsettopandbottom (offset);}} InchValidate ();} public void setselection (int index, Boolean animate) {if (index = = mindex) {return;} int endposition = index * msize;int diff = math.abs (index-mindex); int sign = index > Mindex?
1: -1;mindex = Index;if (diff > 1) {mposition = Endposition-sign * msize;} if (animate) {mscroller.startscroll (mposition, 0, endposition-mposition, 0, manimationduration); Handler.removemessages (JUSTIFY); handler.removemessages (SCROLL); Handler.sendemptymessage (JUSTIFY);} else {mposition = endposition;manageviews (index << 1); invalidate ();}} private void manageviews (int packedviews) {if (packedviews = = mpackedviews) {return;} Mpackedviews = Packedviews;int Startidx = packedviews >> 1;int endidx = Startidx + (packedviews & 1); int VIEWIDX = Startidx;while (viewidx <= endidx) {if (!mviews.containsvalue (VIEWIDX)) {if (viewidx >= 0 && Viewidx < Madapter.getcount ()) {View view = Madapter.getview (VIEWIDX, NULL, this); Mviews.put (view, VIEWIDX); AddView (view);}} viewidx++;} Remove not visible viewsiterator<view> iterator = Mviews.keyset (). iterator (), while (Iterator.hasnext ()) {View view = Iterator.next (); int idx = Mviews.get (view); if (idx < STARTIDX || IDX > Endidx) {iterator.remove (); Removeview (view);}}} public int getselection () {return mindex;} public void Setpreviousview () {if (Madapter! = null && mindex > 0) {setselection (mIndex-1, True);}} public void Setnextview () {if (Madapter! = null && Mindex + 1 < Madapter.getcount ()) {setselection (mindex+1, tr UE);}} public void Setadapter (Spinneradapter adapter) {Madapter = Adapter;if (madapter! = null) {setselection (0, False);}} @Overrideprotected void OnLayout (Boolean changed, int l, int t, int r, int b) {for (View View:mViews.keySet ()) {if (view . getwidth () = = 0) {//New View:not layout () edint idx = Mviews.get (View); if (morientation = = linearlayout.horizontal) {int left = Msize * Idx-mposition;view.layout (left, 0, Left+r-l, b-t);} else {int top = msize * Idx-mposition;view.layout (0, Top, r-l, top+b-t);}}}}
Use:
String temp = getresources (). getString (r.string.info); Scrolltextview switcher1 = (scrolltextview) Findviewbyid (r.id.switcher1); Switcher1.settext (temp); Switcher1.beginscroll ();
Alas, I think I am really lazy ....
Or just give it to project!
Source
Copyright notice: This article Bo Master original article. Blog, not reproduced without consent.
ViewGroup can be achieved up and down, all over the marquee effect scrolling