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。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_marginTop="20dip"
android:layout_height="wrap_content"
android:background="#00ff00"
android:gravity="center">
<com.example.marquee.Marquee
android:id="@+id/myscrollview"
android:layout_width="wrap_content"
android:background="#CCCCCC"
android:textSize="20dip"
android:singleLine="true"
android:gravity="left|center_vertical"
android:layout_height="50dip" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_margin="20dip"
android:gravity="center">
<Button
android:id="@+id/start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="30dip"
android:text="start" />
<Button
android:id="@+id/stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="stop" />
</LinearLayout>
</LinearLayout> |
三:主程序入口
(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();
}
}
|
四:实现效果
由于是动态的滚动效果,不是很好捕捉,那博主将源码奉上,供大家私下里去看看效果,这里仅仅是捕捉几个具有代表性的图片展示给大家而已。
![marquee.PNG wKioL1LPhXaz7S4FAABm7LJWiBk211.png](https://i-blog.csdnimg.cn/blog_migrate/80c9a1922e830ba30ad84bf5f4230441.png)
屏幕滚动效果到此就完成啦。源码在附件中哦。。![t_0003.gif](https://i-blog.csdnimg.cn/blog_migrate/07e993955449a36ecd77ffa28ba5db02.gif)
最近在同一首歌曲《终于等到你--张靓颖》,其中有一句歌词:渐渐开始尝到孤单的味道,时间在敲打着你的骄傲。是啊,我们的骄傲逐渐被磨平,承认孤单,做最好的自己。
转载于:https://blog.51cto.com/cinderella7/1350356