L迁客

技术博客
随笔 - 1, 文章 - 12, 评论 - 1, 引用 - 0
数据加载中……

自定义TextView跑马灯效果,可控制启动,停止,和速度

自定义TextView跑马灯效果,可控制启动,停止,和速度

Android自带的跑马灯效果不太好控制,不能控制速度,不能即时停止和启动,而且还受焦点的影响蛋疼不已。由于项目需求需要用的可控制性高的跑马灯效果,所以自己写了一个自定义的TextView

---------------------------------------------------------------------------------------------------------------------

注意:在布局文件引用本view,paddingLeft,paddingRigh都必须为0dp,需要增加这两个属性的,大家可以自行修改代码。

    android:ellipsize="marquee" android:singleLine="true" 这两个属性也要加上

---------------------------------------------------------------------------------------------------------------------

public class MarqueeText extends  TextView  implements  Runnable {

        private int currentScrollX;// 当前滚动的位置

        private boolean isStop = false;

        private int textWidth;

        private boolean isMeasure = false;

 

        public MarqueeText(Context context) {

                super(context);

                // TODO Auto-generated constructor stub

        }

        public MarqueeText(Context context, AttributeSet attrs) {

                super(context, attrs);

        }

        public MarqueeText(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 -= 2;// 滚动速度

                scrollTo(currentScrollX, 0);

                if (isStop) {

                        return;

                }

                if (getScrollX() <= -(this.getWidth())) {

                        scrollTo(textWidth, 0);

                        currentScrollX = textWidth;

//return;

               }

                postDelayed(this, 5);

        }

        // 开始滚动

        public void startScroll() {

                isStop = false;

                this.removeCallbacks(this);

                post(this);

        }

        // 停止滚动

        public void stopScroll() {

                isStop = true;

        }

        // 从头开始滚动

        public void startFor0() {

            currentScrollX = 0;

            startScroll();

        }

}

---------------------------------------------------------------------------------------------------------------------

布局文件:

---------------------------------------------------------------------------------------------------------------------

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    android:orientation="vertical" >

    <Button

        android:id="@+id/start"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:onClick="start"

        android:text="走起" />

    <Button

        android:id="@+id/stop"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:onClick="stop"

        android:text="停止" />

    <Button

        android:id="@+id/startfor0"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:onClick="startFor0"

        android:text="从头开始" />

    <simtice.demo.marqueetext.MarqueeText

        android:id="@+id/test"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:background="#339320"

        android:ellipsize="marquee"

        android:singleLine="true"

        android:text="这才是真正的文字跑马灯效果"

        android:textColor="#000000"

        android:textSize="20dp" >

    </simtice.demo.marqueetext.MarqueeText>

 

</LinearLayout>

 

---------------------------------------------------------------------------------------------------------------------

MainActivity

---------------------------------------------------------------------------------------------------------------------

public class MainActivity extends Activity {

        private MarqueeText test;

        @Override

        public void onCreate(Bundle savedInstanceState) {

                super.onCreate(savedInstanceState);

                setContentView(R.layout.activity_main);

                test = (MarqueeText) this.findViewById(R.id.test);

        }

        public void start(View v) {

                test.startScroll();

        }

        public void stop(View v) {

                test.stopScroll();

        }

        public void startFor0(View v){

                test.startFor0();

        }

}

posted on 2013-02-24 16:44 L迁客 阅读(79) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航: