京东快报效果

京东APP首页的垂直跑马灯实现公告播放效果,之前用过自定义View来实现,最近看到了ViewFlipper。。。突然萌发了想用他来实现该效果的想法。。。

官方文档~

Simple ViewAnimator that will animate between two or more views that have been added to it. Only one child is shown at a time. If requested, can automatically flip between each child at a regular interval.

继承关系

在这贴上了他的继承关系,大家可以看到他自带动画效果啦~

不说别的了,直接撸代码,详细说明大家看注释吧~(附两个GIF看效果,因为录制软件的问题,有重影,,,但是大家自己写完之后是不会出现问题的,同时我将时间间隔设置为了1秒,节约时间~~)

京东gif

我的gif

public class NoticeView extends ViewFlipper implements View.OnClickListener {
private Context mContext;
private ArrayList<Notice> mArrayList;
private OnNoticeClickListener mListener;

public NoticeView(Context context) {
    super(context);
}

public NoticeView(Context context, AttributeSet attrs) {
    super(context, attrs);
    this.mContext = context;
    init(mContext);
}

private void init(Context context) {
    mArrayList = new ArrayList<>();
    setFlipInterval(1000);//设置滚动间隔时间
    setPadding(SizeUtils.dp2px(context, 5f), SizeUtils.dp2px(context, 5f), SizeUtils.dp2px(context, 5f), SizeUtils.dp2px(context, 5f));
    setInAnimation(AnimationUtils.loadAnimation(context, R.anim.notice_in));
    setOutAnimation(AnimationUtils.loadAnimation(context, R.anim.notice_out));
}

public void addNotice(ArrayList<Notice> notices) {
    mArrayList = notices;
    removeAllViews();
    for (int i = 0; i < mArrayList.size(); i++) {
        Notice notice = notices.get(i);
        int titleLength = notice.getTitle().length();//取出来标题的文案的长度
        int contentLength = notice.getContent().length();//取出来内容的文案的长度
        String string = notice.getTitle() + " " + notice.getContent();
        int color = 0;
        if (TextUtils.isEmpty(notice.getTitleColor())) {
            color = Color.RED;
        } else {
            color = Color.parseColor(notice.getTitleColor());
        }
        SpannableString spannableString = SpannableStrings.setTextColor(string, color, 0, titleLength);
        TextView textView = new TextView(mContext);
        textView.setSingleLine(true);
        textView.setText(spannableString);
        textView.setTextSize(20f);//字体大小
        textView.setEllipsize(TextUtils.TruncateAt.END);
        textView.setGravity(Gravity.CENTER_VERTICAL);
        textView.setTag(i);
        textView.setOnClickListener(this);
        NoticeView.this.addView(textView, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
    }
}

@Override
public void onClick(View v) {
    int position = (int) v.getTag();
    Notice notice = mArrayList.get(position);
    if (mListener != null) {
        mListener.onNotieClick(position, notice);
    }
}

/**
 * 接口回调
 */
public interface OnNoticeClickListener {
    void onNotieClick(int position, Notice notice);
}

public void setListener(OnNoticeClickListener listener) {
    mListener = listener;
}

}

关于SpannableString的工具类(本文用到的);


/**
 * 设置部分文本的字体颜色
 *
 * @param text      文本
 * @param textColor 文本颜色
 * @param start     开始位置
 * @param end       结束位置(不包含)
 * @return SpannableString
 */

public static SpannableString setTextColor(String text, int textColor, int start, int end) {
    SpannableString spannableString = new SpannableString(text);
    spannableString.setSpan(new ForegroundColorSpan(textColor), start, end, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
    return spannableString;
}

/**
 * 设置部分文本的背景色和字体颜色
 *
 * @param text            文本
 * @param backgroundColor 背景色
 * @param textColor       文本色
 * @param backgroundArr   背景色设置文本位置
 * @param textColorArr    文本颜色位置
 * @return SpannableString
 */
 public static SpannableString setTextBackgroundAndTextColor(String text, int backgroundColor, int textColor, int[] backgroundArr, int[] textColorArr) {
    SpannableString spannableString = new SpannableString(text);
    spannableString.setSpan(new BackgroundColorSpan(backgroundColor), backgroundArr[0], backgroundArr[1], Spanned.SPAN_INCLUSIVE_INCLUSIVE);
    spannableString.setSpan(new ForegroundColorSpan(textColor), textColorArr[0], textColorArr[1], Spanned.SPAN_INCLUSIVE_INCLUSIVE);
    return spannableString;
}

Activity中就调用了一个方法而已~;


    private void init() {
    tv_jd = (TextView) findViewById(R.id.tv_jd);
    SpannableString spannableString = SpannableStrings.setTextBackgroundAndTextColor("京东快报:", Color.RED, Color.WHITE, new int[]{2, 4}, new int[]{2, 4});
    tv_jd.setText(spannableString);
    notice_view = (NoticeView) findViewById(R.id.notice_view);
    ArrayList<Notice> list = new ArrayList<>();
    Notice notice = new Notice("大促", "新年好货马上抢", "#ff0000", null, "www.baidu.com");
    Notice notice2 = new Notice("爆", "9.9元好东西啊~~~", "#0000ff", null, "www.google.com");
    Notice notice3 = new Notice("疯子", "疯子一样的抢购,来吧", "#00ff00", null, "www.qq.com");
    list.add(notice);
    list.add(notice2);
    list.add(notice3);
    notice_view.addNotice(list);
    notice_view.setListener(new NoticeView.OnNoticeClickListener() {
        @Override
        public void onNotieClick(int position, Notice notice) {
            T.showShort(NoticeViewActivity.this, "url = " + notice.getUrl());
        }
    });
    notice_view.startFlipping();
}

进入的动画效果:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<!--平移-->
<translate
    android:duration="@android:integer/config_mediumAnimTime"
    android:fromYDelta="50%p"
    android:toYDelta="0"/>
<!--渐变-->
<alpha
    android:duration="@android:integer/config_mediumAnimTime"
    android:fromAlpha="0.0"
    android:toAlpha="1.0"/>
</set>

出去的动画效果:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<!--平移-->
<translate
    android:duration="@android:integer/config_mediumAnimTime"
    android:fromYDelta="0"
    android:toYDelta="-50%p"/>
<!--渐变-->
<alpha
    android:duration="@android:integer/config_mediumAnimTime"
    android:fromAlpha="1.0"
    android:toAlpha="0.0"/>
</set>

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值