android 自定义文字跑马灯 支持拖拽,按住停止滚动,自定义速度

本文介绍了一种自定义的Android TextView控件——MarqueeTextView,该控件实现了特殊的跑马灯效果,支持用户通过触摸操作来控制文本的滚动状态,并可以调整文本的滚动速度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自:http://www.cnblogs.com/sun-yang-/p/3772569.html

android的textview自带跑马灯效果,一般使用足够了。不过也有不一般的情况,所以我实现了一个自定义textview控件,用来针对这种不一般情况下的跑马灯效果实现。

import android.content.Context;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.GestureDetector.OnGestureListener;
import android.view.View.OnTouchListener;
import android.widget.TextView;
 
/**
 * 自定义跑马灯文本框,支持拖拽查看文本内容,点击暂停文字 先设置要显示文本,然后调用Start()方法运行跑马灯
 *
 * @author sy
 */
public class MarqueeTextView extends TextView implements Runnable,
        OnTouchListener {
    public MarqueeTextView(Context context) {
        super(context);
    }
 
    /** 是否停止滚动 */
    private boolean mStopMarquee;
    private String mText;
    public int mCoordinateX;
    int xOffset;
    private int mTextWidth;
    GestureDetector gestureDetector;
 
    public MarqueeTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
 
    public MarqueeTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }
 
    /**
     * 开始滚动
     *
     * @param text
     */
    public void Start() {
        this.setOnTouchListener(this);
 
        gestureDetector = new GestureDetector(getContext(),
                new OnGestureListener() {
                    @Override
                    public boolean onSingleTapUp(MotionEvent e) {
                        // TODO Auto-generated method stub
                        return false;
                    }
 
                    @Override
                    public void onShowPress(MotionEvent e) {
                        // TODO Auto-generated method stub
 
                    }
 
                    @Override
                    public boolean onScroll(MotionEvent e1, MotionEvent e2,
                            float distanceX, float distanceY) {
                        mCoordinateX += (int) distanceX;
                        scrollTo(mCoordinateX, 0);
                        // TODO:设置偏移量,distanceX为滑动距离
                        return true;
                    }
 
                    @Override
                    public void onLongPress(MotionEvent e) {
                        // TODO Auto-generated method stub
 
                    }
 
                    @Override
                    public boolean onFling(MotionEvent e1, MotionEvent e2,
                            float velocityX, float velocityY) {
                        return false;
                    }
 
                    @Override
                    public boolean onDown(MotionEvent e) {
                        // TODO Auto-generated method stub
                        return false;
                    }
                });
 
        xOffset = 0;
        mStopMarquee = false;
        mText = this.getText().toString();// 获取文本框文本
        mCoordinateX = 0;
        mTextWidth = (int) Math.abs(getPaint().measureText(mText));
        post(this);
    }
 
    @Override
    public void run() {
 
        if (!mStopMarquee) {
            mCoordinateX += 3;// 滚动速度
            scrollTo(mCoordinateX, 0);
            if (mCoordinateX > mTextWidth) {
                scrollTo(0, 0);
                mCoordinateX = 0;
            }
            postDelayed(this, 50);
        }
 
    }
 
    // 继续滚动
    public void Continue() {
        if (mStopMarquee) {
            mStopMarquee = false;
            post(this);
        }
    }
 
    // 暂停滚动
    public void Paush() {
        mStopMarquee = true;
    }
 
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
        case MotionEvent.ACTION_MOVE:
        case MotionEvent.ACTION_SCROLL:
            Paush();
            break;
        default:
            Continue();
            break;
        }
 
        gestureDetector.onTouchEvent(event);
        return true;
    }
 
} 

首先调用setText设置文本内容,然后调用start()开始滚动。滚动速度为每50毫米移动3像素,这是我调试之后感觉比较平滑的一个速度
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值