首頁(yè) 收藏 QQ群
 網(wǎng)站導(dǎo)航

ZNDS智能電視網(wǎng) 推薦當(dāng)貝市場(chǎng)

TV應(yīng)用下載 / 資源分享區(qū)

軟件下載 | 游戲 | 討論 | 電視計(jì)算器

綜合交流 / 評(píng)測(cè) / 活動(dòng)區(qū)

交流區(qū) | 測(cè)硬件 | 網(wǎng)站活動(dòng) | Z幣中心

新手入門 / 進(jìn)階 / 社區(qū)互助

新手 | 你問(wèn)我答 | 免費(fèi)刷機(jī)救磚 | ROM固件

查看: 19666|回復(fù): 0
上一主題 下一主題
[案例]

android TextView 垂直自動(dòng)滾動(dòng)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2013-8-28 16:27 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
8在做android 應(yīng)用的開發(fā)的時(shí)候,橫向滾動(dòng)或者要做出跑馬燈的效果很簡(jiǎn)單,textview本身的屬性就支持,只要設(shè)置準(zhǔn)確就會(huì)滾動(dòng),開發(fā)起來(lái)比較簡(jiǎn)單,但是textview 不支持垂直滾動(dòng),那么垂直滾動(dòng)就需要自己來(lái)實(shí)現(xiàn)了,很多網(wǎng)友提供的垂直滾 動(dòng)方案都是千篇一律,使用ScrollView來(lái)進(jìn)行滾動(dòng),但是都不完美,做起來(lái)有些別扭。有一位網(wǎng)友給出的歌詞的滾動(dòng)思路明確,能從根本上解決問(wèn)題,因此我實(shí)現(xiàn)的這個(gè)滾動(dòng)是在這位網(wǎng)友的基礎(chǔ)上實(shí)現(xiàn),封裝了一個(gè)View,view繼承自TextView。先看看實(shí)現(xiàn)的效果:   
       
實(shí)現(xiàn)圖中效果的關(guān)鍵點(diǎn)是:   
1、重寫onDrow方法,計(jì)算每次的滾動(dòng)的距離。   
2、計(jì)算view的Y軸的重點(diǎn),讓當(dāng)前顯示的處于高亮顯示狀態(tài)。   
3、定時(shí)的刷新View使其界面不斷的刷先,出現(xiàn)滾動(dòng)的效果。   
4、實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu),將數(shù)據(jù)傳給view。   
下面看看主要代碼:   
1、創(chuàng)建一個(gè)類繼承TextView   
  1. /**   
    * @author xushilin   
    *   
    * 垂直滾動(dòng)的TextView Widget   
    */   
    public class VerticalScrollTextView extends TextView   
復(fù)制代碼
2、實(shí)現(xiàn)構(gòu)造函數(shù):   
  1. 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);   
                    //這里主要處理如果沒(méi)有傳入內(nèi)容顯示的默認(rèn)值   
                    if(list==null){   
                            list=new ArrayList<Notice>();   
                            Notice sen=new Notice(0,"暫時(shí)沒(méi)有通知公告");   
                            list.add(0, sen);   
                    }                  
                    //普通文字的字號(hào),以及畫筆顏色的設(shè)置   
                    mPaint = new Paint();   
                    mPaint.setAntiAlias(true);   
                    mPaint.setTextSize(16);   
                    mPaint.setColor(Color.BLACK);   
                    mPaint.setTypeface(Typeface.SERIF);                  
                    //高亮文字的字號(hào),以及畫筆顏色的設(shè)置   
                    mPathPaint = new Paint();   
                    mPathPaint.setAntiAlias(true);   
                    mPathPaint.setColor(Color.RED);   
                    mPathPaint.setTextSize(16);   
                    mPathPaint.setTypeface(Typeface.SANS_SERIF);   
            }   
復(fù)制代碼
3、從寫onDraw方法,并計(jì)算文字的行距,并且將將普通文字和高亮文字,在這個(gè)方法中繪制出來(lái)   
  1. 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);                           
                    }   
            }   
復(fù)制代碼
4、計(jì)算Y軸中值以及更新索引   
  1. 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;   
            }   
復(fù)制代碼
5、定時(shí)更新view,并將接口暴露給客戶程序調(diào)用。   
  1. 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();   
                    }   
            };   
復(fù)制代碼
6、xml布局文件中調(diào)用:   
  1. <?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>   
復(fù)制代碼
7、java代碼中調(diào)用,傳遞數(shù)據(jù):   
  1. 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+"、金球獎(jiǎng)三甲揭曉 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();                  
            }           
    }   
復(fù)制代碼
出處:http://www.cnblogs.com/vaiyanzi/   
VerticalScrollText.rar(64.51 KB, 下載次數(shù): 97)[/I]2012-5-15 10:22 上傳點(diǎn)擊文件名   下載積分: 下載豆 -2

上一篇:Android騰訊微薄客戶端開發(fā)教程匯總
下一篇:Android軟件開發(fā)之發(fā)送短信與系統(tǒng)短信庫(kù)解析(三十)

本版積分規(guī)則

Archiver|新帖|標(biāo)簽|軟件|Sitemap|ZNDS智能電視網(wǎng) ( 蘇ICP備2023012627號(hào) )

網(wǎng)絡(luò)信息服務(wù)信用承諾書 | 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證:蘇B2-20221768 丨 蘇公網(wǎng)安備 32011402011373號(hào)

GMT+8, 2024-10-20 20:38 , Processed in 0.058066 second(s), 13 queries , Redis On.

Powered by Discuz!

監(jiān)督舉報(bào):report#znds.com (請(qǐng)將#替換為@)

© 2007-2024 ZNDS.Com

快速回復(fù) 返回頂部 返回列表