实现一个垂直跑马灯的效果(垂直公告)

来源:互联网 发布:液晶屏参数查询软件 编辑:程序博客网 时间:2024/06/05 23:06

实现一个简单的跑马灯的效果,类似于App里面的通知:恭喜XXX获得了什么什么的效果。
这里写图片描述

首先先导入两个工具类

import android.app.Activity;import android.content.Context;import android.util.DisplayMetrics;/** * dp、sp 转换为 px 的工具类 * * Created by sunfusheng on 16/5/31. */public class DisplayUtil {    // 将px值转换为dip或dp值,保证尺寸大小不变    public static int px2dip(Context context, float pxValue) {        final float scale = context.getResources().getDisplayMetrics().density;        return (int) (pxValue / scale + 0.5f);    }    // 将dip或dp值转换为px值,保证尺寸大小不变    public static int dip2px(Context context, float dipValue) {        final float scale = context.getResources().getDisplayMetrics().density;        return (int) (dipValue * scale + 0.5f);    }    // 将px值转换为sp值,保证文字大小不变    public static int px2sp(Context context, float pxValue) {        final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;        return (int) (pxValue / fontScale + 0.5f);    }    // 将sp值转换为px值,保证文字大小不变    public static int sp2px(Context context, float spValue) {        final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;        return (int) (spValue * fontScale + 0.5f);    }    // 屏幕宽度(像素)    public static int getWindowWidth(Activity context) {        DisplayMetrics metric = new DisplayMetrics();        context.getWindowManager().getDefaultDisplay().getMetrics(metric);        return metric.widthPixels;    }    // 屏幕高度(像素)    public static int getWindowHeight(Activity context) {        DisplayMetrics metric = new DisplayMetrics();        context.getWindowManager().getDefaultDisplay().getMetrics(metric);        return metric.heightPixels;    }}

还有

import android.content.Context;import android.content.res.TypedArray;import android.text.TextUtils;import android.util.AttributeSet;import android.view.Gravity;import android.view.View;import android.view.ViewTreeObserver;import android.view.animation.Animation;import android.view.animation.AnimationUtils;import android.widget.TextView;import android.widget.ViewFlipper;import java.util.ArrayList;import java.util.List;/** * Created by sunfusheng on 16/5/31. */public class MarqueeView extends ViewFlipper {    private Context mContext;    private List<? extends CharSequence> notices;    private boolean isSetAnimDuration = false;    private OnItemClickListener onItemClickListener;    private int interval = 2000;    private int animDuration = 500;    private int textSize = 14;    private int textColor = 0xffffffff;    private boolean singleLine = false;    private int gravity = Gravity.LEFT | Gravity.CENTER_VERTICAL;    private static final int TEXT_GRAVITY_LEFT = 0, TEXT_GRAVITY_CENTER = 1, TEXT_GRAVITY_RIGHT = 2;    public MarqueeView(Context context, AttributeSet attrs) {        super(context, attrs);        init(context, attrs, 0);    }    private void init(Context context, AttributeSet attrs, int defStyleAttr) {        this.mContext = context;        if (notices == null) {            notices = new ArrayList<>();        }        TypedArray typedArray = getContext().obtainStyledAttributes(attrs, R.styleable.MarqueeViewStyle, defStyleAttr, 0);        interval = typedArray.getInteger(R.styleable.MarqueeViewStyle_mvInterval, interval);        isSetAnimDuration = typedArray.hasValue(R.styleable.MarqueeViewStyle_mvAnimDuration);        singleLine = typedArray.getBoolean(R.styleable.MarqueeViewStyle_mvSingleLine, false);        animDuration = typedArray.getInteger(R.styleable.MarqueeViewStyle_mvAnimDuration, animDuration);        if (typedArray.hasValue(R.styleable.MarqueeViewStyle_mvTextSize)) {            textSize = (int) typedArray.getDimension(R.styleable.MarqueeViewStyle_mvTextSize, textSize);            textSize = DisplayUtil.px2sp(mContext, textSize);        }        textColor = typedArray.getColor(R.styleable.MarqueeViewStyle_mvTextColor, textColor);        int gravityType = typedArray.getInt(R.styleable.MarqueeViewStyle_mvGravity, TEXT_GRAVITY_LEFT);        switch (gravityType) {            case TEXT_GRAVITY_CENTER:                gravity = Gravity.CENTER;                break;            case TEXT_GRAVITY_RIGHT:                gravity = Gravity.RIGHT | Gravity.CENTER_VERTICAL;                break;        }        typedArray.recycle();        setFlipInterval(interval);    }    // 根据公告字符串启动轮播    public void startWithText(final String notice) {        if (TextUtils.isEmpty(notice)) return;        getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {            @Override            public void onGlobalLayout() {                getViewTreeObserver().removeGlobalOnLayoutListener(this);                startWithFixedWidth(notice, getWidth());            }        });    }    // 根据公告字符串列表启动轮播    public void startWithList(List<? extends CharSequence> notices) {        setNotices(notices);        start();    }    // 根据宽度和公告字符串启动轮播    private void startWithFixedWidth(String notice, int width) {        int noticeLength = notice.length();        int dpW = DisplayUtil.px2dip(mContext, width);        int limit = dpW / textSize;        if (dpW == 0) {            throw new RuntimeException("Please set MarqueeView width !");        }        List list = new ArrayList();        if (noticeLength <= limit) {            list.add(notice);        } else {            int size = noticeLength / limit + (noticeLength % limit != 0 ? 1 : 0);            for (int i = 0; i < size; i++) {                int startIndex = i * limit;                int endIndex = ((i + 1) * limit >= noticeLength ? noticeLength : (i + 1) * limit);                list.add(notice.substring(startIndex, endIndex));            }        }        notices.addAll(list);        start();    }    // 启动轮播    public boolean start() {        if (notices == null || notices.size() == 0) return false;        removeAllViews();        resetAnimation();        for (int i = 0; i < notices.size(); i++) {            final TextView textView = createTextView(notices.get(i), i);            final int finalI = i;            textView.setOnClickListener(new OnClickListener() {                @Override                public void onClick(View v) {                    if (onItemClickListener != null) {                        onItemClickListener.onItemClick(finalI, textView);                    }                }            });            addView(textView);        }        if (notices.size() > 1) {            startFlipping();        } else {            stopFlipping();        }        return true;    }    private void resetAnimation() {        clearAnimation();        Animation animIn = AnimationUtils.loadAnimation(mContext, R.anim.anim_marquee_in);        if (isSetAnimDuration) animIn.setDuration(animDuration);        setInAnimation(animIn);        Animation animOut = AnimationUtils.loadAnimation(mContext, R.anim.anim_marquee_out);        if (isSetAnimDuration) animOut.setDuration(animDuration);        setOutAnimation(animOut);    }    // 创建ViewFlipper下的TextView    private TextView createTextView(CharSequence text, int position) {        TextView tv = new TextView(mContext);        tv.setGravity(gravity);        tv.setText(text);        tv.setTextColor(textColor);        tv.setTextSize(textSize);        tv.setSingleLine(singleLine);        tv.setTag(position);        return tv;    }    public int getPosition() {        return (int) getCurrentView().getTag();    }    public List<? extends CharSequence> getNotices() {        return notices;    }    public void setNotices(List<? extends CharSequence> notices) {        this.notices = notices;    }    public void setOnItemClickListener(OnItemClickListener onItemClickListener) {        this.onItemClickListener = onItemClickListener;    }    public interface OnItemClickListener {        void onItemClick(int position, TextView textView);    }}

然后在布局文件里面

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    xmlns:app="http://schemas.android.com/apk/res-auto"    android:id="@+id/activity_main"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    tools:context="com.example.cangyigou.marqueeviewdemo.MainActivity">    <com.example.cangyigou.marqueeviewdemo.MarqueeView        android:id="@+id/marqueeView"        android:layout_width="match_parent"        android:layout_height="30dp"        app:mvAnimDuration="1000"        app:mvInterval="3000"        app:mvTextColor="#00f"        app:mvTextSize="14sp"        app:mvSingleLine="true"/></RelativeLayout>

最后是MainActivity里面的内容

import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.widget.TextView;import android.widget.Toast;import java.util.ArrayList;import java.util.List;public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        final MarqueeView marqueeView = (MarqueeView) findViewById(R.id.marqueeView);        final List<String> info = new ArrayList<>();        info.add("恭喜172*****824的代理6月13号成交6200元,已完成签收");        info.add("恭喜130*****060的代理6月13号成交35000元,已完成签收");        info.add("恭喜182*****244的代理6月13号成交19000元,已完成签收");        info.add("恭喜152*****496的代理6月13号成交800元,已完成签收");        info.add("恭喜180*****664的代理6月13号成交9900元,已完成签收");        info.add("恭喜131*****527的代理6月13号成交7600元,已完成签收");        marqueeView.startWithList(info);//        String notice = "心中有阳光,脚底有力量!心中有阳光,脚底有力量!心中有阳光,脚底有力量!";//        marqueeView.startWithText(notice);        marqueeView.setOnItemClickListener(new MarqueeView.OnItemClickListener() {            @Override            public void onItemClick(int position, TextView textView) {                Toast.makeText(getApplicationContext(), String.valueOf(marqueeView.getPosition()) + ". " + textView.getText(), Toast.LENGTH_SHORT).show();            }        });    }}

里面集合里添加的条目就是要展示的数据,我们也可以将网上的数据给解析展示出来
这里写图片描述

Demo下载地址:http://download.csdn.net/detail/lanrenxiaowen/9871497

阅读全文
1 0
原创粉丝点击