您好,登錄后才能下訂單哦!
在Android項目中利用TextView實現(xiàn)一個自動滾動功能?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
在做android 應(yīng)用的開發(fā)的時候,橫向滾動或者要做出跑馬燈的效果很簡單,textview本身的屬性就支持,只要設(shè)置準(zhǔn)確就會滾動,開發(fā)起來比較簡單,但是textview 不支持垂直滾動,那么垂直滾動就需要自己來實現(xiàn)了,很多網(wǎng)友提供的垂直滾 動方案都是千篇一律,使用ScrollView來進(jìn)行滾動,但是都不完美,做起來有些別扭。有一位網(wǎng)友給出的歌詞的滾動思路明確,能從根本上解決問題,因此我實現(xiàn)的這個滾動是在這位網(wǎng)友的基礎(chǔ)上實現(xiàn),封裝了一個View,view繼承自TextView。
關(guān)鍵點:
1、重寫onDrow方法,計算每次的滾動的距離。
2、計算view的Y軸的重點,讓當(dāng)前顯示的處于高亮顯示狀態(tài)。
3、定時的刷新View使其界面不斷的刷先,出現(xiàn)滾動的效果。
4、實現(xiàn)數(shù)據(jù)結(jié)構(gòu),將數(shù)據(jù)傳給view。
下面看看主要代碼:
1、創(chuàng)建一個類繼承TextView
/** * @author xushilin * * 垂直滾動的TextView Widget */ public class VerticalScrollTextView extends TextView
2、實現(xiàn)構(gòu)造函數(shù):
public VerticalScrollTextView(Context context) { super(context); init(); } public VerticalScrollTextView(Context context, AttributeSet attr) { super(context, attr); init(); } public VerticalScrollTextView(Context context, AttributeSet attr, int i) { super(context, attr, i); init(); } private void init() { setFocusable(true); //這里主要處理如果沒有傳入內(nèi)容顯示的默認(rèn)值 if(list==null){ list=new ArrayList<Notice>(); Notice sen=new Notice(0,"暫時沒有通知公告"); list.add(0, sen); } //普通文字的字號,以及畫筆顏色的設(shè)置 mPaint = new Paint(); mPaint.setAntiAlias(true); mPaint.setTextSize(16); mPaint.setColor(Color.BLACK); mPaint.setTypeface(Typeface.SERIF); //高亮文字的字號,以及畫筆顏色的設(shè)置 mPathPaint = new Paint(); mPathPaint.setAntiAlias(true); mPathPaint.setColor(Color.RED); mPathPaint.setTextSize(16); mPathPaint.setTypeface(Typeface.SANS_SERIF); }
3、從寫onDraw方法,并計算文字的行距,并且將將普通文字和高亮文字,在這個方法中繪制出來
protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawColor(0xEFeffff); Paint p = mPaint; Paint p2 = mPathPaint; p.setTextAlign(Paint.Align.CENTER); if (index == -1) return; p2.setTextAlign(Paint.Align.CENTER); canvas.drawText(list.get(index).getName(), mX, middleY, p2); float tempY = middleY; for (int i = index - 1; i >= 0; i--) { tempY = tempY - DY; if (tempY < 0) { break; } canvas.drawText(list.get(i).getName(), mX, tempY, p); } tempY = middleY; for (int i = index + 1; i < list.size(); i++) { tempY = tempY + DY; if (tempY > mY) { break; } canvas.drawText(list.get(i).getName(), mX, tempY, p); } }
4、計算Y軸中值以及更新索引
protected void onSizeChanged(int w, int h, int ow, int oh) { super.onSizeChanged(w, h, ow, oh); mX = w * 0.5f; mY = h; middleY = h * 0.5f; } private long updateIndex(int index) { if (index == -1) return -1; this.index=index; return index; }
5、定時更新view,并將接口暴露給客戶程序調(diào)用。
public void updateUI(){ new Thread(new updateThread()).start(); } class updateThread implements Runnable { long time = 1000; int i=0; public void run() { while (true) { long sleeptime = updateIndex(i); time += sleeptime; mHandler.post(mUpdateResults); if (sleeptime == -1) return; try { Thread.sleep(time); i++; if(i==getList().size()) i=0; } catch (InterruptedException e) { e.printStackTrace(); } } } } Handler mHandler = new Handler(); Runnable mUpdateResults = new Runnable() { public void run() { invalidate(); } };
6、xml布局文件中調(diào)用:
<?xml version="1.0" encoding="utf-8"?> <!-- Demonstrates scrolling with a ScrollView. --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <com.demo.xsl.text.SampleView android:id="@+id/sampleView1" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@drawable/selector" /> </LinearLayout>
7、java代碼中調(diào)用,傳遞數(shù)據(jù):
package com.demo.xsl.text; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.os.Bundle; import android.os.Handler; public class VerticalScrollTextActivity extends Activity { SampleView mSampleView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mSampleView = (SampleView) findViewById(R.id.sampleView1); List lst=new ArrayList<Sentence>(); for(int i=0;i<30;i++){ if(i%2==0){ Sentence sen=new Sentence(i,i+"、金球獎三甲揭曉 C羅梅西哈維入圍 "); lst.add(i, sen); }else{ Sentence sen=new Sentence(i,i+"、公牛欲用三大主力換魔獸????"); lst.add(i, sen); } } //給View傳遞數(shù)據(jù) mSampleView.setList(lst); //更新View mSampleView.updateUI(); } }
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。