Android开发:TextView真正可控、不需要焦点的水平滚动--这才是真正的跑马灯

网上的TextView做跑马灯,大多都是要用到焦点,而且字数要超出滚动区域宽度才能实现滚动,使用起来十分不方便。

这里实现一种真正可控的滚动

(1)不需要焦点

(2)任意字数

(3)滚动从滚动区域右边出来,在左边消失,再从右边出来。

上代码

1、布局文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${relativePackage}.${activityClass}" >

   <Button
       android:id="@+id/btn1"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="改变滚动内容1"/>
      <Button
       android:id="@+id/btn2"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_toRightOf="@id/btn1"
       android:text="改变滚动内容2"/>
       <Button
       android:id="@+id/btn3"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_toRightOf="@id/btn2"
       android:text="退出程序"/>
        <com.using.margindemo.MarqueeTextView
        android:id="@+id/tvScroll"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="40dp" >
    </com.using.margindemo.MarqueeTextView>
</RelativeLayout>

2、滚动控件

package com.using.margindemo;

import android.content.Context;
import android.graphics.Canvas;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.widget.TextView;

public class MarqueeTextView extends TextView {

    /** 是否停止滚动 */
    private boolean mStopMarquee;
    private String mText;//文本内容
    private float mCoordinateX = 1280;//当前滚动位置
    private float mTextWidth;//文本宽度
    private int mScrollWidth = 1280;//滚动区域宽度
    private int speed = 1;//滚动速度
    public float getCurrentPosition() {
        return mCoordinateX;
    }

    public void setCurrentPosition(float mCoordinateX) {
        this.mCoordinateX = mCoordinateX;
    }

    public int getScrollWidth() {
        return mScrollWidth;
    }

    public void setScrollWidth(int mScrollWidth) {
        this.mScrollWidth = mScrollWidth;
    }

    public int getSpeed() {
        return speed;
    }

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

    public MarqueeTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public void setText(String text) {
        this.mText = text;
        mTextWidth = getPaint().measureText(mText);
        //mTextWidth = 1280;
        if (mHandler.hasMessages(0))
            mHandler.removeMessages(0);
        mHandler.sendEmptyMessageDelayed(0, 10);
    }

    @Override
    protected void onAttachedToWindow() {
        mStopMarquee = false;
        if (!isEmpty(mText))
            mHandler.sendEmptyMessageDelayed(0, 2000);
        super.onAttachedToWindow();
    }

    public static boolean isEmpty(String str) {
        return str == null || str.length() == 0;
    }

    @Override
    protected void onDetachedFromWindow() {
        mStopMarquee = true;
        if (mHandler.hasMessages(0))
            mHandler.removeMessages(0);
        super.onDetachedFromWindow();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (!isEmpty(mText))
            canvas.drawText(mText, mCoordinateX, 150, getPaint());
    }

    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case 0:
                if (mCoordinateX < (-mTextWidth)) {//文字滚动完了,从滚动区域的右边出来
                    mCoordinateX = mScrollWidth;
                    invalidate();
                    if (!mStopMarquee) {
                    sendEmptyMessageDelayed(0, 500);
                    }
                } else {
                    mCoordinateX -= speed;
                    invalidate();
                    if (!mStopMarquee) {
                        sendEmptyMessageDelayed(0, 30);
                    }
                }

                break;
            }
            super.handleMessage(msg);
        }
    };

}

3、

package com.using.margindemo;

import android.app.ActionBar;
import android.app.Activity;
import android.content.res.Configuration;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.MarginLayoutParams;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.RelativeLayout;

public class MainActivity extends Activity {
    private ImageView image;
    private MarqueeTextView marqueeTextView;
    private Button button1;
    private Button button2;
    private Button button3;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);//隐藏标题栏
        setContentView(R.layout.activity_main);        

        marqueeTextView = (MarqueeTextView)findViewById(R.id.tvScroll);        

        MarginLayoutParams margin1 = new MarginLayoutParams(
                marqueeTextView.getLayoutParams());
        margin1.setMargins(100, 200, 0, 0);//设置滚动区域位置:在左边距400像素,顶边距10像素的位置
        RelativeLayout.LayoutParams layoutParams1 = new RelativeLayout.LayoutParams(margin1);
        layoutParams1.height = 240;//设滚动区域高度
        layoutParams1.width = 1000; //设置滚动区域宽度
        marqueeTextView.setLayoutParams(layoutParams1);
        marqueeTextView.setScrollWidth(1000);
        marqueeTextView.setCurrentPosition(100 + 1000);//设置滚动信息从滚动区域的右边出来
        marqueeTextView.setSpeed(2);
        marqueeTextView.setText("这才是真正的跑马灯效果!");
        button1 = (Button)findViewById(R.id.btn1);
        button2 = (Button)findViewById(R.id.btn2);
        button3 = (Button)findViewById(R.id.btn3);
        button1.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                marqueeTextView.setText("这才是真正的跑马灯效果!");
            }
        });

         button2.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                marqueeTextView.setText("温馨提示:挂号或缴费后,请到休息区等候,我们会尽快为您服务,请留意屏幕叫号信息,谢谢!");

            }
        });
         button3.setOnClickListener(new OnClickListener() {
             @Override
             public void onClick(View v) {
                 finish();
             }
         });
    }
}

Demo下载

时间: 2024-12-22 12:46:31

Android开发:TextView真正可控、不需要焦点的水平滚动--这才是真正的跑马灯的相关文章

Android开发--TextView的应用

1.概述 TextView主要用于Activity中文本的应用.其中layout中xml文件(activity)设置文本的宽度,高度,ID:values中strings.xml设置文本内容. TextView一般做说明或结合Button使用. 2.步骤 A:layout中的操作 1.将TextView拖入到layout中xml创建的界面,实现文本的初步创建 2.设置xml中TextView代码 代码解释: id: 注:在一个界面中往往存在诸多文本,因此ID唯一. widthandheight:

【转】Android开发笔记(序)写在前面的目录

原文:http://blog.csdn.net/aqi00/article/details/50012511 知识点分类 一方面写写自己走过的弯路掉进去的坑,避免以后再犯:另一方面希望通过分享自己的经验教训,与网友互相切磋,从而去芜存菁进一步提升自己的水平.因此博主就想,入门的东西咱就不写了,人不能老停留在入门上:其次是想拾缺补漏,写写虽然小众却又用得着的东西:另外就是想以实用为主,不求大而全,但求小而精:还有就是有的知识点是java的,只是Android开发也会经常遇上,所以蛮记下来.个人的经

【转】Android开发学习总结(一)——搭建最新版本的Android开发环境

最近由于工作中要负责开发一款Android的App,之前都是做JavaWeb的开发,Android开发虽然有所了解,但是一直没有搭建开发环境去学习,Android的更新速度比较快了,Android1.0是2008年发布的,截止到目前为止Android已经更新Android5.0.1,学习Android开发的第一步就是搭建Android的开发环境,博客园里面有不少人也写了关于如何搭建Android开发环境的文章,我也看了一下,但是感觉都比较旧了,对照着做不一定能够搭建成功,但是有些搭建步骤是还是可

Android开发学习总结(一)——搭建最新版本的Android开发环境【转】

最近由于工作中要负责开发一款Android的App,之前都是做JavaWeb的开发,Android开发虽然有所了解,但是一直没有搭建开发环境去学习,Android的更新速度比较快了,Android1.0是2008年发布的,截止到目前为止Android已经更新Android5.0.1,学习Android开发的第一步就是搭建Android的开发环境,博客园里面有不少人也写了关于如何搭建Android开发环境的文章,我也看了一下,但是感觉都比较旧了,对照着做不一定能够搭建成功,但是有些搭建步骤是还是可

Android TextView 跑马灯效果

文本跑马灯必须设置的几个文本属性: android:marqueeRepeatLimit="marquee_forever"     设置跑马灯的次数:永久            android:ellipsize="marquee" 跑马灯方式             android:focusable="true" 获取焦点            android:singleLine="true" 单行          

50个Android开发技巧(10 为TextView加入样式)

首先来看一个控件的例子: (原文地址:http://blog.csdn.net/vector_yi/article/details/24428085) 手机上类似这种场景你一定已经见过非常多次了,但有没有考虑过它是如何实现的? 或许你会觉得这是一个略微复杂的自己定义的View,但,没错,这实际上仅仅是一个原生的TextView而已. TextView是一个简单而奇妙的Widget,你能够利用它以不同风格不同格式来展现文字. 举两个简单的样例: 1.在TextView中加入一个超链接 事实上非常e

Android开发技巧三--格式化TextView文本

本例主要研究一下如何在TextView中显示网页链接和改变特定文字颜色 1.main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_heig

android开发中碰到的三个小问题

Android开发中注意到的几个问题 1.  关于actionbar 初始化配置actionbar,getactionbar经常为null,原因是因为在源码或者布局文件中设置了全屏显示的缘故,不设置全屏显示就不会有问题. 2.  关于textview Textview默认是没有焦点的,因此不可能有点击事件,也无法直接实现背景的selector.通过设置android:clickable = true;就可以了,这一点与Button有很大的不同 3.  关于sourcinsight中的php代码.

Android 开发最佳实践

从Futurice公司Android开发者中学到的经验. 遵循以下准则,避免重复发明轮子.若您对开发iOS或Windows Phone 有兴趣, 请看iOS Good Practices 和 Windows client Good Practices 这两篇文章.摘要 ??? 使用 Gradle 和它推荐的工程结构??? 把密码和敏感数据放在gradle.properties??? 不要自己写 HTTP 客户端,使用Volley或OkHttp库??? 使用Jackson库解析JSON数据???