开源软件名称:ZhqAndroidUtils
开源软件地址:https://gitee.com/zhqhandsome/ZhqAndroidUtils
开源软件介绍:
ZhqAndroidUtils
介绍从事多年Android开发,总结下一些日常所使用的自定义的组件,以及Utils工具包,方便日后更好接入,无需要重复的复制粘贴代码。 涉及相关使用的功能- 权限控制(Android 6.0以上系统编译版本API23以上需要动态获取运行时权限)------->> PermissionManage
- 底部导航栏------->> NavigationMenuBar
- 可以灵活设置图片与文字结合四个方向的(top、bottom、left、right)----->> IconTextView
- 带有输入框取消文字的功能----->> ClearEditText
- 圆形头像ImageView----->> CircleImageView
- 可控制圆形radius的TextView----->> ShapeTextView
- 带有进度条正在加载、加载失败、暂无数据的----->> StateLayout
- 自定义头部布局,解决重复绘制xml----->> TitleBarLayout
- 横向滚动的指示器,支持与ViewPager滑动,带有滑动过渡动画效果的----->> TabBarIndicatorLayout
- 仿微信图片加载库------->> ImageSelector
- 网格图片加载库------->>MultiImageView
- 仿苹果刷新view------>>AppleRefreshView
- 骨架屏的自定义View使用---->>SkeletonScreen
- GIF图片加载自定义View---->>GifView
- 全屏播放自定义videoView--->>**CustomVideoView
- 根据视频大小播放的DiyVideoView-->>**DiyVideoView
- 带有阴影效果的按钮-->>**ShadowButton
- 非主线程绘制图片的RootSufaceView
- 支持各种阴影效果的FpShadowLayout
Gradle配置使用android { allprojects { repositories { jcenter() maven { url "https://www.jitpack.io" } } }}dependencies { implementation 'com.gitee.zhqhandsome:ZhqAndroidUtils:v1.0.4'} 使用说明- 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(); - NavigationMenuBar
<com.zhq.apputil.widget.NavigationMenuBar android:id="@+id/navigation_menuBar" android:layout_width="match_parent" android:layout_height="49dp" app:bottom_count="4" app:shadow_line_color="@color/separation" app:shadow_line_width="1dp" app:text_color_normal="@color/tab_bottom_font_color" app:text_color_pressed="@color/tab_bottom_pressed_font_color" app:button_select_color_normal="@color/white" app:button_select_color_pressed="@color/separation" app:text_color_normal="@color/tab_bottom_font_color" app:text_color_pressed="@color/tab_bottom_pressed_font_color" app:text_font_size="12sp"/> 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 } }); - IconTextView
<com.zhq.apputil.widget.IconTextView android:id="@+id/icon_set" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_marginStart="20dp" android:layout_marginEnd="20dp" android:layout_weight="1" android:drawablePadding="10dp" android:gravity="center|left" android:text="@string/set" android:textColor="@color/white" android:textSize="16sp" app:drawable_src="@mipmap/mine_setting" app:imageHeight="25dp" app:imageLocation="left" app:imageWidth="25dp" /> - ClearEditText
<com.zhq.apputil.widget.ClearEditText android:id="@+id/autoCompleteUserName" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/transparent" android:drawablePadding="10dp" android:hint="@string/prompt_email" android:imeOptions="normal" android:inputType="text" android:maxLines="1" android:singleLine="true" android:textColor="@color/white" android:textColorHint="@color/light_gray" android:textCursorDrawable="@drawable/corner_cursor" /> - CircleImageView
<com.zhq.apputil.widget.CircleImageView android:id="@+id/headImageView" android:layout_width="74dp" android:layout_height="74dp" android:layout_centerVertical="true" android:layout_marginLeft="25dp" android:layout_marginTop="50dp" android:src="@mipmap/head_default_logo" app:border_color="@color/white" app:border_width="2dp"/> - ShapeTextView
<com.zhq.apputil.widget.ShapeTextView android:id="@+id/tvSubstation" android:layout_width="0dp" android:layout_height="30dp" android:layout_marginRight="10dp" android:layout_weight="1" android:gravity="center" android:text="电站 ▼" android:textSize="12sp" android:textColor="@color/state_selected" app:appBgColor="#4A5A84" app:appBorder="false" app:appBottomLeftCorner="false" app:appBottomRightCorner="false" app:appRadius="2dp" app:appTopLeftCorner="true" app:appTopRightCorner="true" /> - 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(); } - 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); } } } - TabBarIndicatorLayout
<com.zhq.apputil.widget.TabBarIndicatorLayout android:id="@+id/stl" android:layout_width="match_parent" android:layout_height="48dp" app:tab_count="8" android:background="#30394D" /> 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); - 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); // 开启图片选择器 } - MultiImageView
<com.zhq.apputil.widget.MultiImageView android:id="@+id/multiImageView" android:layout_width="match_parent" android:layout_height="wrap_content" app:multi_border_color="@color/white" app:multi_border_overlay="true" app:multi_border_width="1dp" app:multi_overlay_radius="5dp" app:multi_right_bottom_corner="true" app:multi_right_top_corner="true" app:multi_top_bottom_corner="true" app:multi_top_left_corner="true"/> 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 } }); - AppleRefreshView
<com.zhq.apputil.widget.AppleRefreshView android:id="@+id/refresh_view" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent" android:scrollbars="none"/> </com.zhq.apputil.widget.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 } }); - 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(); - GifView
//布局加载使用 <com.zhq.apputil.widget.GifView android:id="@+id/gif_view" android:layout_width="50dp" android:layout_height="60dp" app:gif="@drawable/get_fire"/>//对外提供方法 setMovieResouce(int movieResId); setMovieTime(int time); setPaused(boolean paused); boolean isPaused(); |
请发表评论