• 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

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

  • 相关阅读:
    Hdu 5595 GTW likes math
    HNOI2002 营业额统计(Splay Tree)
    hdu 5592 BestCoder Round #65(树状数组)
    hdu 5591 BestCoder Round #65(博弈)
    hdu5586 BestCoder Round #64 (div.2)
    NoSQL
    什么是关系型数据库
    关系型数据库与NOSQL
    关系型数据库
    centos6.x下安装eclipse
  • 原文地址:https://www.cnblogs.com/yunfang/p/5036586.html
Copyright © 2020-2023  润新知