滚动消息栏
来看看要做成的效果
实现文字滚动显示
首先把界面做出来,界面比较简单,一个image,一个textview就实现了。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#ffffff" android:gravity="center_vertical" android:padding="10dp" android:orientation="horizontal"> <ImageView android:layout_width="14dp" android:layout_height="14dp" android:src="@mipmap/ic_bulletin"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="6dp" android:text="暂无中奖公告,快来参加吧~" android:textColor="#999999" android:textSize="13sp" /> </LinearLayout>
重点来实现文字滚动,要实现文字滚动可以使用viewflipper,自定义控件来替换TextView.文字滚动用动画控制,直接上代码
public class TextViewFlipper extends ViewFlipper { /** 间隔播放时间 */ private static final long HANDLER_WHAT_SHOW_NEXT_INTERVAL = 5 * 1000; private static final int HANDLER_WHAT_SHOW_NEXT = 1001; private TextView tv1, tv2; private MyHandler myHandler; private List<CharSequence> texts; private int curShowPos; public TextViewFlipper(Context context) { this(context, null); } public TextViewFlipper(Context context, AttributeSet attrs) { super(context, attrs); init(context); } private void init(Context context) { myHandler = new MyHandler(this); tv1 = new TextView(context); tv1.setSingleLine(); tv1.setEllipsize(TextUtils.TruncateAt.END); tv1.setTextSize(TypedValue.COMPLEX_UNIT_SP, 13); tv1.setTextColor(0xFF999999); tv2 = new TextView(context); tv2.setSingleLine(); tv2.setEllipsize(TextUtils.TruncateAt.END); tv2.setTextSize(TypedValue.COMPLEX_UNIT_SP, 13); tv2.setTextColor(0xFF999999); TranslateAnimation inAnim = new TranslateAnimation(0, 0, 0, 0, Animation.RELATIVE_TO_SELF, 1, Animation.RELATIVE_TO_SELF, 0); inAnim.setDuration(300); inAnim.setInterpolator(new AccelerateInterpolator()); inAnim.setFillAfter(true); TranslateAnimation outAnim = new TranslateAnimation(0, 0, 0, 0, Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, -1); outAnim.setDuration(300); inAnim.setInterpolator(new AccelerateInterpolator()); outAnim.setFillAfter(true); setInAnimation(inAnim); setOutAnimation(outAnim); } public void start(List<CharSequence> texts) { if (null == texts || texts.isEmpty()) { stop(true); return ; } this.texts = texts; // 初始化 myHandler.removeMessages(HANDLER_WHAT_SHOW_NEXT); stopFlipping(); removeAllViews(); addView(tv1); addView(tv2); curShowPos = 0; tv1.setText(texts.get(0)); myHandler.sendEmptyMessageDelayed(HANDLER_WHAT_SHOW_NEXT, HANDLER_WHAT_SHOW_NEXT_INTERVAL); } private void showNextText() { int oldShowPos = curShowPos; if (curShowPos + 1 == texts.size()) { curShowPos = 0; } else { curShowPos ++; } CharSequence curShowText = texts.get(curShowPos); CharSequence oldShowText = texts.get(oldShowPos); if (curShowPos % 2 == 0) { tv1.setText(curShowText); tv2.setText(oldShowText); super.showNext(); } else { tv2.setText(curShowText); tv1.setText(oldShowText); super.showPrevious(); } myHandler.sendEmptyMessageDelayed(HANDLER_WHAT_SHOW_NEXT, HANDLER_WHAT_SHOW_NEXT_INTERVAL); } /** * 停止播放 */ public void stop() { stop(false); } /** * 停止播放 * @param isHideView 是否隐藏View */ public void stop(boolean isHideView) { myHandler.removeMessages(HANDLER_WHAT_SHOW_NEXT); if (isHideView) { setVisibility(GONE); } } /** * 获取当前显示位置 * @return */ public int getCurrentShowPosition() { return curShowPos; } private static class MyHandler extends Handler { private WeakReference<TextViewFlipper> wrf; public MyHandler(TextViewFlipper textViewFlipper) { this.wrf = new WeakReference<>(textViewFlipper); } @Override public void handleMessage(Message msg) { super.handleMessage(msg); TextViewFlipper curTextViewFlipper = wrf.get(); if (null == curTextViewFlipper) return ; switch (msg.what) { case HANDLER_WHAT_SHOW_NEXT: // 显示下一个 curTextViewFlipper.showNextText(); break; } } } }
取得数据,调用控件start传入数据,就可显示