Android常用组件整理(轮播、权限、图表、刷新、对话框、数据库)

常用组件整理

前言

常用组件整理

      整理一些Android常用的框架。文章整理时间为2020年9月份。

      我这文章这段时间有点儿guy,必须关注才能查阅。是因为这文章本来不适宜传递到网上,所以我就想通过这样的方式减少他人的阅读兴趣。


整理角度

      轮播

      动态权限申请

      图表

      刷新控件

      对话框

      数据库


 §

使用组件 com.youth.banner。位于GitHub榜首,且再无敌手。度娘7成的文章都是使用的这个组件。参考GitHub地址

效果预览
  • 默认
    在这里插入图片描述

  • 画廊
    在这里插入图片描述

  • 魅族
    在这里插入图片描述

  • 头条
    在这里插入图片描述

  • 文字标题
    在这里插入图片描述

  • 数字指示器
    在这里插入图片描述

  • 外部指示器
    在这里插入图片描述

  • 仿淘宝
    在这里插入图片描述

原理简析

    封装ViewPager2,融入指示器、标题和切换动画等效果

选型原因
  • 使用了ViewPager2为基础控件 [ViewPager2介绍]
  • 支持了androidx兼容包
  • 方便了UI、Indicator自定义
  • 支持画廊效果、魅族效果
  • 兼容了水平和垂直轮播,也可以实现类似淘宝头条的效果
  • 依赖包目前只需要导入了ViewPager2
  • 内置了多种PageTransformer效果(切换的动画效果)
适用场景

    在固定区域轮换的切换文本、图片、音视频等

demo实现
public class BannerActivity extends AppCompatActivity {
    public void useBanner() {
        //--------------------------简单使用-------------------------------
        banner.addBannerLifecycleObserver(this)//添加生命周期观察者
                .setAdapter(new BannerExampleAdapter(DataBean.getTestData()))
                .setIndicator(new CircleIndicator(this));
        
        //—————————————————————————如果你想偷懒,而又只是图片轮播————————————————————————
         banner.setAdapter(new BannerImageAdapter<DataBean>(DataBean.getTestData3()) {
                    @Override
                    public void onBindView(BannerImageHolder holder, DataBean data,
                    int position, int size) {
                        //图片加载自己实现
                        Glide.with(holder.itemView)
                             .load(data.imageUrl)
                             .apply(RequestOptions.bitmapTransform(new RoundedCorners(30)))
                             .into(holder.imageView);
                    }
                })
                .addBannerLifecycleObserver(this)//添加生命周期观察者
                .setIndicator(new CircleIndicator(this));
        //更多使用方法仔细阅读文档,或者查看demo
    }
}

动态权限申请 §

动态权限申请的框架很多,感觉也各有用途。截止2020年9月16日,在GitHub上查询到一些受欢迎的框架:PermissionsDispatcher星数超过10K,RxPermissions接近10K,AndPermission超过6K,easypermissions超过8.7K,PermissionX(郭霖2020年推出的一个框架)星数暂时不及1K。另外还有我们之前用过的Blankj/AndroidUtilCode当中也有权限申请的功能。

在这里我简单展示一些权限申请框架,并说明用法。

市面上这些权限申请框架基本都是通过一个隐形的Activity或者是Fragment来展示权限申请框。通过源码可以看到一些痕迹。

选型一:RxPermissions

特点

基于RxJava打造的一个申请框架,能够配合其他Rx库使用。参考GitHub地址

示例
  • 申请多个权限
rxPermissions
    .request(Manifest.permission.CAMERA,
             Manifest.permission.READ_PHONE_STATE)
    .subscribe(granted -> {
        if (granted) {
           // All requested permissions are granted
        } else {
           // At least one permission is denied
        }
    });
  • 单独处理每个结果
rxPermissions
    .requestEach(Manifest.permission.CAMERA,
             Manifest.permission.READ_PHONE_STATE)
    .subscribe(permission -> { // will emit 2 Permission objects
        if (permission.granted) {
           // `permission.name` is granted !
        } else if (permission.shouldShowRequestPermissionRationale) {
           // Denied permission without ask never again
        } else {
           // Denied permission with ask never again
           // Need to go to the settings
        }
    });
  • RxBinding 库配合
// Must be done during an initialization phase like onCreate
RxView.clicks(findViewById(R.id.enableCamera))
    .compose(rxPermissions.ensure(Manifest.permission.CAMERA))
    .subscribe(granted -> {
        // R.id.enableCamera has been clicked
    });

选型二:AndroidUtilCode

Blankj/AndroidUtilCode库中存在一个权限申请工具类 PermissionUtils 。参考GitHub地址

特点

几乎一个工具类就实现了简单的动态权限申请。功能简单,占用空间小。

示例
PermissionUtils.permission(PermissionConstants.PHONE, PermissionConstants.CAMERA)
        callback(new PermissionUtils.SimpleCallback() {
    @Override
    public void onGranted() {
        ToastUtils.showShort("accept");
    }
    @Override
    public void onDenied() {
        ToastUtils.showShort("denied");
    }
}).request();

选型三:PermissionX

这是郭霖在2020年初才正式推出的一个框架,比较年轻,所以GitHub星数暂时也很少。参考GitHub地址

特点

考虑了一些用户使用过程中的习惯,提供了一些人性化的实现方式:

  • 在申请权限前先显示提示语(方法onExplainRequestReason
  • 在永久拒绝的时候如果再次请求提供跳转功能(方法onForwardToSettings
  • 自定义提示框的外观(这是其他框架没有的,充满了未来感)

因为才推出不久,功能点还在不停拓展,值得期待。

示例
PermissionX.init(this)
    .permissions(Manifest.permission.CALL_PHONE, Manifest.permission.CAMERA)
    .explainReasonBeforeRequest()
    .onExplainRequestReason { scope, deniedList, beforeRequest ->
        if (beforeRequest) {
            scope.showRequestReasonDialog(deniedList, "即将重新申请的权限是程序必须依赖的权限", "我已明白", "取消")
        }
    }
    .onForwardToSettings { scope, deniedList ->
        scope.showForwardToSettingsDialog(deniedList, "您需要去应用程序设置当中手动开启权限", "我已明白", "取消")
    }
    .request { allGranted: Boolean, grantedList: List<String?>?, deniedList: List<String?>? ->
        if (allGranted) {
            Toast.makeText(this, "所有申请的权限都已通过", Toast.LENGTH_SHORT).show()
        } else {
            Toast.makeText(this, "您拒绝了如下权限:$deniedList", Toast.LENGTH_SHORT).show()
        }
    }

选型四:PermissionsDispatcher

特点

通过 注解代理 的方式进行权限申请。注解的方式处理权限,使用方法独一无二。但是感觉设置的过程也还是有点儿麻烦。参考GitHub地址

示例

五个注解:RuntimePermission(must)、NeedsPermission(must)、OnShowRationaleOnPermissionDenied
OnNeverAskAgain 构成了一个完整的过程。除此之外还要设置权限请求的代理,将此页面的权限请求代理给PermissionDispatcher

AnnotationRequiredDescription
@NeedsPermissionAnnotate a method which performs the action that requires one or more permissions
@RuntimePermissionsRegister an Activity or Fragment to handle permissions
@OnShowRationaleAnnotate a method which explains why the permissions are needed. It passes ina PermissionRequest object which can be used to continue or abort the current permission request upon user input. If you don’t specify any argument for the method compiler will generate process${NeedsPermissionMethodName}ProcessRequest and
cancel${NeedsPermissionMethodName}ProcessRequest. You can use those methods in place of PermissionRequest(ex: with DialogFragment)
@OnNeverAskAgainAnnotate a method which is invoked if the user chose to have the device “never ask again” about a permission
@OnPermissionDeniedAnnotate a method which is invoked if the user doesn’t grant the permissions
1. 设置注解
@RuntimePermissionsclass MainActivity : AppCompatActivity(), View.OnClickListener {

    @NeedsPermission(Manifest.permission.CAMERA)
    fun showCamera() {
        supportFragmentManager.beginTransaction()
                .replace(R.id.sample_content_fragment, CameraPreviewFragment.newInstance())
                .addToBackStack("camera")
                .commitAllowingStateLoss()
    }

    @OnShowRationale(Manifest.permission.CAMERA)
    fun showRationaleForCamera(request: PermissionRequest) {
        showRationaleDialog(R.string.permission_camera_rationale, request)
    }

    @OnPermissionDenied(Manifest.permission.CAMERA)
    fun onCameraDenied() {
        Toast.makeText(this, R.string.permission_camera_denied, Toast.LENGTH_SHORT).show()
    }

    @OnNeverAskAgain(Manifest.permission.CAMERA)
    fun onCameraNeverAskAgain() {
        Toast.makeText(this, R.string.permission_camera_never_askagain, Toast.LENGTH_SHORT).show()
    }
}
2. 设置代理
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        findViewById(R.id.button_camera).setOnClickListener {
            // NOTE: delegate the permission handling to generated function
            showCameraWithPermissionCheck()
        }
    }

    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        // NOTE: delegate the permission handling to generated function
        onRequestPermissionsResult(requestCode, grantResults)
    }

图表 §

关于图表,在度娘上很多文章都是推荐的MPAndroidChart(GitHub地址),GitHub星数超过31K,相比之下其他的框架的星数都寥寥无几。GitHub上Android图表第二名是hellocharts-android,星数超过7K,上一个版本是2015年9月份。

效果预览
  • 条形图(样式一)
    在这里插入图片描述

  • 条形图(样式二)
    在这里插入图片描述

  • 条形图(样式三)

在这里插入图片描述


  • 条形图(样式四)

在这里插入图片描述


  • 柱状图(样式一)

在这里插入图片描述


  • 柱状图(样式二)

在这里插入图片描述


  • 柱状图(样式三)

在这里插入图片描述


  • 组合图(此处是条形和柱状的组合)

在这里插入图片描述


  • 饼状图

在这里插入图片描述


  • 散点图

在这里插入图片描述


  • 蜡烛图

在这里插入图片描述


  • 气泡图

在这里插入图片描述


  • 雷达图

在这里插入图片描述

原理简析

使用canvas完成绘制

demo实现
    private void initBarChart(){
        Description description = barChart.getDescription();
        description.setText("电梯故障统计柱状图");
        description.setTextSize(10f);
        barChart.setNoDataText("no data.");
        // 集双指缩放
        barChart.setPinchZoom(false);
        barChart.animateY(2000);
 
        ArrayList<BarEntry> barEntries = new ArrayList<>();
        barEntries.add(new BarEntry(1, 2));
        barEntries.add(new BarEntry(2, 3));
        barEntries.add(new BarEntry(3, 1));
        barEntries.add(new BarEntry(4, 1));
        barEntries.add(new BarEntry(5, 2f));
        barEntries.add(new BarEntry(6, 3));
 
        BarDataSet barDataSet = new BarDataSet(barEntries, "error times");
 
        BarData barData = new BarData(barDataSet);
        barData.setDrawValues(true);//是否显示柱子的数值
        barData.setValueTextSize(10f);//柱子上面标注的数值的字体大小
        barData.setBarWidth(0.8f);//每个柱子的宽度
        barChart.setData(barData);
 
        XAxis xAxis = barChart.getXAxis();
        xAxis.setDrawLabels(true);//是否显示x坐标的数据
        xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);//设置x坐标数据的位置
        xAxis.setDrawGridLines(false);//是否显示网格线中与x轴垂直的网格线
//        xAxis.setLabelCount(6, true);//设置x轴显示的标签的个数
        final List<String> xValue = new ArrayList<>();
        xValue.add("zero");//index = 0 的位置的数据在IndexAxisValueFormatter中时不显示的。
        xValue.add("one");
        xValue.add("two");
        xValue.add("three");
        xValue.add("four");
        xValue.add("five");
        xValue.add("six");
        xAxis.setValueFormatter(new IndexAxisValueFormatter(xValue));//设置x轴标签格式化器
 
        YAxis rightYAxis = barChart.getAxisRight();
        rightYAxis.setDrawGridLines(false);
        rightYAxis.setEnabled(true);//设置右侧的y轴是否显示。包括y轴的那一条线和上面的标签都不显示
        rightYAxis.setDrawLabels(false);//设置y轴右侧的标签是否显示。只是控制y轴处的标签。控制不了那根线。
        rightYAxis.setDrawAxisLine(false);//这个方法就是专门控制坐标轴线的
 
        YAxis leftYAxis = barChart.getAxisLeft();
        leftYAxis.setEnabled(true);
        leftYAxis.setDrawLabels(true);
        leftYAxis.setDrawAxisLine(true);
        leftYAxis.setPosition(YAxis.YAxisLabelPosition.OUTSIDE_CHART);
        leftYAxis.setDrawGridLines(false);//只有左右y轴标签都设置不显示水平网格线,图形才不会显示网格线
        leftYAxis.setDrawGridLinesBehindData(true);//设置网格线是在柱子的上层还是下一层(类似Photoshop的层级)
        leftYAxis.setGranularity(1f);//设置最小的间隔,防止出现重复的标签。这个得自己尝试一下就知道了。
        leftYAxis.setAxisMinimum(0);//设置左轴最小值的数值。如果IndexAxisValueFormatter自定义了字符串的话,那么就是从序号为2的字符串开始取值。
        leftYAxis.setSpaceBottom(0);//左轴的最小值默认占有10dp的高度,如果左轴最小值为0,一般会去除0的那部分高度
        //自定义左侧标签的字符串,可以是任何的字符串、中文、英文等
        leftYAxis.setValueFormatter(new IndexAxisValueFormatter(new String[]{ "0", "1", "2", "3", "4", "5"}));
 
    }

刷新控件 §

在GitHub上,SmartRefreshLayout的星数超过21K,其余超过3K的都是超过4年都没有更新版本的。这也是我在这里展示的框架。

另外需要提及的有,Swiperefreshlayout是谷歌方法的一个下拉控件。但是不支持上拉加载,不支持多样化的刷新动画。

GitHub搜索语句:refresh android in:name,description stars:>3000

选型原因
  • 支持多点触摸
  • 支持淘宝二楼和二级刷新
  • 支持嵌套多层的视图结构 Layout (LinearLayout,FrameLayout…)
  • 支持所有的 View(AbsListView、RecyclerView、WebView…View)
  • 支持自定义并且已经集成了很多炫酷的 Header 和 Footer.
  • 支持和 ListView 的无缝同步滚动 和 CoordinatorLayout 的嵌套滚动 .
  • 支持自动刷新、自动上拉加载(自动检测列表惯性滚动到底部,而不用手动上拉).
  • 支持自定义回弹动画的插值器,实现各种炫酷的动画效果.
  • 支持设置主题来适配任何场景的 App,不会出现炫酷但很尴尬的情况.
  • 支持设多种滑动方式:平移、拉伸、背后固定、顶层固定、全屏
  • 支持所有可滚动视图的越界回弹
  • 支持 Header 和 Footer 交换混用
  • 支持 AndroidX
  • 支持横向刷新
效果预览
DeliveryDropBox
在这里插入图片描述在这里插入图片描述
BezierRadarBezierCircle
在这里插入图片描述在这里插入图片描述
FlyRefreshClassics
在这里插入图片描述在这里插入图片描述
PhoenixTaurus
在这里插入图片描述在这里插入图片描述
demo实现
  1. 在XML布局文件中添加 SmartRefreshLayout
<?xml version="1.0" encoding="utf-8"?>
<com.scwang.smart.refresh.layout.SmartRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/refreshLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <com.scwang.smart.refresh.header.ClassicsHeader
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:overScrollMode="never"
        android:background="#fff" />
    <com.scwang.smart.refresh.footer.ClassicsFooter
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
</com.scwang.smart.refresh.layout.SmartRefreshLayout>
  1. 在 Activity 或者 Fragment 中添加代码
    RefreshLayout refreshLayout = (RefreshLayout)findViewById(R.id.refreshLayout);
    refreshLayout.setRefreshHeader(new ClassicsHeader(this));
    refreshLayout.setRefreshFooter(new ClassicsFooter(this));
    refreshLayout.setOnRefreshListener(new OnRefreshListener() {
        @Override
        public void onRefresh(RefreshLayout refreshlayout) {
            refreshlayout.finishRefresh(2000/*,false*/);//传入false表示刷新失败
        }
    });
    refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() {
        @Override
        public void onLoadMore(RefreshLayout refreshlayout) {
            refreshlayout.finishLoadMore(2000/*,false*/);//传入false表示加载失败
        }
    });

对话框Dialog §

GitHub搜索语句:dialog android in:name,description stars:>3000 pushed:>2019-09-01

除开各种各样的小 up主 的控件,在GitHub上有名的安卓Dialog框架也寥寥无几。

选型一: DialogPlus (链接)

选型原因
  1. 在公司项目中有持久的使用
  2. GitHub上星数接近5K(最新发布版是16年1月份,版本号1.11)
实现原理

没有继承实现Dialog,直接新建的一个View控制状态

demo实现
DialogPlus.newDialog(this)
    .setContentHolder(ViewHolder(R.layout.item_renthouse_list))
    .setGravity(Gravity.CENTER)
    .create().show()

选型二: Material Dialogs (链接)

选型原因
  1. 在GitHub上星数超过18K
  2. 一直在保持更新和维护,最近发行版在2020年3月份,版本号3.3.0
  3. 提供了很多功能对话框的默认实现:可输入的对话框;存储文件选择对话框;颜色选择对话框;时间选择对话框;底部弹出对话框;
  4. 全部用Kotlin语言实现
实现原理

继承原始Dialog实现,基础元素依赖于Material Design Components

demo实现
  • 基本实现
val dd = MaterialDialog(this)
    .title(text = "MaterialDialog input")
    .input(hint = "input here")
dd.show()
  • 原生时间选择对话框(带预览效果)
MaterialDialog(this).show {
  datePicker { _, date ->
    toast("Selected date: ${date.formatDate()}")
  }
}

在这里插入图片描述


数据库 §

GitHub搜索语句:android,database in:name,description stars:>3000

经过我在GitHub上粗略的过滤和度娘上大致的寻找,得到了如下几个知名的框架。令我惊讶的是,数据库框架竟然还有蛮多个知名的框架。因为我对于数据库的理解也很粗浅,所以在这里我就直接分享目标地址了,仅供大家参考。

选型一: Realm (链接)

在GitHub上星数超过11K。Ream 不是在SQLite基础上的ORM,它有自己的数据查询引擎。Realm 支持 iOS & OS X (Objective‑C & Swift) & Android

选型二: GreenDAO (链接)

在GitHub上星数超过12K。该开发团队greenrobot也是著名框架EventBus的开发团队。

选型三: LitePal (链接)

这是著名讲师郭霖及其团队的开源项目,在其书籍上广泛使用,在GitHub上星数超过7K。

选型四: Room (链接)

这是jetpack中的一个组件,能够和jetpack中其他的组件(LiveDataPaging)有很多配合。可以说是谷歌的亲儿子。

参考资料

greendao 3.0和litepal 1.3 比较 (阅读)

LitePal vs GreenDAO vs SQLOpenHelper 性能比較 (阅读)

LitePal与GreenDao你会选择哪一个 (阅读)

Android Room VS GreenDao (阅读)

GreenDao与Realm性能对比 (阅读)

Room和realm数据插入性能对比 (阅读)

Realm For Android,操作更简单的数据库 (阅读)



欢迎添加我的个人微信

在这里插入图片描述

CSDN博客网站个人中心 : le540850072

  • 2
    点赞
  • 13
    收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:技术黑板 设计师:CSDN官方博客 返回首页
评论 1

打赏作者

le540850072

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值