跑马灯效果实现方式三种
16lz
2021-01-23
跑马灯效果的实现
(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();}@Overridepublic void setText(CharSequence text, BufferType type) {super.setText(text, type);MeasureTextWidth(); }@Overridepublic 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 timesnextNews();}else{repeatCount ++;}}} postDelayed(this, 50); }private void nextNews(){repeatCount = 0;currentNews ++;currentNews = currentNews%mList.size();//cycle indexString 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绝对值得
更多相关文章
- Android实现蒙版弹出框效果
- android拍照上传的效果是如何实现的
- Android shape实现渐变、部分圆角及叠加效果
- Android开发窗口实现半透明效果
- 为什么 Android 中 Toolbar.setTitle() 没有效果
- iphone4抖动效果源码
- android抽屉效果的实现
- Android 实现局部图片滑动指引效果
- Android 手势滑动动画效果收集整理