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


    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像素,这是我调试之后感觉比较平滑的一个速度。如果代码有什么错误或者可以改进的地方,希望你们能在评论中指出。谢谢!

  • 相关阅读:
    【Leetcode周赛】从contest-81开始。(一般是10个contest写一篇文章)
    【LeetCode】抽样 sampling(共4题)
    【LeetCode】拓扑排序 topological-sort(共5题)
    【LeetCode】几何学 geometry(共2题)
    【读书笔记】C/C++程序员面试秘籍
    【读书笔记】程序员面试笔记
    【sql】牛客网练习题 (共 61 题)
    HDU 6119 小小粉丝度度熊 双指针
    2017多校第7场 HDU 6128 Inverse of sum 推公式或者二次剩余
    2017多校第7场 HDU 6121 Build a tree K叉树,思维
  • 原文地址:https://www.cnblogs.com/sun-yang-/p/3772569.html
Copyright © 2020-2023  润新知