正文  软件开发 > 编程综合 >

用DecorView实现应用引导

WindowManager和Window都可以获取根View,只是获取的root view不同,前者是整个OS中唯一的一个窗口管理的windows,作为引导的话有点问题的,并不适合做引导...

WindowManager和Window都可以获取根View,只是获取的root view不同,前者是整个OS中唯一的一个窗口管理的windows,作为引导的话有点问题的,并不适合做引导,那么看到了window里面也可以获取根view--它是ViewGroup,可以尝试在当前activity中获取DecorView往里面添加view的方式实现。使用方式:遮罩图片若干就像下面数组似的,在要引导的activity的布局中的root节点添加id=“root_container”,当然你可以根据需要改

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    
android:id="@+id/root_container"   
 android:layout_width="match_parent"    
android:layout_height="match_parent"    
android:orientation="vertical">

首先写以供DecorView的管理类:

public class DecorViewGuideHelper {
    private Activity activity;
    private View rootView;
    private List<View> coverIds;
    private int current = 0;
    private int length = 0;
    private int CONTINUE = 0x1234;
    public DecorViewGuideHelper(Activity activity, List<View> coverIds) {
        this.activity = activity;
        this.coverIds = coverIds;
        this.rootView = activity.getWindow().getDecorView().findViewById(R.id.root_container);
        SharePreferenceUtil.getInstance(activity).setGUIDId(4);
        this.length = coverIds.size();
    }

    @SuppressLint("HandlerLeak")
    Handler handler = new Handler(){

        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 0x1234:
                    current++;
                    display();
                    break;

                default:
                    break;
            }
        }

    };
    public void display() {
       final  ViewParent viewParent = rootView.getParent();
        if (viewParent instanceof FrameLayout) {
            if (length > 0 && current < length) {
                final FrameLayout container = (FrameLayout) viewParent;
                coverIds.get(current).setOnClickListener(new View.OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        container.removeView(coverIds.get(current));

                        handler.sendEmptyMessage(CONTINUE);
                    }
                });
                container.addView(coverIds.get(current));
            }
        }

    }
}

组装view数组

private void initGuid(LayoutInflater inflater){   
 guid=new ArrayList<>();   
 guid.add(inflater.inflate(R.layout.layout_guid1, null));    
View guid2=inflater.inflate(R.layout.layout_guid2, null);    
View lltop2=guid2.findViewById(lltop);    
ViewGroup.LayoutParams para2;   
 para2 =  lltop2.getLayoutParams();    
para2.width = ScreenUtils.getScreenWidth(getActivity());   
 para2.height = para2.width*10/22;   
 lltop2.setLayoutParams(para2);   
 guid.add(guid2);   
 View guid3=inflater.inflate(R.layout.layout_guid3, null);   
 View lltop3=guid3.findViewById(lltop);    
ViewGroup.LayoutParams para3;   
 para3 =  lltop3.getLayoutParams();    
para3.width = ScreenUtils.getScreenWidth(getActivity());    
para3.height = para3.width*6/22;    
lltop3.setLayoutParams(para3);    
guid.add(guid3);    
View guid4=inflater.inflate(R.layout.layout_guid4, null);    
View lltop4=guid4.findViewById(lltop);    
ViewGroup.LayoutParams para4;    
para4 =  lltop4.getLayoutParams();    
para4.width = ScreenUtils.getScreenWidth(getActivity());    
para4.height = para4.width*12/22;    
lltop4.setLayoutParams(para4);   
 guid.add(guid4);
}

写四个布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"   
 android:layout_height="match_parent"    
android:background="#88000000"    
android:orientation="vertical">    
<RelativeLayout       
 android:layout_width="match_parent"       
 android:layout_marginTop="30dp"    
    android:layout_height="match_parent">  
  <ImageView        
android:id="@+id/head"       
 android:layout_alignParentRight="true"       
 android:layout_width="52dp"        
android:layout_height="52dp"        
android:src="@mipmap/icon_circle_guild"/>        
<ImageView            
android:layout_below="@+id/head"          
android:layout_centerHorizontal="true"           
 android:layout_marginTop="10dp"          
  android:layout_marginRight="20dp"          
  android:layout_width="229dp"           
 android:layout_height="505dp"           
 android:src="@mipmap/pic_font1"            />    
</RelativeLayout>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"   
 android:layout_height="match_parent"   
 android:background="#88000000"    
android:orientation="vertical"    >   
 <View        
android:id="@+id/lltop"      
  android:layout_width="match_parent"        
android:layout_height="150dp"/>   
 <ImageView       
 android:layout_width="294dp"        
android:layout_height="391dp"       
 android:layout_gravity="center_horizontal"        
android:src="@mipmap/pic_font2"/>
</LinearLayout>
.......................

然后调用

private void showGuide() {   
 DecorViewGuideHelper helper = new DecorViewGuideHelper(getActivity(),guid);   
 helper.display();
}

效果如图:

应用宝截屏2016121302.png

来自:http://www.jianshu.com/p/bee20268aff1