Android跑马灯两种方式

第一中方式:TextView实现

 <TextView
        android:id="@+id/text_sign_message"
        android:layout_width="match_parent"
        android:layout_height="31dp"
        android:background="@color/sign_notice"
        android:ellipsize="marquee"
        android:focusable="true"
        android:focusableInTouchMode="true"
        android:gravity="center_vertical"
        android:marqueeRepeatLimit="marquee_forever"
        android:singleLine="true"
        android:text="签到奖励规则变更通知:连续第1、2、3、4、5、6、7....."
        android:textColor="@color/sign_notice_text"
        android:textSize="@dimen/normal_13"/>
android:focusable="true"
android:focusableInTouchMode="true"获取焦点,没有焦点跑马灯效果不能实现
<pre name="code" class="html">android:marqueeRepeatLimit="marquee_forever"无限循环

 第二种实现效果,自定义控件 

public class MarqueeTextView extends TextView{

    /**
     * 是否停止滚动
     */
    private boolean mStopMarquee;
    private String mText;//文本内容
    private float mTextWidth;//文本宽度
    private int speed = 1;//滚动速度
    private float mCoordinateX = 0;//当前滚动位置

    public MarqueeTextView(Context context) {
        super(context);
    }

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

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

    public int getSpeed() {
        return speed;
    }

    /**
     * 设置速度
     *
     * @return
     */
    public void setSpeed(int speed) {
        this.speed = speed;
    }

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


    @Override
    protected void onAttachedToWindow() {

        mStopMarquee = false;
        if (!isEmpty(mText))
            mHandler.sendEmptyMessageDelayed(0, 0);
        super.onAttachedToWindow();
    }

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

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

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

    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 0:

                    if (mCoordinateX < (-mTextWidth)) {//文字滚动完了,从滚动区域的右边出来
                        mCoordinateX = getWidth();
                        invalidate();
                        if (!mStopMarquee) {
                            sendEmptyMessageDelayed(0, 30);
                        }

                    } else {
                        mCoordinateX -= speed;
                        invalidate();
                        if (!mStopMarquee) {
                            sendEmptyMessageDelayed(0, 30);
                        }
                       
                    }
                    break;
            }
            super.handleMessage(msg);
        }
    };

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

    public int dp2px(int dp) {
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, this.getResources().getDisplayMetrics());
    }


}
使用

<MarqueeTextView
            android:id="@+id/text_sign_message"
            android:layout_width="match_parent"
            android:layout_height="31dp"
            android:background="@color/sign_notice"
            android:gravity="center_vertical"
            android:singleLine="true"
            android:textColor="@color/sign_notice_text"
            android:textSize="@dimen/normal_13"/>

mSignMessage_text = (MarqueeTextView) mSignIntehralHead.findViewById(R.id.text_sign_message);
mSignMessage_text.setText("签到奖励规则变更通知:连续第1、2、3、4、5、6、7天签到,分别送20、25、30、35、40、45、50积分,连续签到超过7天后,每天固定送50积分");



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值