Android一种字幕效果的实现

来源:互联网 发布:淘宝客服绩效考核方案 编辑:程序博客网 时间:2024/06/04 19:35

参考链接

http://www.cnblogs.com/vaiyanzi/archive/2011/12/06/2277791.html

近期想学一下自定义View就想实现下字幕效果,在网上找了下,然后优化了下效果。

效果图




关键代码:

CaptionsTextView就是自定义的字幕View,单单实现功能,里面有一些细节需要调节



public class CaptionsTextView extends TextView{    private int index=0;    private float middleY;    private float mX;    private Paint mPaint;    private Paint mPaint1,mPaint2,mPaint3,mPaint4;    private Paint[] paints=new Paint[5];    private List<Sentence> list;    Handler mHandler=new Handler(){        @Override        public void handleMessage(Message msg) {            super.handleMessage(msg);            invalidate();        }    };    public CaptionsTextView(Context context) {        super(context);        init();    }    public CaptionsTextView(Context context, AttributeSet attrs) {        super(context, attrs);        init();    }    public CaptionsTextView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        init();    }    private void init() {        setFocusable(true);        if(list==null){            list=new ArrayList<Sentence>();            Sentence sen=new Sentence(0,"暂时没有通知公告");            list.add(0, sen);        }        for (int i=0;i<5;i++){            Paint paint=new Paint();            paint.setAntiAlias(true);            paint.setTextSize(20+i*3);            paint.setColor(Color.BLACK);            //水平方向拉伸两倍            paint.setTextScaleX(1.5f);            //设置字体水平倾斜度,普通斜体字是-0.25,可见往右斜            paint.setTextSkewX((float) -0.25);            paint.setTypeface(Typeface.SERIF);            paint.setTextAlign(Paint.Align.CENTER);            paints[i]=paint;        }        /*        mPaint = new Paint();        mPaint.setAntiAlias(true);        mPaint.setTextSize(16);        mPaint.setColor(Color.BLACK);        mPaint.setTypeface(Typeface.SERIF);        mPaint1 = new Paint();        mPaint1.setAntiAlias(true);        mPaint1.setTextSize(17);        mPaint1.setColor(Color.BLACK);        mPaint1.setTypeface(Typeface.SERIF);        mPaint2 = new Paint();        mPaint2.setAntiAlias(true);        mPaint2.setTextSize(18);        mPaint2.setColor(Color.BLACK);        mPaint2.setTypeface(Typeface.SERIF);        mPaint3 = new Paint();        mPaint3.setAntiAlias(true);        mPaint3.setTextSize(19);        mPaint3.setColor(Color.BLACK);        mPaint3.setTypeface(Typeface.SERIF);        mPaint4 = new Paint();        mPaint4.setAntiAlias(true);        mPaint4.setTextSize(20);        mPaint4.setColor(Color.BLACK);        mPaint4.setTypeface(Typeface.SERIF);        */    }    @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        int size=list.size();        if (index==-1||index==size)            return;        float bottomY=middleY+2*40;        canvas.drawText(list.get(index).getName(),mX,bottomY,paints[4]);        float tempY=0;        /*for (int i=index+1;i<size;i++){            tempY=middleY+(i-index)*40;            canvas.drawText(list.get(i).getName(),mX,tempY,paints[i%5]);            if (i-index==2){                break;            }        }*/        for (int i=index-1;i>=0;i--){            tempY=bottomY-(index-i)*70;            canvas.drawText(list.get(i).getName(),mX,tempY,paints[4+i-index]);            if (index-i==4){                break;            }        }    }    @Override    protected void onSizeChanged(int w, int h, int oldw, int oldh) {        super.onSizeChanged(w, h, oldw, oldh);        mX=w*0.5f;        middleY=h*0.5f;    }    public void setList(List<Sentence> data){        this.list=data;    }    public void updateUI(){        new Thread(new UpdateThread()).start();    }    class UpdateThread implements Runnable{        long time = 1000; // 开始 的时间,不能为零,否则前面几句歌词没有显示出来        int i=0;        @Override        public void run() {            while (true){                if (index==list.size())                    return;                mHandler.sendEmptyMessage(1);                try {                    Thread.sleep(time);                    index++;                } catch (InterruptedException e) {                    e.printStackTrace();                }            }        }    }}

使用:

public class CaptionViewActivity extends Activity{    CaptionsTextView captionsTextView;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_captions_view);        captionsTextView = (CaptionsTextView) findViewById(R.id.captions_view);        List lst=new ArrayList<Sentence>();        for(int i=0;i<50;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传递数据        captionsTextView.setList(lst);        //更新View        captionsTextView.updateUI();    }}

布局:

<com.example.first.view.CaptionsTextView    android:id="@+id/captions_view"    android:layout_width="match_parent"    android:layout_height="match_parent" />



1 0
原创粉丝点击