先上两张图,后面补上代码

我们以前的写法是在需要显示模糊引导的地方,写一个布局,然后第一次使用的时候显示出来。但是这样做代码结构不清晰,所以我们有必要将这些View独立出来,写成一个自定义的View

public class ShowMemberTipsView extends BaseTipsView {

    @Bind(R.id.btn_sure)
    Button btnSure;
    @Bind(R.id.img_close)
    ImageView imgClose;

    private static final String UNIQUE_KEY = ShowMemberTipsView.class.getSimpleName();
    private Context mContext;

    public ShowMemberTipsView(Context context) {
        super(context);
        this.mContext = context;
        init();
    }

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

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

    @Override
    public String getUniquekey() {
        return UNIQUE_KEY;
    }

    private void init() {
        initLayoutParams();
        addStatusBarView();
        addContentView();
    }

    private void initLayoutParams() {
        LayoutParams lp = new LayoutParams(
                LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
        setOrientation(VERTICAL);
        setLayoutParams(lp);
    }

    private void addContentView() {
        View view = inflate(mContext, R.layout.view_show_member_tips, null);
        ButterKnife.bind(this,view);
        addView(view);
    }

    @OnClick(R.id.btn_sure)
    public void sure() {
        if (mOnSureListener != null) {
            mOnSureListener.onSure(ShowMemberTipsView.this);
        }
    }

    @OnClick(R.id.img_close)
    public void close() {
        if (mOnCloseListener != null) {
            mOnCloseListener.onClose(ShowMemberTipsView.this);
        }
    }
}

引用的布局:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#E6000000">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="@dimen/topbar_layout_width"
            android:layout_marginTop="120dp"
            android:orientation="horizontal">

            <RelativeLayout
                android:layout_width="0.0dip"
                android:layout_height="fill_parent"
                android:layout_gravity="center_vertical"
                android:layout_weight="1.0">

                <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_centerInParent="true"
                    android:src="@drawable/icon_more_mask_btn" />
            </RelativeLayout>

            <View
                android:layout_width="1.0px"
                android:layout_height="fill_parent"
                android:layout_marginBottom="10.0dip"
                android:layout_marginTop="10.0dip" />

            <View
                android:id="@+id/rl_task_center"
                android:layout_width="0.0dip"
                android:layout_height="fill_parent"
                android:layout_weight="1.0" />
        </LinearLayout>

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_marginTop="20dp"
            android:src="@drawable/icon_more_mask_text" />

        <Button
            android:id="@+id/btn_sure"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_marginTop="20dp"
            android:background="@drawable/icon_more_mask_level_btn" />

        <View
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"/>
    </LinearLayout>

    <ImageView
        android:id="@+id/img_close"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="right"
        android:layout_marginRight="20dp"
        android:layout_marginTop="20dp"
        android:padding="5dp"
        android:src="@drawable/icon_app_upgrade_close" />
</FrameLayout>

最后是一个BaseView,主要是封装一些公共的方法

public abstract class BaseTipsView extends LinearLayout {
    private static final String TAG = BaseTipsView.class.getSimpleName();
    private String mUniqueKey;
    protected OnCloseListener mOnCloseListener;
    protected OnSureListener mOnSureListener;

    public BaseTipsView(Context context) {
        super(context);
        init();
    }

    public BaseTipsView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public BaseTipsView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    private void init() {
        mUniqueKey = getUniquekey();
        if (TextUtils.isEmpty(mUniqueKey)) {
            throw new IllegalArgumentException("Uniquekey must not empty!");
        }
        maskClick();
    }

    //获取状态
    protected void addStatusBarView() {
        View statusBarView = new View(getContext());
        statusBarView.setBackgroundColor(getContext().getResources().getColor(R.color.line_color));
        int statusBarHeight = getStatusBarHeight();
        LayoutParams lp = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, statusBarHeight);
        statusBarView.setLayoutParams(lp);
        addView(statusBarView);
    }

    public abstract String getUniquekey();

    private void maskClick() {
        this.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // 因此View背景透明,防止点击到此View后面的控件
            }
        });
    }

    public void show(final Activity activity) {
        if (!isMoreTipsShowed()) {
            addViewToDector(activity);
            setMoreTipsShowed(true);
        }
    }

    public void dismiss(final Activity activity) {
        removeViewFromDector(activity);
    }

    /**
     * 添加View到dectorView
     * @param activity
     */
    private void addViewToDector(final Activity activity) {
        ViewGroup dectorView = (ViewGroup) activity.getWindow().getDecorView();
        dectorView.addView(this);
    }

    /**
     * 从dectorView移出View
     * @param activity
     */
    private void removeViewFromDector(final Activity activity) {
        ViewGroup dectorView = (ViewGroup) activity.getWindow().getDecorView();
        dectorView.removeView(this);
    }

    public void setOnCloseListener(OnCloseListener onCloseListener) {
        this.mOnCloseListener = onCloseListener;
    }

    public void setOnSureListener(OnSureListener onSureListener) {
        this.mOnSureListener = onSureListener;
    }

    public interface OnCloseListener {
        public void onClose(BaseTipsView baseTipsView);
    }

    public interface OnSureListener {
        public void onSure(BaseTipsView baseTipsView);
    }

    protected boolean isMoreTipsShowed() {
        SharedPreferences sp = getContext().getSharedPreferences(TAG, Context.MODE_PRIVATE);
        return sp.getBoolean(mUniqueKey, false);
    }

    protected void setMoreTipsShowed(boolean isShowed) {
        SharedPreferences sp = getContext().getSharedPreferences(TAG, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sp.edit();
        editor.putBoolean(mUniqueKey, isShowed);
        editor.commit();
    }

    public int getStatusBarHeight() {
        int result = 0;
        int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
        if (resourceId > 0) {
            result = getResources().getDimensionPixelSize(resourceId);
        }
        return result;
    }

}

最后附上源码下载地址:http://download.csdn.net/detail/xiangzhihong8/9549873

anndroid 模糊引导界面的更多相关文章

  1. App 引导界面

    App 引导界面 1.前言 最近在学习实现App的引导界面,本篇文章对设计流程及需要注意的地方做一个浅显的总结. 附上项目链接,供和我水平类似的初学者参考——http://files.cnblogs. ...

  2. android——利用SharedPreference做引导界面

    很久以前就接触过sharedPreference这个android中的存储介质.但是一直没有实际使用过,今天在看之前做的“民用机型大全”的app时,突然想到可以使用sharedPreference类来 ...

  3. 【Android UI设计与开发】第05期:引导界面(五)实现应用程序只启动一次引导界面

    [Android UI设计与开发]第05期:引导界面(五)实现应用程序只启动一次引导界面 jingqing 发表于 2013-7-11 14:42:02 浏览(229501) 这篇文章算是对整个引导界 ...

  4. Android UI开发第四十一篇——墨迹天气3.0引导界面及动画实现

    周末升级了墨迹天气,看着引导界面做的不错,模仿一下,可能与原作者的代码实现不一样,但是实现的效果还是差不多的.先分享一篇以前的文章,android动画的基础知识,<Android UI开发第十二 ...

  5. 【Android UI设计与开发】3.引导界面(三)实现应用程序只启动一次引导界面

    大部分的引导界面基本上都是千篇一律的,只要熟练掌握了一个,基本上也就没什么好说的了,要想实现应用程序只启动一次引导界面这样的效果,只要使用SharedPreferences类,就会让程序变的非常简单, ...

  6. 【Android】首次进入应用时加载引导界面

    参考文章: [1]http://blog.csdn.net/wsscy2004/article/details/7611529 [2]http://www.androidlearner.net/and ...

  7. SharedPreference 存储小量数据,一般首次启动显示引导界面就用这个。

    写://添加一个SharedPreference并传入数据SharedPreference sharedPreferences = getSharedPreferences("share_d ...

  8. 转-ViewPager组件(仿微信引导界面)

    http://www.cnblogs.com/lichenwei/p/3970053.html 这2天事情比较多,都没时间更新博客,趁周末,继续继续~ 今天来讲个比较新潮的组件——ViewPager ...

  9. 【笔记】WPF实现ViewPager引导界面效果及问题汇总

    最近在开发项目的首次使用引导界面时,遇到了问题,引导界面类似于安卓手机ViewPager那样的效果,希望通过左右滑动手指来实现切换不同页面,其间伴随动画. 实现思路: 1.界面布局:新建一个UserC ...

随机推荐

  1. 剑指Offer——“你最大的缺点是什么”回答技巧及范例

    剑指Offer--"你最大的缺点是什么"回答技巧及范例   问题分析:认识自己的缺点是一个巨大的优点, 当HR问到你缺点的时候, 你的机会来了, 请快展示你的自知之明吧!你想把优点 ...

  2. 微信开发之使用java获取签名signature(贴源码,附工程)

    一.前言 微信接口调用验证最终需要用到的三个参数noncestr.timestamp.signature: 接下来将会给出获取这三个参数的详细代码 本文的环境eclipse + maven 本文使用到 ...

  3. FFmpeg源代码简单分析:av_write_frame()

    ===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...

  4. shell-----sed命令详解

    Table of Contents 1. Sed简介  2. 定址  3. Sed命令  4. 选项  5. 元字符集  6. 实例  7. 脚本 1. Sed简介 sed是一种在线编辑器,它一次处理 ...

  5. XCode5添加新建类模板(Cocos2dx Template Class for Scene or Layer)

    猴子原创,欢迎转载.转载请注明: 转载自Cocos2D开发网–Cocos2Dev.com,谢谢! 原文地址: http://www.cocos2dev.com/?p=505 因为常用cocos2dx开 ...

  6. 5. React 组件的协同使用 组件嵌套和Mixin

            组件是React的核心,构建大型项目时多个组件之间需要进行协同使用.可以从横向和纵向两个角度来实现组件的协同使用,纵向的协同使用就是组件嵌套,横向的协同使用就是Mixin(抽取公共方法 ...

  7. android最新更新方法

    使用SDK Manager更新时出现问题Failed to fetch URL https://dl-ssl.google.com/android/repository/repository-6.xm ...

  8. 最简单的基于FFmpeg的编码器-纯净版(不包含libavformat)

    ===================================================== 最简单的基于FFmpeg的视频编码器文章列表: 最简单的基于FFMPEG的视频编码器(YUV ...

  9. 修改GDAL库支持IRSP6数据

    使用GDAL库发现不能打开IRSP6的数据,不过看GDAL提供的文件格式里面却是支持IRSP6的数据的,具体可以参考网页http://www.gdal.org/frmt_fast.html.下面图1是 ...

  10. Cocos2D iOS之旅:如何写一个敲地鼠游戏(四):创建TexturePacker自动脚本

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...