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

我们以前的写法是在需要显示模糊引导的地方,写一个布局,然后第一次使用的时候显示出来。但是这样做代码结构不清晰,所以我们有必要将这些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. iOS学习笔记--触摸事件

    最近空闲时间在学习iOS相关知识,几周没有更新文章了,今天总结下这些天的学习内容,也整理下iOS的学习笔记,以便以后查阅翻看- iOS中的事件可以分为3大类型: 触摸事件 加速计事件 远程控制事件 响 ...

  2. Android新建工程步骤(AndroidStudio)

    1.在 Android Studio 中,创建新项目: 如果您未打开项目,请在 Welcome to Android Studio 窗口中,点击 Start a new Android Studio ...

  3. 一个maven项目打多个可执行Jar文件

    使用maven-jar-plugin插件可以将一个maven项目按照需求打出多个可执行的jar文件. pom关键配置如下所示: <plugin> <groupId>org.ap ...

  4. java中&和&&的区别 位运算

    1.1. 逻辑与的运算符功能 1.1.1. 测试&& public static void main(String[] args) { int x=5; if (x==6 && ...

  5. Android开发学习之路--NDK、JNI之初体验

    好久没有更新博客了,最近一直在看一个仿微信项目,然后看源码并自己实现下,相信经过这个项目可以让自己了解一个项目中的代码以及种种需要注意的事项.不知不觉中博客已经快要40w访问量,而且排名也即将突破30 ...

  6. mysqldump的几个主要选项探究

    0.前言 本文主要探讨 mysqldump 的几种主要工作方式,并且比较一下和 mk-parralel-dump的一些差异,为备份方式的选择提供更多的帮助. 1.mysqldump 首先来看下 mys ...

  7. Java-IO之BufferedInputStream(缓冲输入流)

    BufferedInputStream是缓冲输入流,继承于FilterInputStream,作用是为另一个输入流添加一些功能,本质上是通过一个内部缓冲数组实现的.例如,在新建某输入流对应的Buffe ...

  8. ListView控件使用

    //ListView标头的代码创建方法. ColumnHeader title=new ColumnHeader(); //声明标头,并创建对象. title.Text="标头1名称&quo ...

  9. Unity UGUI基础之Slider、Scrollbar

    Slider(滑动条):是一个主要用于形象的拖动以改变目标值的控件,他的最恰当应用是用来改变一个数值,最大值和最小值自定义,拖动滑块可在此之间改变,例如改变声音大小. Scrollbar(滚动条):是 ...

  10. 《java入门第一季》之UDP协议下的网络编程详解

    首先看一下UDP协议的图解: 可以看到,分为发送端和接收端程序. 直接上代码: 发送端程序: import java.io.IOException; import java.net.DatagramP ...