Android-两种方式实现走马灯效果

第一种方法(很普遍,很简单的在xml布局文件中设置TextView的属性):

<TextView 
        android:id="@+id/tv_text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ellipsize="marquee"
        android:focusable="true"
        android:focusableInTouchMode="true"
        android:marqueeRepeatLimit="marquee_forever"
        android:singleLine="true"
        android:textSize="28sp"
        android:text="路漫漫其修远兮,吾将上下而求索"
        android:textColor="#00ff00"
        android:scrollHorizontally="true"/>

重要代码:

           //设置为跑马灯显示

           android:ellipsize="marquee"

           //获取焦点
          android:focusable="true"

          //可以通过toucth来获得focus
          android:focusableInTouchMode="true"

          //设置重复的次数
          android:marqueeRepeatLimit="marquee_forever"

          //单行显示文字
        android:singleLine="true"

2.第二种方法,由于大部分走马灯文字会在手机屏幕的右侧开始,这需要自定义控件来实现了

   java代码:

package com.example.cameratestdemo;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.os.Handler;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.TextView;

/**
 * 自定义控件循环走马灯的实现
 * 
 * @author cyf 继承自TextView
 */
public class Util extends TextView implements Runnable {
    private static final String TAG = "MarqueeTextView";
    // 设置跑马灯重复的次数,次数
    private int circleTimes = 3;
    //记录已经重复了多少遍
    private int hasCircled = 0;
    private int currentScrollPos = 0;
    // 跑马灯走一遍需要的时间(秒数)
    private int circleSpeed = 10;
    // 文字的宽度
    private int textWidth = 0;

    private boolean isMeasured = false;
    // Handler机制
    private Handler handler;
    private boolean flag = false;

    // 构造方法
    public Util(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
        this.removeCallbacks(this);
        post(this);
    }
    /**
     * 画笔工具
     */
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        if (!isMeasured) {
            getTextWidth();
            isMeasured = true;
        }
    }

    @Override
    public void setVisibility(int visibility) {
        // 二次进入时初始化成员变量
        flag = false;
        isMeasured = false;
        this.hasCircled = 0;
        super.setVisibility(visibility);
    }

    @Override
    public void run() {
        // 起始滚动位置
        currentScrollPos += 1;
        scrollTo(currentScrollPos, 0);
        // Log.i(TAG, "pos"+currentScrollPos);
        // 判断滚动一次
        if (currentScrollPos >= textWidth) {
            // 从屏幕右侧开始出现
            currentScrollPos = -this.getWidth();
            //记录的滚动次数大设定的次数代表滚动完成,这个控件就可以隐藏了
            if (hasCircled >= this.circleTimes) {
                this.setVisibility(View.GONE);
                flag = true;
            }
            hasCircled += 1;
        }

        if (!flag) {
            // 滚动时间间隔
            postDelayed(this, circleSpeed);
        }
    }

    /**
     * 获取文本显示长度
     */

    private void getTextWidth() {
        Paint paint = this.getPaint();
        String str = this.getText().toString();
        Log.i(TAG, str);
        if (str == null) {
            textWidth = 0;
        }
        textWidth = (int) paint.measureText(str);
    }

    /**
     * 设置滚动次数,达到次数后设置不可见
     * 
     * @param circleTimes
     */
    public void setCircleTimes(int circleTimes) {
        this.circleTimes = circleTimes;
    }

    public void setSpeed(int speed) {
        this.circleSpeed = speed;
    }

    public void startScrollShow() {
        if (this.getVisibility() == View.GONE)
            this.setVisibility(View.VISIBLE);
        this.removeCallbacks(this);
        post(this);
    }

    private void stopScroll() {
        handler.removeCallbacks(this);
    }
}

布局文件中呀使用自定义控件了:

<com.example.cameratestdemo.Util
        android:id="@+id/tv_text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ellipsize="marquee"
        android:focusable="true"
        android:focusableInTouchMode="true"
        android:marqueeRepeatLimit="marquee_forever"
        android:scrollHorizontally="true"
        android:singleLine="true"
        android:text="路漫漫其修远兮,吾将上下而求索"
        android:textColor="#00ff00"
        android:textSize="28sp" >
    </com.example.cameratestdemo.Util>

源码下载:

http://yunpan.cn/c3kL7ILLL7tCt  访问密码 bd75

欢迎提出意见,希望可以给大家带来帮助,谢谢

posted @ 2015-12-10 16:57  奋斗者—cyf  阅读(21126)  评论(1编辑  收藏