Hello,你們好,很久不見啦。博主最近忙着實習的事兒,博文的更新有些耽擱啦,你們久等了吧。閒話少敘,直接進入咱們今天的主題。
java
最近,在北京的某家公司作實習生,正處於看代碼的階段,立刻過年啦,估計年前沒有什麼任務啦,因此把本身收集的一些特效整理出來。一塊兒來看看吧。
android
今天,給你們帶來的是字幕滾動效果:它主要實現的就是文字的自動滾動效果(好比:快過年了,每一年CCTV1的春節聯歡晚會屏幕下方會滾動一些消息,如:什麼海外僑胞發來賀電等等之類的)。具體咱們來看看怎麼實現吧。
canvas
一:自定義View
app
擴展自TextView,實現Runnable接口,重寫三個構造方法,及onDraw方法,滾動線程的開啓與中止。具體以下:ide
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。
post
<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> |
三:主程序入口
this
(1)初始化View,找ID;spa
(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(); } } |
四:實現效果
因爲是動態的滾動效果,不是很好捕捉,那博主將源碼奉上,供你們私下裏去看看效果,這裏僅僅是捕捉幾個具備表明性的圖片展現給你們而已。
最近在同一首歌曲《終於等到你--張靚穎》,其中有一句歌詞:漸漸開始嚐到孤單的味道,時間在敲打着你的驕傲。是啊,咱們的驕傲逐漸被磨平,認可孤單,作最好的本身。