Android 自动轮播文字控件
1.在布局中使用:
<com.project.aladdinslamp.view.LooperTextView
android:id="@+id/tip_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginLeft="@dimen/dp_8"
android:gravity="center"
android:singleLine="true" />
2.控件代码:
public class LooperTextView extends FrameLayout {
private List<String> tipList;
private int curTipIndex = 0;
private long lastTimeMillis;
private static final int ANIM_DELAYED_MILLIONS = 3 * 1000;
/**
* 动画持续时长
*/
private static final int ANIM_DURATION = 1 * 1000;
private static final String DEFAULT_TEXT_COLOR = "#2F4F4F";
private static final int DEFAULT_TEXT_SIZE = 14;
private Drawable head_boy, head_girl;
private TextView tv_tip_out, tv_tip_in;
private static final String TIP_PREFIX = "";
private Animation anim_out, anim_in;
public LooperTextView(Context context) {
super(context);
initTipFrame();
initAnimation();
}
public LooperTextView(Context context, AttributeSet attrs) {
super(context, attrs);
initTipFrame();
initAnimation();
}
public LooperTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initTipFrame();
initAnimation();
}
private void initTipFrame() {
//head_boy = loadDrawable(R.mipmap.ic_new);
//head_girl = loadDrawable(R.mipmap.psw_new);
tv_tip_out = newTextView();
tv_tip_in = newTextView();
tv_tip_in.setEllipsize(TextUtils.TruncateAt.END);
tv_tip_out.setEllipsize(TextUtils.TruncateAt.END);
tv_tip_in.setMaxLines(1);
tv_tip_out.setMaxLines(1);
addView(tv_tip_in);
addView(tv_tip_out);
}
private TextView newTextView() {
TextView textView = new TextView(getContext());
LayoutParams lp = new LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, Gravity.CENTER_VERTICAL);
textView.setLayoutParams(lp);
textView.setCompoundDrawablePadding(10);
textView.setGravity(Gravity.CENTER_VERTICAL);
textView.setLines(2);
textView.setEllipsize(TextUtils.TruncateAt.END);
textView.setTextColor(Color.parseColor(DEFAULT_TEXT_COLOR));
textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, DEFAULT_TEXT_SIZE);
return textView;
}
/**
* 将资源图片转换为Drawable对象
*
* @param ResId
* @return
*/
private Drawable loadDrawable(int ResId) {
Drawable drawable = getResources().getDrawable(ResId);
drawable.setBounds(0, 0, drawable.getMinimumWidth() - 10, drawable.getMinimumHeight() - 10);
return drawable;
}
private void initAnimation() {
anim_out = newAnimation(0, -1);
anim_in = newAnimation(1, 0);
anim_in.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
updateTipAndPlayAnimationWithCheck();
}
});
}
private Animation newAnimation(float fromYValue, float toYValue) {
Animation anim = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 0,
Animation.RELATIVE_TO_SELF, fromYValue, Animation.RELATIVE_TO_SELF, toYValue);
anim.setDuration(ANIM_DURATION);
anim.setStartOffset(ANIM_DELAYED_MILLIONS);
anim.setInterpolator(new DecelerateInterpolator());
return anim;
}
private void updateTipAndPlayAnimationWithCheck() {
if (System.currentTimeMillis() - lastTimeMillis < 1000) {
return;
}
lastTimeMillis = System.currentTimeMillis();
updateTipAndPlayAnimation();
}
private void updateTipAndPlayAnimation() {
if (curTipIndex % 2 == 0) {
updateTip(tv_tip_out);
tv_tip_in.startAnimation(anim_out);
tv_tip_out.startAnimation(anim_in);
this.bringChildToFront(tv_tip_in);
} else {
updateTip(tv_tip_in);
tv_tip_out.startAnimation(anim_out);
tv_tip_in.startAnimation(anim_in);
this.bringChildToFront(tv_tip_out);
}
}
private void updateTip(TextView tipView) {
if (new Random().nextBoolean()) {
tipView.setCompoundDrawables(head_boy, null, null, null);
} else {
tipView.setCompoundDrawables(head_girl, null, null, null);
}
String tip = getNextTip();
if (!TextUtils.isEmpty(tip)) {
tipView.setText(tip + TIP_PREFIX);
}
}
/**
* 获取下一条消息
*
* @return
*/
private String getNextTip() {
if (isListEmpty(tipList)) return null;
return tipList.get(curTipIndex++ % tipList.size());
}
public static boolean isListEmpty(List list) {
return list == null || list.isEmpty();
}
public void setTipList(List<String> tipList) {
this.tipList = tipList;
curTipIndex = 0;
updateTip(tv_tip_out);
updateTipAndPlayAnimation();
}
}
3.JAVA的使用:
private void setLottery(List<HomePageBeans.AwartBean> lottery) {
//模拟抽奖数据
List<String> strs = new ArrayList<>();
for (int i = 0; i < lottery.size(); i++) {
HomePageBeans.AwartBean awartBean = lottery.get(i);
String str = "恭喜:" + awartBean.getMobile() + "抽中" + awartBean.getBonus_money() + "元红包";
strs.add(str);
}
tipView.setTipList(strs);
}