Android 实现歌词滚动

自定义TextView

public class VerticalScrollTextView extends TextView {
    private Paint mPaint;
    private float mX;
    private Paint mPathPaint;   
    public int index = 0;
    private List<Sentence> list;
    public float mTouchHistoryY;
    private int mY; 
    private float middleY;//
    private static final int DY = 40; //
    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);
        if(list==null){
            list=new ArrayList<Sentence>();
            Sentence sen=new Sentence(0,"  ");
            list.add(0, sen);
        }       

        // 
        mPaint = new Paint();
        mPaint.setAntiAlias(true);
        mPaint.setTextSize(24);
        mPaint.setColor(Color.BLACK);
        mPaint.setAlpha(80);
        mPaint.setTypeface(Typeface.SERIF);

        // 
        mPathPaint = new Paint();
        mPathPaint.setAntiAlias(true);
        mPathPaint.setColor(Color.RED);
        mPathPaint.setTextSize(24);
        mPathPaint.setTypeface(Typeface.SANS_SERIF);
    }
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawColor(0xEFeffff);
        Paint p = mPaint;
        Paint p2 = mPathPaint;
        p.setTextAlign(Paint.Align.LEFT);
        if (index == -1)
            return;
        p2.setTextAlign(Paint.Align.LEFT);
        // 
        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);           
        }
    }
    protected void onSizeChanged(int w, int h, int ow, int oh) {
        super.onSizeChanged(w, h, ow, oh);
        mX = w * 0.3f; 
        mY = h;
        middleY = h * 0.5f;
    }

    public long updateIndex(int index) {    
        if (index == -1)
            return -1;
        this.index=index;       
        return index;
    }

    public List<Sentence> getList() {
        return list;
    }

    public void setList(List<Sentence> list) {
        this.list = list;
    }
    public void updateUI(){
        new Thread(new updateThread()).start();
    }
    class updateThread implements Runnable {
        long time = 300; 
        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;
                           time = 300;
                        }
                } catch (InterruptedException e) {                  
                    e.printStackTrace();
                }
            }
        }
    }
    Handler mHandler = new Handler();
    Runnable mUpdateResults = new Runnable() {
        public void run() {
            invalidate(); // 
        }
    };
}

数据封装类

public class Sentence {

    private String name;
    private int index;

    public Sentence(int index,String name){
        this.name=name;
        this.index=index;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getIndex() {
        return index;
    }

    public void setIndex(int index) {
        this.index = index;
    }


}

布局

<com.mypackager.ui.VerticalScrollTextView
          android:id="@+id/scoll_textView"
          android:layout_width="500dp"
          android:layout_height="500dp"
          android:text="@string/company_intrduce_text"
          android:visibility="gone"
          ></com.mypackager.VerticalScrollTextView>

Activity代码

List lst=new ArrayList<Sentence>();
            for(int i=0;i<8;i++){
                if(i%2==0){
                    Sentence sen=new Sentence(i,i+1+"NanJINGXIXI");
                    lst.add(i, sen);
                }else{
                    Sentence sen=new Sentence(i,i+1+"Hello world!");
                    lst.add(i, sen);
                }
            }   

            play_textView.setList(lst);

            play_textView.updateUI();   
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值