anndroid 模糊引导界面
先上两张图,后面补上代码
我们以前的写法是在需要显示模糊引导的地方,写一个布局,然后第一次使用的时候显示出来。但是这样做代码结构不清晰,所以我们有必要将这些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 模糊引导界面的更多相关文章
- App 引导界面
App 引导界面 1.前言 最近在学习实现App的引导界面,本篇文章对设计流程及需要注意的地方做一个浅显的总结. 附上项目链接,供和我水平类似的初学者参考——http://files.cnblogs. ...
- android——利用SharedPreference做引导界面
很久以前就接触过sharedPreference这个android中的存储介质.但是一直没有实际使用过,今天在看之前做的“民用机型大全”的app时,突然想到可以使用sharedPreference类来 ...
- 【Android UI设计与开发】第05期:引导界面(五)实现应用程序只启动一次引导界面
[Android UI设计与开发]第05期:引导界面(五)实现应用程序只启动一次引导界面 jingqing 发表于 2013-7-11 14:42:02 浏览(229501) 这篇文章算是对整个引导界 ...
- Android UI开发第四十一篇——墨迹天气3.0引导界面及动画实现
周末升级了墨迹天气,看着引导界面做的不错,模仿一下,可能与原作者的代码实现不一样,但是实现的效果还是差不多的.先分享一篇以前的文章,android动画的基础知识,<Android UI开发第十二 ...
- 【Android UI设计与开发】3.引导界面(三)实现应用程序只启动一次引导界面
大部分的引导界面基本上都是千篇一律的,只要熟练掌握了一个,基本上也就没什么好说的了,要想实现应用程序只启动一次引导界面这样的效果,只要使用SharedPreferences类,就会让程序变的非常简单, ...
- 【Android】首次进入应用时加载引导界面
参考文章: [1]http://blog.csdn.net/wsscy2004/article/details/7611529 [2]http://www.androidlearner.net/and ...
- SharedPreference 存储小量数据,一般首次启动显示引导界面就用这个。
写://添加一个SharedPreference并传入数据SharedPreference sharedPreferences = getSharedPreferences("share_d ...
- 转-ViewPager组件(仿微信引导界面)
http://www.cnblogs.com/lichenwei/p/3970053.html 这2天事情比较多,都没时间更新博客,趁周末,继续继续~ 今天来讲个比较新潮的组件——ViewPager ...
- 【笔记】WPF实现ViewPager引导界面效果及问题汇总
最近在开发项目的首次使用引导界面时,遇到了问题,引导界面类似于安卓手机ViewPager那样的效果,希望通过左右滑动手指来实现切换不同页面,其间伴随动画. 实现思路: 1.界面布局:新建一个UserC ...
随机推荐
- Android事件分发传递回传机制详解
转载本专栏每一篇博客请注明转载出处地址,尊重原创.此博客转载链接地址:点击打开链接 http://blog.csdn.net/qq_32059827/article/details/5257701 ...
- 关于JQuery中的ajax请求或者post请求的回调方法中的操作执行或者变量修改没反映的问题
前段时间做一个项目,而项目中所有的请求都要用jquery 中的ajax请求或者post请求,但是开始处理一些简单操作还好,但是自己写了一些验证就出现问题了,比如表单提交的时候,要验证帐号的唯一性,所以 ...
- 安卓开发:简单的登陆跳转_APK实现直接跳转到本CSDN博客
最近在开始接触Android APP开发,有了一点java基础之后,安卓代码确实看起来就没有那么难了,可以跟着书上把例程敲一遍,然后熟能生巧可以应用起来,现在写了一个简单的APP,实现的是Edit编辑 ...
- Java的多态及注意事项
什么是多态: 多态不但能够改善代码的组织结构和可读性,还能够创建可扩展的程序.在Java中,所有的方法都是通过动态绑定实现多态的.将一个方法调用同一个方法主体关联起来被称作绑定.动态绑定的含义是在运行 ...
- Spring Resource接口获取资源
1.1.1. Resource简介 在Spring内部实现机制,针对于资源文件(配置的xml文件)有一个统一的接口Resource. 1.1.1.1. 接口定义的方法 1.exists():判断资源文 ...
- (一二〇)CALayer的一些特性
1.每个View都自带一个CALayer,称为rootLayer,layer可以和实现与View一样的显示功能,但是它不继承UIResponse,也就是说它无法处理事件,所以为了处理事件还是要用Vie ...
- Android 推送和统计最优轮循(心跳策略)探究实践
http://blog.csdn.net/sk719887916/article/details/51398416 skay亲笔 Android开发中经常会用到周期性执行一个动作的需求,大的场景有推送 ...
- DVB数字电视系统简介(DVB-C,DVB-S,DVB-T)
前一段时间在<通信原理>期末的时候研究了一下DVB数字电视系统.视音频编解码这些技术都是属于"信源"的技术,而<通信原理>研究的范围正好是它的补集,属于&q ...
- Linux内核编译时会遇到的问题--缺少mkimage
由于各大平台所带的内核不同,所以编译方式也不同,但方法都是大同小异. 但是,编译内核有时候会提示缺少mkimage这个命令,如何解决? 供应商提供内核的同时也会提供其它的一些,比如Uboot,root ...
- 【一天一道LeetCode】#137. Single Number II
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...