Hello,大家好,好久不见啦。博主最近忙着实习的事儿,博文的更新有些耽搁啦,大家久等了吧。闲话少叙,直接进入我们今天的主题。
最近,在北京的某家公司做实习生,正处于看代码的阶段,马上过年啦,估计年前没有什么任务啦,所以把自己收集的一些特效整理出来。一起来看看吧。
今天,给大家带来的是字幕滚动效果:它主要实现的就是文字的自动滚动效果(比如:快过年了,每年CCTV1的春节联欢晚会屏幕下方会滚动一些消息,如:什么海外侨胞发来贺电等等之类的)。具体我们来看看怎么实现吧。
一:自定义View
扩展自TextView,实现Runnable接口,重写三个构造方法,及onDraw方法,滚动线程的开启与停止。具体如下:
package com.example.marquee;import android.content.Context;import android.graphics.Canvas;import android.graphics.Paint;import android.util.AttributeSet;import android.util.Log;import android.widget.TextView;/** * 重写TextView,实现文字的滚动效果 * */public class Marquee extends TextView implements Runnable { /** 当前位置坐标 */ private int currentScrollX; /** 停止标志 */ private boolean isStop = false; /** 文本长度 */ private int textWidth; /** 可测量标志 */ private boolean isMeasure = false; /** 三个构造函数 */ public Marquee(Context context) { super(context); } public Marquee(Context context, AttributeSet attrs) { super(context, attrs); } public Marquee(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub super.onDraw(canvas); // 查看可测量标志 // 若不可测量的话,我们就获得文本信息得宽度,改变状态标志为可测量 if (!isMeasure) { getTextWidth(); isMeasure = true; } } /** 测量文本的宽度 */ private void getTextWidth() { Paint paint = this.getPaint(); String str = this.getText().toString(); textWidth = (int) paint.measureText(str); } @Override public void run() { currentScrollX -= 1; scrollTo(currentScrollX, 0);// 偏移至(currentScrollX, 0) if (isStop) { return; } Log.e("", "run------------this.getwidth:" + this.getWidth());// ---244 Log.e("", "run------------textWidth:" + textWidth);// ---0 Log.e("", "currentScrollX:" + currentScrollX); Log.e("", "getScrollX:" + getScrollX()); if (getScrollX() <= -(this.getWidth())) {// -255<-244 scrollTo(textWidth, 0);// 移动到(0,0)位置 currentScrollX = textWidth;// 改变当前位置=0 } postDelayed(this, 80);// 第二个参数控制滚动速度,数值越大滚动越慢 } /** 开始滚动 */ public void startScroll() { currentScrollX = 0;// 起始坐标X=0 isStop = false;// 停止标志=false,标示开始滚动 this.removeCallbacks(this); post(this);// 开始滚动 } /** 停止滚动 */ public void stopScroll() { isStop = true;// 停止 }} |
二:主配置文件
添2个按钮,控制滚动的开始与停止(实际使用的时候,可能不需要控制,是显示界面的时候直接滚动);添加自定义的控件Marquee。
三:主程序入口
(1)初始化View,找ID;
(2)初始化要显示的数据(这里为具体的滚动屏幕显示的文字);
(3)设置按钮监听;
(4)实际的具体操作。
package com.example.marquee;import java.text.SimpleDateFormat;import java.util.Date;import android.app.Activity;import android.os.Bundle;import android.text.TextUtils;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class MainActivity extends Activity implements OnClickListener { /**自定义控件*/ private Marquee marquee; /**按钮*/ private Button start, stop; /**显示文本*/ String str; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initview(); initdata(); setListener(); } /** * 初始化要显示的数据 * */ public void initdata() { SimpleDateFormat formatter = new SimpleDateFormat( "yyyy年MM月dd日 HH:mm:ss"); Date curDate = new Date(System.currentTimeMillis());// 获取当前时间 str = formatter.format(curDate); } /**初始化VIew--找ID等*/ public void initview() { start = (Button) findViewById(R.id.start); stop = (Button) findViewById(R.id.stop); marquee = (Marquee) findViewById(R.id.myscrollview); } /** 统一添加监听 */ public void setListener() { addlistener(start); addlistener(stop); } /** 添加监听 */ public void addlistener(View view) { view.setOnClickListener(this); } @Override public void onClick(View v) { int id = v.getId(); switch (id) { case R.id.start: start(); break; case R.id.stop: stop(); break; } } /** 开始滚动 */ private void start() { String time = str; // String time = "黑夜给了我黑色的眼睛,而我却用它来寻找光明...";//同样可以滚动 if (!TextUtils.isEmpty(time)) { // 先设置编译时间 marquee.setText(time); // 文本长度大于20个字符才开始移动 if (time.length() > 20) // 开始滚动 marquee.startScroll(); } else {// 否则的话显示为空 marquee.setText("未知"); } } /** 停止滚动 */ public void stop() { marquee.stopScroll(); }} |
四:实现效果
由于是动态的滚动效果,不是很好捕捉,那博主将源码奉上,供大家私下里去看看效果,这里仅仅是捕捉几个具有代表性的图片展示给大家而已。
屏幕滚动效果到此就完成啦。源码在附件中哦。。
最近在同一首歌曲《终于等到你--张靓颖》,其中有一句歌词:渐渐开始尝到孤单的味道,时间在敲打着你的骄傲。是啊,我们的骄傲逐渐被磨平,承认孤单,做最好的自己。