我们之前做引导页的时候,是一个页面一个xml布局文件。
这些布局文件其实只有些许不同,只是加载的动画不同、TextView显示的文本不同,最后一页多了个按钮而已。
实际上,我们可以只用一个xml布局文件,然后在代码中实现各个页面的异化。
最终代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
| public static class WelcomeFragment extends Fragment {
private static final String ARG_SECTION_NUMBER = "section_number"; private static final int[] arrAnimation = {R.raw.done, R.raw.animated_graph, R.raw.trophy, R.raw.floating_cloud}; private static final int[] arrTitleText = {R.string.page1_title, R.string.page2_title, R.string.page3_title, R.string.page4_title}; private static final int[] arrContentText = {R.string.page1_content, R.string.page2_content, R.string.page3_content, R.string.page4_content}; protected boolean isCreate = false; private View rootView;
public WelcomeFragment() { }
public static WelcomeFragment newInstance(int sectionNumber) { WelcomeFragment fragment = new WelcomeFragment(); Bundle args = new Bundle(); args.putInt(ARG_SECTION_NUMBER, sectionNumber); fragment.setArguments(args); return fragment; }
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
LottieAnimationView animationViews = null; int iPage = getArguments().getInt(ARG_SECTION_NUMBER);
rootView = inflater.inflate(R.layout.fragment_welcome_page, container, false);
animationViews = rootView.findViewById(R.id.animation_view); animationViews.setAnimation(arrAnimation[iPage], LottieAnimationView.CacheStrategy.None); TextView titleTextView = rootView.findViewById(R.id.title_text); titleTextView.setText(arrTitleText[iPage]); TextView contentTextView = rootView.findViewById(R.id.content_text); contentTextView.setText(arrContentText[iPage]); LinearLayout linearLayout = rootView.findViewById(R.id.linearLayout); linearLayout.setBackgroundColor(PAGE_COLOR[iPage]);
Button button = rootView.findViewById(R.id.welcome_btn);
if (iPage == 0) { animationViews.setPadding(DensityUtil.dp2px(this.getContext(), 25), 0, 0, 0); animationViews.playAnimation(); }
if (iPage == 3) { titleTextView.setTextColor(0XFF000000); button.setVisibility(View.VISIBLE); } else { contentTextView.setTextColor(0XFFFFFFFF); }
isCreate = true; return rootView;
} .... }
|
其实没什么好说的,就是找出各个要异化的View,然后进行异化(根据页面设置动画、文本、背景颜色)。
xml中的按钮默认隐藏,当为第四页的时候才设置为显示。
当然,xml的设置和代码有些不同。
这里有些坑:
代码中使用DP单位
添加一个工具类DensityUtil
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| import android.content.Context; import android.util.TypedValue;
public class DensityUtil {
public static int dp2px(Context context, float dpVal) { return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dpVal, context.getResources().getDisplayMetrics()); }
public static int px2dip(Context context, float pxValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (pxValue / scale + 0.5f); } }
|
在代码中使用默认Attr值
这个较为繁琐,我直接使用曲线救国的方法。
XML中默认使用这个attr数值,然后代码中异化其他数值。
如果要在代码中使用,可以参考以下文章:
http://solo.farbox.com/blog/how-to-get-value-of-attr-in-code
http://oliveexcel.iteye.com/blog/2227992