跑马灯效果实现方式三种

简介:

跑马灯效果的实现

        (1)Android自带的跑马灯效果

    <TextView
        android:id="@+id/tv_marquee_normal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ellipsize="marquee"
        android:focusable="true"
        android:focusableInTouchMode="true"
        android:marqueeRepeatLimit="marquee_forever"
        android:scrollHorizontally="true"
        android:singleLine="true"
        android:text="hahahahahahahahahahahahahahhahahahahahahahahahaha" />


        (2)通过自定义TextView来实现

public class MarqueeView1 extends TextView{
	private boolean isScroll;
	public MarqueeView1(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		createView();
	}
	
	public MarqueeView1(Context context, AttributeSet attrs) {
		super(context, attrs);
		createView();
	}

	
	public MarqueeView1(Context context) {
		super(context);
		createView();
	}

    private void createView() {  
        setEllipsize(TruncateAt.MARQUEE);  
        setMarqueeRepeatLimit(-1);  
        setFocusableInTouchMode(true);  
    }  
  
    @Override  
    protected void onFocusChanged(boolean focused, int direction,  
            Rect previouslyFocusedRect) {  
        if (focused) {  
            super.onFocusChanged(focused, direction, previouslyFocusedRect);  
        }  
    }  
  
    @Override  
    public void onWindowFocusChanged(boolean focused) {  
        if (focused) {  
            super.onWindowFocusChanged(focused);  
        }  
    }  
  
    @Override  
    public boolean isFocused() {  
        return isScroll;  
    }  
    
    public void Scroll(boolean b){
    		isScroll = b;
    		if (isScroll) {
    			super.onWindowFocusChanged(true); 
			}else {
				super.onWindowFocusChanged(false);
			}
    		
    }
    
    @Override
    protected void onDraw(Canvas canvas) {
           final int textWidth = getWidth() - getCompoundPaddingLeft() -
                   getCompoundPaddingRight();
           final float lineWidth = this.getLayout().getLineWidth(0);
           final float gap = textWidth / 3.0f;
          float mGhostStart = lineWidth - textWidth + gap;
          float  mMaxScroll = mGhostStart + textWidth;
         float  mGhostOffset = lineWidth + gap;
         float mFadeStop = lineWidth + textWidth / 6.0f;
         float  mMaxFadeScroll = mGhostStart + lineWidth + lineWidth;
    	Log.e("point_X",mMaxFadeScroll +"");
    	super.onDraw(canvas);
    }
}

      (3)也是通过自定义TextView实现,但是他添加了开始,暂停,滚动速度,以及开始滚动的停留时间

          还有就是正常滚模式,多条广告一条一条在同一个textView中挨个展示

ublic class BulletinView extends TextView implements Runnable{
	protected static final int STATUE_RUN = 0;
	private int currentScrollX;// 当前滚动的位置
	private boolean isStop = false; 
	private int textWidth; 
	private List<String> mList;
	private final int REPEAT = 1;
	private int repeatCount = 0;
	private int currentNews = 0;
	private int defaultSpeed = 1;
	private long defaulRemain = 2000;
	private Marquee mType = Marquee.NORMAL_CODE;
	private Handler mHandler = new Handler(){
		public void handleMessage(android.os.Message msg) {
			switch (msg.what) {
			case STATUE_RUN:
				post(BulletinView.this); 
				break;

			default:
				break;
			}
		};
	};
	public BulletinView(Context context) { 
		super(context); 
		init();
		// TODO Auto-generated constructor stub 
	} 
	public BulletinView(Context context, AttributeSet attrs) { 
		super(context, attrs); 
		init();
	} 
	public BulletinView(Context context, AttributeSet attrs, int defStyle) { 
		super(context, attrs, defStyle); 
		init();
	} 
	
	public void init(){
		setClickable(true);
		setSingleLine(true);
		setEllipsize(TruncateAt.MARQUEE);
		setGravity(Gravity.LEFT|Gravity.CENTER_VERTICAL);
	}
	
	public void setData(List<String> mList){
		if(mList == null || mList.size()==0){
			return;
		}
		this.mList = mList; 
		currentNews = 0;
		String n = mList.get(currentNews);
		setText(n);
		setTag(n);
		startScroll();
	}
	
	@Override
	public void setText(CharSequence text, BufferType type) {
		super.setText(text, type);
		MeasureTextWidth(); 
	}
	
	@Override
	public void onScreenStateChanged(int screenState) {
		super.onScreenStateChanged(screenState);
		if(screenState == SCREEN_STATE_ON){
			startScroll();
		}else{
			stopScroll();
		}
	}
	
	/** 
	 * 获取文字宽度 
	 */ 
	private void MeasureTextWidth() { 
		Paint paint = this.getPaint(); 
		String str = this.getText().toString(); 
		textWidth = (int) paint.measureText(str); 
	} 

	@Override 
	public void run() { 
	/*	if(textWidth < 1){
			//title null api error.
			if(mList != null && mList.size() > 0){
				nextNews();
			}else{
				return;
			}
		}*/
		currentScrollX += defaultSpeed;// 滚动速度 
		scrollTo(currentScrollX, 0); 
		if (isStop) { 
			return; 
		} 
			if (getScrollX() >= textWidth) { 
				currentScrollX = -getWidth(); 
				scrollTo(currentScrollX, 0); 
				if (mType == Marquee.NORMAL_CODE) {
					
				}else if (mType == Marquee.ADVERTISE_CODE) {
					if(repeatCount >= REPEAT){
						//reach max times
						nextNews();
					}else{
						repeatCount ++;
					}
				}
				
			} 
		postDelayed(this, 50); 
	}
	
	private void nextNews(){
		repeatCount = 0;
		currentNews ++;
		currentNews = currentNews%mList.size();//cycle index
		String n = mList.get(currentNews);
		currentScrollX = 0;
		setText(n);
		setTag(n);
	}

	// 开始滚动 
	public void startScroll() { 
		isStop = false; 
		this.removeCallbacks(this); 
		mHandler.sendEmptyMessageDelayed(STATUE_RUN, defaulRemain);
	} 
	// 停止滚动 
	public void stopScroll() { 
		isStop = true; 
	} 
	
	public void setModeStyle(Marquee type){
		mType = type;
		
	}
	public int getDefaultSpeed() {
		return defaultSpeed;
	}
	public void setDefaultSpeed(int defaultSpeed) {
		this.defaultSpeed = defaultSpeed;
	}
	public long getDefaulRemain() {
		return defaulRemain;
	}
	public void setDefaulRemain(long defaulRemain) {
		this.defaulRemain = defaulRemain;
	}

	final static int ADVERTISE_CODE = 0;
	final static int NORMAL_CODE = 0;
	enum Marquee{
		ADVERTISE_CODE,NORMAL_CODE
	}
}

        Demo: http://download.csdn.net/detail/u012808234/9110929


跑马灯的效果没有达到要求,最后只能在进行修改,最后实现了一个公告切换显示的公告栏,有需要的看看:

demo:http://download.csdn.net/detail/u012808234/9118323绝对值得

相关文章
|
JavaScript
如何用原生JS实现跑马灯效果
如何用原生JS实现跑马灯效果
138 0
如何用原生JS实现跑马灯效果
|
JavaScript 程序员 开发者
跑马灯效果制作-上|学习笔记
快速学习跑马灯效果制作-上
72 0
跑马灯效果制作-上|学习笔记
|
JavaScript 开发者
跑马灯效果制作-下|学习笔记
快速学习跑马灯效果制作-下
81 0
跑马灯效果制作-下|学习笔记
|
JavaScript 程序员
跑马灯效果制作-上
一、总结学习的指令及功能 二、案例:跑马灯效果
跑马灯效果制作-上
|
JavaScript
跑马灯效果制作-下
跑马灯效果制作-下
跑马灯效果制作-下
|
缓存 前端开发 API
Android打造万能自定义阴影控件
目录介绍 01.阴影效果有哪些实现方式 02.实现阴影效果Api 03.设置阴影需要注意哪些 04.常见Shape实现阴影效果 05.自定义阴影效果控件 06.如何使用该阴影控件 07.在recyclerView中使用注意点 01.
1342 0
|
XML Android开发 数据格式
Android5.0新特性之——按钮点击效果动画(涟漪效果)
Android5.0 Material Design设计的动画效果 RippleDrawable涟漪效果       涟漪效果是Android5.0以后的新特性。为了兼容性,建议新建drawable-v21文件夹来存放RippleDrawable,drawable文件夹下也要放相应的适配图片。
4401 0
|
Android开发 Java
Android 二次优化个人封装仿网易新闻可滑动标题栏
      小菜前段时间根据超多 star 的 FlycoTabLayout 自己修改封装了仿网易顶部滑动标题栏 TabSlideLayout 滑动内容可以是文字也可以是网络图标,并整理了两篇小博客: Android 优化个人封装仿网易新闻可滑动标题...
2785 0