# ZhqAndroidUtils **Repository Path**: zhujwyh/ZhqAndroidUtils ## Basic Information - **Project Name**: ZhqAndroidUtils - **Description**: 这是个人版本所使用的一个androidUtils工具包 - **Primary Language**: Android - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2024-07-09 - **Last Updated**: 2024-07-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ZhqAndroidUtils [![](https://jitpack.io/v/com.gitee.zhqhandsome/ZhqAndroidUtils.svg)](https://jitpack.io/#com.gitee.zhqhandsome/ZhqAndroidUtils) #### 介绍 从事多年Android开发,总结下一些日常所使用的自定义的组件,以及Utils工具包,方便日后更好接入,无需要重复的复制粘贴代码。 #### 涉及相关使用的功能 1. 权限控制(Android 6.0以上系统编译版本API23以上需要动态获取运行时权限)------->> **PermissionManage** 1. 底部导航栏------->> **NavigationMenuBar** 1. 可以灵活设置图片与文字结合四个方向的(top、bottom、left、right)----->> **IconTextView** 1. 带有输入框取消文字的功能----->> **ClearEditText** 1. 圆形头像ImageView----->> **CircleImageView** 1. 可控制圆形radius的TextView----->> **ShapeTextView** 1. 带有进度条正在加载、加载失败、暂无数据的----->> **StateLayout** 1. 自定义头部布局,解决重复绘制xml----->> **TitleBarLayout** 1. 横向滚动的指示器,支持与ViewPager滑动,带有滑动过渡动画效果的----->> **TabBarIndicatorLayout** 1. 仿微信图片加载库------->> **ImageSelector** 1. 网格图片加载库------->>**MultiImageView** 1. 仿苹果刷新view------>>**AppleRefreshView** 1. 骨架屏的自定义View使用---->>**SkeletonScreen** 1. GIF图片加载自定义View---->>**GifView** 1. 全屏播放自定义videoView--->>**CustomVideoView 1. 根据视频大小播放的DiyVideoView-->>**DiyVideoView 1. 带有阴影效果的按钮-->>**ShadowButton 1. 非主线程绘制图片的RootSufaceView 1. 支持各种阴影效果的FpShadowLayout #### Gradle配置使用 ``` android { allprojects { repositories { jcenter() maven { url "https://www.jitpack.io" } } } } dependencies { implementation 'com.gitee.zhqhandsome:ZhqAndroidUtils:v1.0.4' } ``` #### 使用说明 1. **PermissionManage** ``` new PermissionManage.Builder(this) .setPermission(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE , Manifest.permission.READ_PHONE_STATE, Manifest.permission.CALL_PHONE, android.Manifest.permission.READ_CONTACTS, Manifest.permission.CAMERA }) .setPermissionOnListener(new PermissionManage.PermissionOnListener() { @Override public void callBackApiLowSdk(int sdkCode) { //TODO } }) .builder() .requestPermission(); ``` 2. **NavigationMenuBar** ``` bottomMenuBar.setBottomNameResource(new CharSequence[]{"首页", "分类", "购物车", "我的"}) .setImageResource( new int[]{R.mipmap.home_tab_normal, R.mipmap.alarm_tab_normal, R.mipmap.work_order_tab_normal, R.mipmap.mine_tab_normal}, new int[]{R.mipmap.home_tab_pressed, R.mipmap.alarm_tab_pressed, R.mipmap.work_order_tab_pressed, R.mipmap.mine_tab_pressed} ) .setFontPadding(NavigationMenuBar.TOP, 5) .setBottomMenuBackgroundColor(getResources().getColor(R.color.bottomBar_background_color)) .initToPosition(0) .builder(); bottomMenuBar.setOnTabSelectedListener(new NavigationMenuBar.OnTabSelectedListener(){ @Override public void onTabSelected(int currentPosition, int lastIndex) { //TODO } }); ``` 3. **IconTextView** ``` ``` 4. **ClearEditText** ``` ``` 5. **CircleImageView** ``` ``` 6. **ShapeTextView** ``` ``` 7. **StateLayout** ``` @Override public StateLayout.Builder getBuilderLayout() { return new StateLayout.Builder(this) .setStateLayout(R.layout.state_layout) .setStateLayoutViewId(R.id.button_retry) .onRetryListener(new OnRetryListener() { @Override public void onRetry() { //TODO } }); } @Override public void showEmpty() { showRootView(mRecyclerView); rootView.showEmptyView(); } @Override public void showFailure(String error) { showRootView(mRecyclerView); rootView.showFailView(); } ``` 8. **TitleBarLayout** ``` @Override public TitleBarLayout getTitleBarLayout() { return new TitleBarLayout(this) .setTitleBarTitleName(getIntent().getExtras().getString("name")); } /**** * 添加TitleBar控件,开发人员不用操心视图xml头部元素 */ public void addTitleBarView() { View rootView = ((ViewGroup) findViewById(android.R.id.content)).getChildAt(0); if (rootView != null && getTitleBarLayout() != null) { titleBarLayout = getTitleBarLayout(); titleBarLayout .setTitleBarBackDrawableLeftSrc(R.drawable.ic_arrow_back_white_24dp) .setTitleBarBackFontColor(R.color.white) .setTitleBarTitleColor(R.color.white) .setTitleRightFontColor(R.color.white) .setTitleBarTitleFontSize(15) .setTitleBarFontSize(15) .setTitleBarBackground(getResources().getDrawable(R.drawable.divider_bottom_gray_line)) .setBackDrawableLeftWidthHeight(24, 24) .setFontLeftPadding(TitleBarLayout.LEFT, 10) .setFontRightPadding(TitleBarLayout.RIGHT, 10) .setTitleBarBackOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { finishActivity(); } }) .build(); if (rootView instanceof LinearLayout) { LinearLayout linearParent = (LinearLayout) rootView; linearParent.addView(titleBarLayout, 0); } else if (rootView instanceof RelativeLayout) { RelativeLayout relativeParent = (RelativeLayout) rootView; titleBarLayout.setId(R.id.titleBar_id); relativeParent.addView(titleBarLayout, 0); View view = relativeParent.getChildAt(1); RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) view.getLayoutParams(); params.addRule(RelativeLayout.BELOW, R.id.titleBar_id); view.setLayoutParams(params); } } } ``` 9. **TabBarIndicatorLayout** ``` slidingTabLayout.setTabBarIndicator(new TabBarItemBean.Builder() .setSelectPosition(0) .setTabBarNormalColor("#ffffff") .setTabBarPressedColor("#ffffff") .setTabBarIndicatorColor("#00B0FF") .setTabBarSelectFontSize(14) .setTabBarUnSelectFontSize(13) .setTabBarScrolled(true) .setTabBarIndicatorHeight(ScreenUtils.dpToPx(getResources(), 2)) .setTabBarTitle(mTitles) .setTabBarPressedType(new Integer[]{AppConstant.WorkOrder.GET_ALL, AppConstant.WorkOrder.WAIT_AUDIT, AppConstant.WorkOrder.WAIT_RECEIVER, AppConstant.WorkOrder.HAVE_IN_HAND, AppConstant.WorkOrder.WAIT_SURE, AppConstant.WorkOrder.ALREADY_COMPLETED, AppConstant.WorkOrder.ALREADY_EXIT, AppConstant.WorkOrder.AUDIT_REJECT}) .setTabBarViewPager(mViewPager) .build() ).show(); ScrollViewPagerAdapter mAdapter = new ScrollViewPagerAdapter(getChildFragmentManager(), mFragments, mTitles); mViewPager.setAdapter(mAdapter); ``` 10. **ImageSelector** ``` // 缺少权限时, 进入权限配置页面 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && ContextCompat.checkSelfPermission(mContext, android.Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(getActivity(), new String[]{android.Manifest.permission.READ_CONTACTS, android.Manifest.permission.WRITE_CONTACTS, android.Manifest.permission.CAMERA} , PermissionManage.SDK_PERMISSION_REQUEST); } else { ImageConfig imageConfig = new ImageConfig.Builder( new GlideLoader()) .steepToolBarColor(getResources().getColor(R.color.colorPrimary)) .titleBgColor(getResources().getColor(R.color.colorPrimary)) .titleSubmitTextColor(getResources().getColor(R.color.white)) .titleTextColor(getResources().getColor(R.color.white)) .setTitleImageResource(R.drawable.ic_arrow_back_white_24dp) .mutiSelect() .singleSelect() .pathList(new ArrayList<>()) .filePath(new StringBuilder(File.separator).append("com.cndz").append(File.separator).append("ImageTemp").toString()) .showCamera() .crop() .requestCode(BasePresenter.REQUEST_Gallery_CODE) .build(); ImageSelector.open(getActivity(), imageConfig); // 开启图片选择器 } ``` 11. **MultiImageView** ``` multiImageView.setOnItemClickListener(new OnItemLoadImageListener() { @Override public void loadImageView(ImageView imageView, String imageUrl, GildeImageConfig gildeImageConfig) { if (gildeImageConfig.isBorderOverlay()) { Glide.with(getContext()) .load(imageUrl) .skipMemoryCache(true) .placeholder(R.mipmap.imageselector_photo) .transition(DrawableTransitionOptions.withCrossFade(500)) // 渐变 .transform(new CornerTransform(getContext(), gildeImageConfig))) .diskCacheStrategy(DiskCacheStrategy.NONE).into(imageView); } else { Glide.with(getContext()).load(imageUrl) .placeholder(R.mipmap.imageselector_photo) .transition(DrawableTransitionOptions.withCrossFade(500)) // 渐变 .diskCacheStrategy(DiskCacheStrategy.ALL).into(imageView); } } @Override public void onItemClick(View view, int p) { //TODO } }); ``` 12. **AppleRefreshView** ``` appleRefreshView.setRefreshListener(new AppleRefreshView.RefreshListener() { @Override public void onRefresh() { //TODO } }); //对外提供判断上拉、下拉条件,根据当前节点的view来判断是否可以下拉刷新 appleRefreshView.registerPullableListener(new Pullable(){ @Override public boolean canPullDown(View childView) { //TODO } @Override public boolean canPullUp(View childView) { //TODO } }); ``` 13. **SkeletonScreen** ``` dependencies { //骨架屏 implementation 'com.ethanhua:skeleton:1.1.2' implementation 'io.supercharge:shimmerlayout:2.1.0' } //recyclerAdapter使用 NewsAdapter adapter = new NewsAdapter(); final SkeletonScreen skeletonScreen = Skeleton.bind(recyclerView) .adapter(adapter) .shimmer(true) .angle(20) .frozen(false) .duration(1200) .count(10) .load(R.layout.item_skeleton_news) .show(); //default count is 10 recyclerView.postDelayed(new Runnable() { @Override public void run() { skeletonScreen.hide();//隐藏骨架屏 } }, 3000); //activity中的使用 View rootView = findViewById(R.id.rootView);//注册根目录 SkeletonScreen skeletonScreen = Skeleton.bind(rootView) .load(R.layout.activity_view_skeleton)//给用户看到的加载item .duration(1000) .color(R.color.shimmer_color) .angle(0) .show(); ``` 14. **GifView** ``` //布局加载使用 //对外提供方法 setMovieResouce(int movieResId); setMovieTime(int time); setPaused(boolean paused); boolean isPaused(); ```