跑马灯效果的实现

(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绝对值得

更多相关文章

  1. Android实现蒙版弹出框效果
  2. android拍照上传的效果是如何实现的
  3. Android shape实现渐变、部分圆角及叠加效果
  4. Android开发窗口实现半透明效果
  5. 为什么 Android 中 Toolbar.setTitle() 没有效果
  6. iphone4抖动效果源码
  7. android抽屉效果的实现
  8. Android 实现局部图片滑动指引效果
  9. Android 手势滑动动画效果收集整理

随机推荐

  1. 基于Android的小巫新闻客户端开发---显示
  2. (翻译)API-How Android(安卓)Draws Views
  3. M8或在明年用上Android(安卓)带Wifi与WAP
  4. Android(安卓)ColorMatrix 亮度矩阵 对比
  5. 以快板之名说Android(安卓)应用程序电源
  6. Android切近实战(十)
  7. 关于android滑屏菜单和tab菜单实现
  8. Android(安卓)OpenCV(三十三):霍夫圆检测
  9. Android:微信授权登录与微信分享全解析
  10. Android(安卓)Q分区存储权限变更及适配