用DecorView实现应用引导

sxet3256 7年前
   <p>WindowManager和Window都可以获取根View,只是获取的root view不同,前者是整个OS中唯一的一个窗口管理的windows,作为引导的话有点问题的,并不适合做引导,那么看到了window里面也可以获取根view--它是ViewGroup,可以尝试在当前activity中获取DecorView往里面添加view的方式实现。使用方式:遮罩图片若干就像下面数组似的,在要引导的activity的布局中的root节点添加id=“root_container”,当然你可以根据需要改</p>    <pre>  <code class="language-java"><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"></code></pre>    <p>首先写以供DecorView的管理类:</p>    <pre>  <code class="language-java">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));              }          }        }  }</code></pre>    <p>组装view数组</p>    <pre>  <code class="language-java">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);  }</code></pre>    <p>写四个布局:</p>    <pre>  <code class="language-java"><?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></code></pre>    <pre>  <code class="language-java"><?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>  .......................</code></pre>    <p>然后调用</p>    <pre>  <code class="language-java">private void showGuide() {      DecorViewGuideHelper helper = new DecorViewGuideHelper(getActivity(),guid);      helper.display();  }</code></pre>    <p>效果如图:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/3b0142a118b2119dbab80dfccc8fedaa.png"><img src="https://simg.open-open.com/show/e87426371e0aa2dbfd7c31f3a1830157.png"></p>    <p style="text-align:center">应用宝截屏2016121302.png</p>    <p> </p>    <p>来自:http://www.jianshu.com/p/bee20268aff1</p>    <p> </p>