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
- Android一种字幕效果的实现
- android开发体会一字幕效果实现
- Android实现卡拉OK字幕效果方法
- html5 css3实现字幕滚动的效果
- Html实现滚动字幕效果
- Qt实现滚动字幕效果
- 实现K歌字幕效果
- Android:实现一种浮动选择菜单的效果
- Android:实现一种浮动选择菜单的效果
- Android:实现一种浮动选择菜单的效果
- Android:实现一种浮动选择菜单的效果
- 基于Android小说阅读器滑动效果的一种实现
- Android:实现一种浮动选择菜单的效果
- 无意中实现的一种效果
- 一个js实现简单的字幕滚动效果
- 用ClippingNode实现文字AVG游戏的对话字幕效果
- TextView实现滚动字幕的效果【跑马灯】
- 犀利的background-clip:text,实现K歌字幕效果
- Android 6.0 关于WiFi的改变
- Faster RCNN proposal_layer.py
- C++中的STL中map用法详解
- java基础教程1:简介
- time和datetime时间戳---python
- Android一种字幕效果的实现
- java基础 第三章 数据类型和运算符
- java 基础 第四章流程控制与数组
- 学习GitHub(三): git分支的创建、合并和删除
- uva 221 Urban Elevations
- Java中接口对象作为参数传递
- AnnotationSessionFactoryBean配置
- java基础教程2:接口
- 动态规划——unique-paths-ii