Android 多行跑马灯 解决焦点抢占

这一篇 是上一篇的升级版 ,可以实现多行跑马灯效果,
主要解决了在焦点抢占导致的事件冲突问题
MainActivity

package com.android.marquee;

import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }
    public void alertDialog(View view){
        AlertDialog.Builder alertDialog=new AlertDialog.Builder(this);
        alertDialog.setTitle("弹框一");
        alertDialog.setMessage("弹框二");
        alertDialog.show();
    }
}

自定义控件MarqueeView,解决焦点抢占导致的事件冲突问题

package com.android.marquee;

import android.content.Context;
import android.graphics.Rect;
import android.text.TextUtils;
import android.util.AttributeSet;

/**
 * date:2018/11/12
 * author:李壮(HUAWEI)
 * function:自定义控件
 */
public class MarqueeView extends android.support.v7.widget.AppCompatTextView {
    public MarqueeView(Context context) {
        this(context,null);
    }

    public MarqueeView(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }

    public MarqueeView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        //设置单行
        setSingleLine();
        //设置Ellipsize
        setEllipsize(TextUtils.TruncateAt.MARQUEE);
        //获取焦点
        setFocusable(true);
        //走马灯的重复次数,-1代表无限重复
        setMarqueeRepeatLimit(-1);
        //强制获得焦点
        setFocusableInTouchMode(true);
    }
    /*
     *这个属性这个View得到焦点,在这里我们设置为true,这个View就永远是有焦点的
     */
    @Override
    public boolean isFocused() {
        return true;
    }

    /*
     * 用于EditText抢注焦点的问题
     * */
    @Override
    protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
        if (focused) {
            super.onFocusChanged(focused, direction, previouslyFocusedRect);
        }
    }

    /*
     * Window与Window间焦点发生改变时的回调
     * */
    @Override
    public void onWindowFocusChanged(boolean hasWindowFocus) {
        if (hasWindowFocus)
            super.onWindowFocusChanged(hasWindowFocus);
    }
}

布局文件

<?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:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="alertDialog"
        android:text="点我弹出对话框"/>
    <com.android.marquee.MarqueeView
        android:id="@+id/mvOne"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:background="#ff00"
        android:ellipsize="marquee"
        android:focusable="true"
        android:focusableInTouchMode="true"
        android:marqueeRepeatLimit="marquee_forever"
        android:singleLine="true"
        android:text="一切事无法追求完美,唯有追求尽力而为。这样心无压力,出来的结果反而会更好。生命不是要超越别人,而是要超越自己。" />

    <com.android.marquee.MarqueeView
        android:id="@+id/mvTwo"
        android:layout_marginTop="20dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:background="#ff0"
        android:ellipsize="marquee"
        android:focusable="true"
        android:focusableInTouchMode="true"
        android:marqueeRepeatLimit="marquee_forever"
        android:singleLine="true"
        android:text="美丽的花虽然会凋谢,可是盛开的时刻值得欣赏。要在美好的时候创造出美好的东西,人生才会充满意义" />
    <EditText
        android:hint="请输入文本"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

这下我们就可以实现多行跑马灯效果的实现

猜你喜欢

转载自blog.csdn.net/LZ0419/article/details/83993707