用DecorView實現應用引導

sxet3256 7年前發布 | 7K 次閱讀 安卓開發 Android開發 移動開發

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

 

 本文由用戶 sxet3256 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!