# 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/#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();
```