Android特效(1)----字幕滾動效果

   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();
    }
}

   四:實現效果

   由於是動態的滾動效果,不是很好捕捉,那博主將源碼奉上,供大家私下裏去看看效果,這裏僅僅是捕捉幾個具有代表性的圖片展示給大家而已。

wKioL1LPhXaz7S4FAABm7LJWiBk211.png

   屏幕滾動效果到此就完成啦。源碼在附件中哦。。t_0003.gif



   最近在同一首歌曲《終於等到你--張靚穎》,其中有一句歌詞:漸漸開始嚐到孤單的味道,時間在敲打着你的驕傲。是啊,我們的驕傲逐漸被磨平,承認孤單,做最好的自己。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章