自定义有焦点的TextView实现广告信息左右一直滚动的跑马灯效果

import android.content.Context;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.widget.TextView;

/**
 * 有焦点的TextView
 */
public class FocusedTextView extends TextView {

    //开发者通过代码创建对象时, 走此构造方法
    public FocusedTextView(Context context) {
        this(context, null);
        System.out.println("构造方法1");
        //initView();
    }

    //AttributeSet:属性集合
    //当控件配有属性时, 走此构造方法, 由系统底层创建对象
    public FocusedTextView(Context context, AttributeSet attrs) {
        this(context, attrs, -1);
        System.out.println("构造方法2");
        //initView();
    }

    //defStyleAttr: 样式
    //当控件配有样式时, 走此构造方法, 由系统底层创建对象
    public FocusedTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        System.out.println("构造方法3");
        initView();
    }

    //初始化当前控件
    private void initView() {
//        android:ellipsize="marquee"
//        android:focusable="true"
//        android:focusableInTouchMode="true"
//        android:singleLine="true"
        setEllipsize(TextUtils.TruncateAt.MARQUEE);//跑马灯效果
       //setFocusable(true);//有焦点
       //setFocusableInTouchMode(true);//有焦点
        setSingleLine();//只显示一行
    }

    //表示当前TextView是否有焦点
    //问题: 当同时多个TextView进行跑马灯效果时, 只有一个有焦点,可以跑起来
    //解决办法: 重写isFocused, 强制返回true
    @Override
    public boolean isFocused() {
        return true;//强制返回true, 表示永远有焦点
    }
}

package com.loaderman.textviewdemo;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.Html;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView tv = (TextView) findViewById(R.id.tv);
        String newMessageInfo = "<font color='red'><b>最新消息:</b></font>苹果8要发布了,小伙伴们你们心动了,心动不如行动哦!";
        tv.setText(Html.fromHtml(newMessageInfo));
    }
}

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.jcf.textviewdemo.MainActivity">
    <com.loaderman.textviewdemo.FocusedTextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:textSize="20sp"
        android:layout_height="wrap_content"/>
</LinearLayout>

效果图:

在开发中在布局中设置跑马灯效果.当有多个事,可能会市区焦点,但不到所要的效果,自定义可以解决开发中这类问题!

原文地址:https://www.cnblogs.com/loaderman/p/6478943.html