牛X素材推荐之BannerTime

转载请注明出处王亟亟的大牛之路

平时我们会遇到各种各样的小广告推送形式今天上一个实现比较典型的自定义View,不过很值得称道的是作者对封装和代码解耦的理解。

效果图:

一个延迟弹出自定义对话框并实现其逻辑的一个自定义控件。

项目结构:

代码相当轻量级,用起来也很方便。

MainActivity:

public class MainActivity extends AppCompatActivity {

    private Context mContext = this;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);

    }

    @Override
    protected void onResume() {
        super.onResume();
        BannerTime.init(this)
                .shownTime(5000)
                .hiddenTime(3000)
                .imageBanner("http://campbellriver.whatsondigest.com/sites/default/files/event_photographs/Try%20it%20.png", false)
                .withOKButton(R.color.def, "Default", android.R.color.white)
                .withKOButton(R.color._ok_bg, "Custom", android.R.color.white)
                .background(R.color.fav)
                .imageBannerPlaceholder(0)
                .show(new BannerTime.BannerTimeListener() {
                    @Override
                    public void onShow() {
                    }

                    @Override
                    public void onDismiss() {

                    }

                    @Override
                    public void onClickOk() {
                        DefActivity.launch(mContext);
                    }

                    @Override
                    public void onClickKO() {
                        CustomActivity.launch(mContext);
                    }

                    @Override
                    public void onClickImage() {
                        Toast.makeText(mContext, "onClickImage", Toast.LENGTH_SHORT).show();

                    }
                });    }

    @Override
    protected void onPause() {

        super.onPause();
        BannerTime.onPause();

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity_def in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

流程分析:

 public static BannerTime init(Context context) {

        if (sInstance == null) {
            sInstance = new BannerTime(context);
        }
        mContext = context;
        init();

        return sInstance;
    }

↑首先先初始化一个BannerTime的对象如果为空就new 一个实例,应用程序整个生命周期过程中只有这么一个实例。

    private static void init() {

        dialog = null;
        contentView = null;
        requestCreator = null;
        mGravity = BannerTime.BOTTOM;
        mView = LayoutInflater.from(mContext)
                .inflate(R.layout.layout_banner, null, false);
        mPlaceHolder = R.drawable.loading;
        okVisibility = View.GONE;
        koVisibility = View.GONE;

        SHOW_TIME_BANNER = 10000;
        HIDE_TIME_BANNER = 2 * 60000;

        timerShow = new Timer();
        timerHide = new Timer();
    }

↑之后再初始化一些内部变量并对计时器进行声明等操作。

    public static BannerTime shownTime(int time) {

        SHOW_TIME_BANNER = time;
        return sInstance;

    }

↑设置显示时间

public static BannerTime hiddenTime(int time) {

        HIDE_TIME_BANNER = time;
        return sInstance;

    }

↑设置消失时间

public static BannerTime imageBanner(String path, boolean crop) {

        requestCreator = Picasso.with(mContext).load(path);
        if (crop)
            requestCreator.fit().centerCrop();
        else
            requestCreator.fit().centerInside();
        return sInstance;
    }

↑异步加载图片(第三方库)

   public static BannerTime withOKButton(int bgResource, String text, int textColor) {

        Button ok = (Button) mView.findViewById(R.id.btnOk);
        okVisibility = View.VISIBLE;
        ok.setText(text);
        ok.setTextColor(mContext.getResources().getColor(textColor));
        ok.setBackgroundResource(bgResource);
        return sInstance;
    }

↑对按钮进行设置

    public static BannerTime background(int resourceId) {

        mView.findViewById(R.id.parent).setBackgroundResource(resourceId);
        return sInstance;
    }

设置整个Dialog的背景

 public static BannerTime imageBannerPlaceholder(int resId) {

        mPlaceHolder = resId;
        return sInstance;
    }

↑设置图片标识

    public static void show(BannerTimeListener listener) {

        if (sInstance == null)
            throw new RuntimeException("It´ necessary call '.init()' method");

        mListener = listener;

        ImageView img = (ImageView) mView.findViewById(R.id.imageAd);
        if (requestCreator != null) {
            if (mPlaceHolder != 0) {
                requestCreator.placeholder(mPlaceHolder)
                        .into(img);
            } else {
                requestCreator.into(img);
            }
        } else {
            Picasso.with(mContext)
                    .load(mPlaceHolder)
                    .placeholder(mPlaceHolder)
                    .fit().centerCrop()
                    .into(img);
        }

        createDialog();
    }

↑根据传来的图片标识,进行不同的处理

   private static void createDialog() {

        if (mGravity == BannerTime.BOTTOM) {
            dialog = new Dialog(mContext, R.style.DialogSlideAnimBottom);
        } else if (mGravity == BannerTime.TOP) {
            dialog = new Dialog(mContext, R.style.DialogSlideAnimTop);
        } else if (mGravity == BannerTime.LEFT) {
            dialog = new Dialog(mContext, R.style.DialogSlideAnimLeft);
        } else if (mGravity == BannerTime.RIGHT) {
            dialog = new Dialog(mContext, R.style.DialogSlideAnimRight);
        } else {
            dialog = new Dialog(mContext, R.style.DialogSlideAnimBottom);
        }
        dialog.getWindow().setGravity(mGravity);
        dialog.setCanceledOnTouchOutside(false);

        if (contentView != null) {
            if (contentView.getParent() == null)
                dialog.setContentView(contentView);
        } else {
            if (mView.getParent() == null)
                dialog.setContentView(mView);
        }

        ImageView img = (ImageView) mView.findViewById(R.id.imageAd);
        img.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mListener != null)
                    mListener.onClickImage();

            }
        });

        mView.findViewById(R.id.btnOk).setVisibility(okVisibility);
        mView.findViewById(R.id.btnOk).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (dialog.isShowing()) {
                    dialog.dismiss();
                    if (mListener != null)
                        mListener.onClickOk();
                }
            }
        });

        mView.findViewById(R.id.btnKO).setVisibility(koVisibility);
        mView.findViewById(R.id.btnKO).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (dialog.isShowing()) {
                    dialog.dismiss();
                    if (mListener != null)
                        mListener.onClickKO();
                }
            }
        });

        scheduleHideBanner(dialog);

    }

↑具体画View的方法

    private static void scheduleHideBanner(final Dialog dialog) {

        dismissDialog(dialog);

        timerTaskHide = new TimerTask() {

            @Override
            public void run() {
                scheduleShowBanner(dialog);
            }
        };

        timerHide.schedule(timerTaskHide, HIDE_TIME_BANNER);
    }

↑异步隐藏Dialog

    public interface BannerTimeListener {
        void onShow();

        void onDismiss();

        void onClickOk();

        void onClickKO();

        void onClickImage();

    }

↑各个状态触发的事件

源码地址:点我下载!!!!!

时间: 2024-10-31 20:00:22

牛X素材推荐之BannerTime的相关文章

牛X素材推荐之TriangleRectangleLabelView

转载请注明出处:王亟亟的大牛之路 Git上看到一个比较给力的自定义展示标签的View,分享给大家TriangleRectangleLabelView.然后根据原作者的代码我会对其中运用的一些技术点加以解释,在此在此谢谢原作者的开源精神 先贴一下运行效果: 包结构 整体实现还是很轻量级的,只有一个实现的class和attrs来处理初始化. TriangleRectangleLabelView(作者已详细标注) public class TriangleRectangleLabelView exte

牛X素材推荐之StackOverView

转载请注明出处:王亟亟的大牛之路 给大家推荐一个高仿5.0任务管理器的自定义View,StackOverView! 实现效果: 是不是做的很像? Git地址:https://github.com/Bossyao168/StackOverView

牛X素材推荐之MaterialTextField

转载请注明出处:王亟亟的大牛之路 深度折叠简化的一个Edit,动画也比较轻盈,但是楼主不太好把控他的使用场景,因为 是一个EditText,效果倒是不错,分享给大家学习下还是OK的. 效果: 载入包: compile 'com.github.florent37:materialtextfield:1.0.1@aar' compile 'com.android.support:cardview-v7:22.2.1' compile 'com.nineoldandroids:library:2.4.

五分钟用手机拍证件照 四款超牛拍照软件推荐

拍摄证件照的要求很高,需要清晰的露出五官,背景要干净整洁,并只能采用纯色,光线明亮又不能刺眼,通常这类照片需要到专业的照相馆去拍摄,我们在家是无法完成的.证件照除了可用于一些证明身份的证件上,办理报名.入职,或投递简历也是需要的,如果此时恰好没有携带 电子版照片,而附近又没有合适的照相馆该怎么办呢?今天小编就教您如何用手机拍摄出完美的证件照,虽然不能和专业照相馆相比拟,但至少可以应急.在拍摄之前,咱们还要对环境进行一下布置,最好是一整面白色的墙壁,如果实在找不到,只要不是太杂乱也可以.一般家里都

WPS Office抢鲜版V8.0发布 素材库速度提升5倍

日前,金山办公软件正式发布了WPS Office抢鲜版V8.0,该版本新品秉承了WPS Office 2012灵巧轻快.便捷安装,深度兼容微软Office的特点,可以轻松在时尚界面与经典界面之间一键切换.另外,WPS Office 抢鲜版V8.0对在线素材库进行了改进,使素材库的速度较之前提升5倍,同时段落布局的使用也更加方便,还支持页面颜色的更换,颜色.纹理.图案想怎么来就怎么来,让用户的办公操作更加简单轻松. 网友可登陆WPS官网(http://www.wps.cn/product/beta

《我叫MT online》物抗卡牌推荐

物抗卡牌是指那些非常禁打,可以当做肉盾, 生命值非常高的卡牌,一般物抗卡牌的职业都是战士,最大生命值可达几万,但是攻击很小.下面给大家推荐几张物抗卡牌::哀木涕+3职业:战士星级:5领导力:28最大生命:49468最大攻击:5072出处:哀木涕进化入手难度:★ 前期推荐星级:★★ 后期推荐星级:★★★☆ PVP推荐星级:★★ PVE推荐星级:★★☆一句话推荐:无疑哀木涕进化到最大等级,是无敌一般的存在,起码在当前版本 血量是相当的可观.对于哀木涕这种纯坦克,伤害低到一定程度也是可以理解的.:桶牛

15款新鲜出炉的实用网页设计工具

  在信息爆炸的今天,设计师要通过网络寻找设计素材 和工具是一件简单的事情,相应的,要找到真正可靠且素质优秀的素材 ,也越发的不容易.在海量的网站中寻找一个符合需求的素材 ,花费在搜索和筛选上的时间也越来越长.这种情况使得今天这样的设计工具/素材推荐类的文章与合集显得更有意义,也弥足珍贵. 由于网页设计师和开发者之间的界限越来越模糊,两者所用的工具和素材的交叉重叠的情况也非常普遍.今天所推荐的这15项全新的工具/素材里,应该有很多都值得网页设计从业者们收入囊中.这当中涵盖了设计类应用.框架.分析

从《我是歌手》学习淘宝运营

原文地址:http://www.xinli001.com/info/4654/ 我们生活在互联网的圈子里,经常会认为自己做的事情很牛,其实相对传统行业,我们还太小.电商发展够快吧?但网络零售总额才占线下零售总额的5%左右.电商发展才10来年,而很多传统行业发展好几十年,甚至上百年,我们更应该向他们学习,本质都一样,只是环境不同.今天我跟大家谈谈如何从电视节目学习电商运营. 说到电视节目,除了CCAV,估计就是湖南卫视芒果台了.目前最火的节目也莫过于芒果台的<我是歌手>.如果你没看过一定要去看看

关于数据的笑话 30 则

1.[做数据分析的好处]记者:不怕你老公在外面乱来吗?媳妇:他是数据分析师:记者:你不在身边不怕他空虚寂寞么>媳妇:他要整数据.记者:那他 会不会花心变坏?媳妇:不会,他很忙,要每天要改分析报告.记者:你觉得这样好吗?媳妇:很好!玩数据就没钱玩女人!有点钱都换电脑去了. 2.[厕所才是精准定向投放广告的好地?]张栋:我发现我是个喜欢看广告的人,公司楼层的男厕所里经常是游戏,贷款公司还有 SPA 会所等广告.我好奇女厕所里贴什么广告.今天找了个女工程师帮我进去看了一下:广告是一样的!看来没做(性别