您的位置:首页 > 移动开发 > Android开发

Android一种字幕效果的实现

2016-05-23 19:10 357 查看
参考链接
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" />
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息