GT官方教程

前言:

让你在开发中爱不释手的 GT 包。关注GSLS官网,查看更多源码 ヾ(✿゚▽゚)ノ工具包。

所有文章 小编尽量让读者可以 直接 读懂 完全 复制粘贴,其中复杂或较多 的源码 会有 源码 并 贴上 github 网址

GT库技术共享讨论群[QQ:814506562]


为了方便GT库友们:(创群日期:2023.10.23)
一起交流,一起贡献开源技术
希望在库友们的共同的努力下,
将我们开源GT库建设的越好用、越稳定。
致谢语:
非常感谢一路以来支持GT库的伙伴们,
因为GT库覆盖的技术方便太广涉及代码量太多,一人之力难以全面维护好,
所以在此创建 GT库官方群1 集齐GT友集体智慧,将库建设成为更好更全更稳定的库。
贡献名单:(贡献多者麻烦找我要个管理位,对GT库有疑惑的请发群里或请联系管理大大)

GT 类 里面的源码完全开源较多的中文注释,让更多的人直接读懂。

点个关注点个赞呗(〃'▽'〃),关注博主最新发布库:https://github.com/1079374315/GT

让创造变得如此简单!

(点击我 知晓 最新版网址)

最新版本详细更新:进入CSDN 博客切换到github

GT库特点:减少代码量、方便快捷、用于记录、

内部总代码量特别多,但每个功能区的代码均可以拷贝出去新建文件单独使用。

以下编辑有13万字,前方高能,因为有许多功能知识量特别多故不在此篇文章做详细介绍但会在其专属文章进行详细介绍。

有什么好的建议可在次评论去留言

更新时间:2023 年 6 月 3 日 

 使用GT库里的,当然需要先依赖好GT库啦:

GitHub - 1079374315/GTContribute to 1079374315/GT development by creating an account on GitHub.icon-default.png?t=N7T8https://github.com/1079374315/GT

目录

第一章:GT库依赖(推荐指数:✪✪✪✪✪)

1.引入库

第一步:将以下存储库将其添加到根构建中。存储库末尾的 build.gradle(Project:******)

第二步:添加依赖关系 build.gradle(Module:app)

第二章:日志log类(推荐指数:✪✪✪✪✪)

第三章:吐司类(推荐指数:✪✪✪)

普通吐司:

自定义Toast:

第一步:创建 toast_view.xml

第二步:自定义 Toast 的代码

第四章:数据模块

1、DataSendReception(新品-推荐指数:✪✪✪✪✪)

2、SaveObject (推荐指数:✪✪✪)

3、GT_SharedPreferences(推荐指数:✪✪✪)

4、GT_IO(推荐指数:✪✪)

5、FileUtils(推荐指数:✪✪✪✪)

6、Hibernate(热度更新:推荐指数:✪✪✪✪✪✪)

7、CleanDataUtils(推荐指数:✪✪)

8、GT_Random(推荐指数:✪✪)

9、SerialPortUtils(新品:推荐指数:✪✪✪✪✪)

10、DataUtils(推荐指数:✪✪✪)

第五章:网络类

1、Network(推荐指数:✪✪)

2、JSON(推荐指数:✪✪✪✪)

3、HttpUtil 与 HttpCall 网络请求框架(推荐指数:✪✪✪✪✪)

网络请求框架

4、WebViewUtils(推荐指数:✪✪✪✪)

WebWiew 工具类

(1)、获取网页上的源码:getHtmlData

(2)、加载PC网页:

(2)、加载APP网页:

第六章:小工具类

1、GT_Date(推荐指数:✪✪✪)

强大的日期工具包

1、ScreenOperation(推荐指数:✪✪✪)

手机屏幕操作

1、ApplicationUtils(推荐指数:✪✪✪✪)

小工具包

第七章:APP迭代类(更新、热修复bug)

1、UpdateApp(推荐指数:✪✪✪✪)

更新 APP 版本

第一步:加上必要权限:

1、RepairAPP(推荐指数:✪✪✪✪)

APP热更新

第八章

1、BaseAdapter(推荐指数:✪✪✪✪)

针对与 RecyclerView.Adapter 进行封装本节将用 RecyclerView来示范

 第一步:新建一个主页面 与 适配器的 布局 文件

第二步:新建 实体类 与 适配器

第三步:写好使用代码

1、Encryption(推荐指数:✪✪✪)

加密工具包

第一个:MD5加密

第二个:DES加密

第三个:Base64加密

第九章:UI类(推荐章节)

1、ProgressDialogUtils(推荐指数:✪✪✪✪)

加载进度条

第一种:简易进度条 initProgressBarDialog

第二种:简易圆圈加载条 initProgressBarDialog

第三种:简易进度条加载条 initProgressBarDialog

第四种:简易圆形加载条 initCircleProgressDialog

2、GT_Animation(推荐指数:✪✪✪✪)

GT动画库,真动画(运动后事件在最终运动处)与假动画(运动后事件在原处)

3、WindowUtils(推荐指数:✪✪✪✪)

WindowUtils 窗体类,封装了APP窗口类工具

4、ViewUtils(推荐指数:✪✪✪✪)

自定义View工具集合,可直接添加到xml 布局文件中

5、GT_Activity(推荐指数:✪✪✪✪✪✪)

封装 Activity 管理器

第一种:BaseActivity 基类Activity

第二种:AnnotationActivity  注解 Activity

6、GT_Fragment(推荐指数:✪✪✪✪✪✪)

封装 Fragment 管理器

第一种:BaseFragments 基类Fragment

第二种:AnnotationFragment 基类Fragment

7、GT_Dialog(推荐指数:✪✪✪✪✪)

对话框封装类 管理器

第一种:BaseDialogFragment  基类Dialog

第二种:AnnotationDialogFragment  注解类 Dialog

三:9种简易对话框Dialog

第1种,单按钮对话框:

第2种,双按钮对话框:

 第3种,列表选择-对话框:

 第4种,多选-对话框:

第5种,单选-对话框:

第6种,输入型-对话框:

第7种,进度条-对话框:

第8种,加载条-对话框:

第9种,自定义-对话框:

8、GT_FloatingWindow(推荐指数:✪✪✪✪✪)

Android——超简单悬浮窗使用教程_PlayfulKing的博客-CSDN博客_android 自定义悬浮框完全自定义悬浮窗,保证100%学会的超简单悬浮窗先看看31行代码的效果图:再来看看我无聊制作的悬浮窗:我们来看看这些都是如何实现的第一步:自定义的xml布局 demo_floating_window9、GT_View(新品:推荐指数:✪✪✪✪✪)

GT_View 专门用来解决局部View特别复杂时会让 Avtibity 或 Fragment 变复杂的问题

第十章:设备监听类 DeviceListening(推荐指数:✪✪✪)

手机设备的监听

第十一章:多媒体类(推荐指数:✪✪✪)

手机设备的音乐、音频,视频等...

第十二章:GT注解(推荐指数:✪✪✪✪✪✪)

GT高级使用方法

第十三章:GT线程(推荐指数:✪✪✪✪✪)

第十四章:动态权限授权类(新品-推荐指数:✪✪✪✪✪)

超级简单且轻量级的动态授权框架

第十五章:GT 黑科技(新品-推荐指数:✪✪✪✪✪)

第一个:超简单无障碍服务

总结:简单方便的使用,就是GT库所诞生的初衷。给个关注呗,今后会诞生更多的黑科技


第一章:GT库依赖(推荐指数:✪✪✪✪✪)

1.引入库

第一步:将以下存储库将其添加到根构建中。存储库末尾的 build.gradle(Project:******)

allprojects {
	repositories {
		...
		maven { url 'https://jitpack.io' }
        //新版的AS 用法: maven { url = uri("https://jitpack.io") }
	}
}

 注意:最新版Android Studio Arctic Fox | 2020.3.1的引用库的地方在另外的一个文件夹上:

第二步:添加依赖关系 build.gradle(Module:app)

(注意:当前演示的版本号是v1.4.4.1版本,今后会有新的版本发布,欢迎使用最新版)

dependencies {
        ...
	implementation 'com.github.1079374315:GSLS_Tool:v1.4.4.1'
}

同步后如果出现 :The number of method references in a .dex file cannot exceed 64K. 错误,解决办法:

 multiDexEnabled true //只需要将此设置为 true 即可

最后再进行同步一下 Sync New,在此期间记得打开网络,需要联网。



第二章:日志log类(推荐指数:✪✪✪✪✪)

第一步:日志打印

GT.log("日志内容");
GT.log("日志标题", "日志内容");
GT.logs("详细日志打印");//打印包含内容:1.打印所在行数,2.打印类的路径与类名,3.打印所在的方法名,4.打印的信息

效果图:

04-29 17:41:49.001 3152-3152/? I/GT_i: ------- 日志内容
04-29 17:41:49.001 3152-3152/? I/GT_i: ------- Run
    
    ---------------------日志标题------------------------
                       日志内容
    ---------------------日志标题-----------------------
    
    ------- Close
04-29 17:41:49.001 3152-3152/? I/GT_i: ------- <Line:19>[com.gsls.gtlibrary.activity.MainActivity] onCreate(): 详细日志打印

第二步:错误日志打印

GT.err("日志内容");
GT.err("日志标题", "日志内容");
GT.errs("详细日志打印");//打印包含内容:1.打印所在行数,2.打印类的路径与类名,3.打印所在的方法名,4.打印的信息

效果图:

04-29 17:46:23.964 3483-3483/com.gsls.gtlibrary E/GT_e: ------- 日志内容
04-29 17:46:23.964 3483-3483/com.gsls.gtlibrary E/GT_e: ------- Run
    
    ---------------------日志标题------------------------
                       日志内容
    ---------------------日志标题-----------------------
    
    ------- Close
04-29 17:46:23.964 3483-3483/com.gsls.gtlibrary E/GT_e: ------- <Line:19>[com.gsls.gtlibrary.activity.MainActivity] onCreate(): 详细日志打印

注意:错误打印,打印出来的信息的是红色的信息

第三步:日志全部打印:

如果想打印很多的数据,发现普通的打印更本打印不全,那是因为Android 的日志打印是有限制日志长度的,接下来就展示怎样打印全部的 日志:

模拟数据的资源文件:

代码实现:

String allData = getResources().getString(R.string.allData);

        GT.log(allData);

        GT.log("======================================= 分割线 =======================================");

        GT.logAll(allData);

打印效果:

2020-07-18 16:00:58.860 24711-24711/? I/GT_i: ------- Run
    
    ---------------------普通打印------------------------
                       { code: 38, data: { record_store_list: [ { storeLogo: data:image/png;base64,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
2020-07-18 16:00:58.860 24711-24711/? I/GT_i: ------- ======================================= 分割线 =======================================
2020-07-18 16:00:58.860 24711-24711/? I/GT_i: Run --------- 打印全部 ---------
2020-07-18 16:00:58.861 24711-24711/? I/GT_i: ------- { code: 38, data: { record_store_list: [ { storeLogo: data:image/png;base64,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
2020-07-18 16:00:58.861 24711-24711/? I/GT_i: ------- kMeBjvz0qKUgNhVBDNnjt/8AWq6+gupzb3Uif7LYZagfS9V3Z823kOcklSpP5GuGWGmuh2Rrw7kBYsTnO/Od2eKriVCSI3DbTg89DVprHWMAfZ7ZjnkiUj+lIdP1Zt3+i24O7IzKenvgVk8NU7GqrQ7jI93mHaQMjGCBz7+1PwzEKeqggEe/vUn9l6u5bJtEB6febH8qlXRL1wPMvAhxz5cY/rmtFhZ9jKVeJEkYRVXkkDk1HLcQLMIg+5sZ2rz+FXl8OW7Y+0TTT+zvwfwGBWhBp1tbjEUKr9BXRDCPqYSxCuUbJJC4coV9M84rYjBIGaFjwOBipQtdtOnyKyOWc+bUVR3opwGKK0IEooooAZQaKKAGdzRRRQAlFFFBotgpTRRQZjgOlOoooASnjoKKKACiiigD/9k=, storeName: 汉堡王大咖, storeId: 48, total: 0.05 }, { storeLogo: data:image/png;base64,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
2020-07-18 16:00:58.861 24711-24711/? I/GT_i: NdGZYepiFF01tf9DLDVoU783U9Dorio/H6YBlsJQD3VgR+uKsp4808/eguF/wCAg/1rx3gcQvsHasTSf2jrMVlXmhxXNy1yj7JDB5Cq0auiqXDt8p4JbAz9BWaPHGlHqZh9Yv8A69PHjbSP+esn/fpqj6pX/kf3Fe3p/wAyNaPTIvtDTzhJpMyCM+WF2o+Ny8dc7RyetW/Kj8zzNi78Y3Y5x9a58+NdIBIMkoI6gxNTD430kdGmP0iNH1Su/sP7gdal/MjpqK5R/HmnD7sNw3/AAP61Xk8fQ4JisZ2x1JYAD+dUsDiH9hkvE0l9o7I18+6o2NXveP8Al4k/9CNehy+Prtj+6s4l/wB9yf5YrjJbWGe4lnkGXkcuwzxknNezleHq4eUnUW5x4qvColyk5P8Aoq/9dD/IVGBlgPU4pSf9FX/rof8A0EUQqZHPzou0bvmPX2r0r2TZzclzSmurmbTo9Odj9mgJZCYCCTz1PpyfzrMFXzbY3yLPan7w2+cTjjrj8az5FMUhTer4/iU5BrKg46pFTi3qxatadHLJfReQcTKwZPlBy2eOvH51S3H1q/YLNERcwywq6gsuX2sCPT3q6ztBijDUm1sXZvTNfbRcOBuVQMAY4wQSD/Os2tC8+1XsYuLm4haQZyzSfM2O2MVmbj61OH+BLt2HUh71x9aFneXFrZzWsbqqXgwwMe44wR17cZ9fWswsa04rWYRY862Yfd5lI468juKMQ1y2YQi76GeQQSCMEHBopZ1eOUhnV2PzEqcjmo9x9a2i7q5DgKJIzDsYsCHLZAz2x60ZhByHfI/2B/jRRVcnmbk5vWLs/wBofcwwf3Y5/WoMw/33/wC+B/jRRSVJR2He4Zh/vv8A98D/ABqWC6+zMGhmZSDn/VA/1ooodNSVmLYfLfvPH5clwxTAGPKXt071XzD/AH3/AO+B/jRRRGko6R0Bu+4qyJG6ukjhlOQdg6/nVg6veFg3nA45zsHrn+dFFDowl8SuNO2xDcXs10VM0m4rnHygYycnp71DuFFFUoRirIW5/9k=, storeName: 宇宙测试, storeId: 49, total: 0.05 } ], currentMonthTotal: 0.0 }, msg: 请求成功, resut: 1 }
2020-07-18 16:00:58.861 24711-24711/? I/GT_i: --------- 打印全部 --------- Close

第四步:本地日志打印:(注意)

GT.LOG.setLogFileTf(true,this);//开启本地日志打印 (仅对详细日志有用)

GT.logs("我是详细日志");

注意:打印的日志文件会在手机更路径名为 GT_LOG 文件夹中 根据当前日期产生日志文件。

效果图:

本地日志还可以自定义一些属性:

GT.LOG.setLogFileTf(true,this);//开启本地日志打印 (仅对详细日志有用)

GT.LOG.setLogFilePath("ABC/CF/");//设置日志文件路径
String TAG = MainActivity.class.getSimpleName();//获取当前类名,用于区分每个类之间的日志
GT.LOG.setPrintFileName(TAG);//设置日志文件名

//GT.errs("我是详细错误日志");
GT.logs("我是详细普通日志");


//        GT.errAll("");// 同样

效果图:

第五步:APP奔溃日志打印:(APP崩溃后可反馈崩溃日志给到服务器)

 GT.LOG.LOG_FILE_TF = true;//开启本地日志
 GT.LOG.initAppErrLogTry(this);

效果图:

总结:本地日志请在上线时记得关闭,不然会耗性能的。

第三章:吐司类(推荐指数:✪✪✪)

当你依赖GT库后就可以进行以下操作了

普通吐司:


// Toast 提示 命脉
// GT.TOAST.setToastTf(false);//默认为 true 如果设置为 false 则所有非 GT 内部发出的 Toast 都会不显示

GT.toast(activity,"我是吐司");
GT.toast_time(activity,"我是吐司",4000);//显示吐司4秒

效果图:

自定义Toast:

第一步:创建 toast_view.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">
 
    <View
        android:id="@+id/view"
        android:layout_width="300dp"
        android:layout_height="200dp"
        android:background="@mipmap/ic_launcher"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
 
    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#000000"
        android:textSize="24sp"
        android:textStyle="bold"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.3" />
 
</androidx.constraintlayout.widget.ConstraintLayout>

第二步:自定义 Toast 的代码

//初始化 Toast 的 布局(R.layout.toast_view) 并 设置 居中 (Gravity.CENTER)
GT.TOAST.ToastView toastView = new GT.TOAST.ToastView().initLayout(R.layout.toast_view, Gravity.CENTER,this);
TextView tv = toastView.getView().findViewById(R.id.tv);//获取 TextView 组件
tv.setText("我的自定义 Toast");
toastView.getToast().show();//显示 Toast

效果图:

总结:如果你在使用 Toast 前绑定Activity 或 Fragment 你就可以去掉  activity 直接打印

第四章:数据模块

1、DataSendReception(新品-推荐指数:✪✪✪✪✪)

临时数据:数据发送与接收类,支持跨进程、跨APP发送接收数据

发送方法:

//发送更新UI广播(简洁版.支持跨APP传输) broadcastName – 接收方必须用相同的这个地址注册
public static void sendUpdateUiBroadcast(Object broadcastName, Object data)

//发送更新UI广播(标准版.支持跨APP传输) broadcastName – 接收方必须用相同的这个地址注册
public static void sendUpdateUiBroadcast(Context context, Object broadcastName, Object data)

接收方法:

//内部注册监听数据的方法
public static void registerUpdateUiBroadcast(Object registerMessage)

//注册监听数据的方法 broadcastName – 接收暗号,必须与发送的暗号一致
public static void registerUpdateUiBroadcast(Object broadcastName, OnReceptionDataListener onReceptionDataListener)

//注册监听数据的方法 broadcastName – 接收暗号,必须与发送的暗号一致
public static void registerUpdateUiBroadcast(Context context, Object broadcastName, OnReceptionDataListener onReceptionDataListener)

发送单条消息:

 接收数据类:MainActivity

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //注册接收信息的事件
        GT.DataSendReception.registerUpdateUiBroadcast("Key", new GT.DataSendReception.OnReceptionDataListener() {
            @Override
            public void updateUi(Context context, Intent intent, String defaultBroadcastName) {
                String defaultKey = intent.getStringExtra(defaultBroadcastName);
                GT.log("defaultKey:" + defaultKey);
                Toast.makeText(MainActivity.this,"收到了信息:" + defaultKey,Toast.LENGTH_LONG).show();
            }
        });


        //跳转到第二个页面
        findViewById(R.id.btn_start).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this, MainActivity2.class));
            }
        });

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //关闭名叫 Key 的广播
        GT.DataSendReception.close("Key");
    }


}

 发送数据类:MainActivity2

public class MainActivity2 extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        //单击往 Key 发送数据
        findViewById(R.id.btn_send).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                GT.DataSendReception.sendUpdateUiBroadcast("Key", "名字:小明");
            }
        });

    }

}

效果图:

发送多条消息:

我们新增一个实体类bean

public class DemoBean implements Serializable {

    private int DemoBeanId;

    public DemoBean(int demoBeanId) {
        DemoBeanId = demoBeanId;
    }

    public int getDemoBeanId() {
        return DemoBeanId;
    }

    public void setDemoBeanId(int demoBeanId) {
        DemoBeanId = demoBeanId;
    }

    @Override
    public String toString() {
        return "DemoBean{" +
                "DemoBeanId=" + DemoBeanId +
                '}';
    }
}

数据接收类修改:MainActivity

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //注册接收信息的事件
        GT.DataSendReception.registerUpdateUiBroadcast("Key", new GT.DataSendReception.OnReceptionDataListener() {
            @Override
            public void updateUi(Context context, Intent intent, String defaultBroadcastName) {
                //接收多条信息
                String name = intent.getStringExtra("name");
                int age = intent.getIntExtra("age",-1);//Serializable
                DemoBean demoBean = (DemoBean) intent.getSerializableExtra("DemoBean");
                GT.log("name:" + name);
                GT.log("age:" + age);
                GT.log("demoBean:" + demoBean);


            }
        });


        //跳转到第二个页面
        findViewById(R.id.btn_start).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this, MainActivity2.class));
            }
        });

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //关闭名叫 Key 的广播
        GT.DataSendReception.close("Key");
    }

}

数据发送类修改:MainActivity2

public class MainActivity2 extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);

        findViewById(R.id.btn_send).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //一次性发送多条数据
                Intent intent = new Intent();
                intent.putExtra("name","小明");
                intent.putExtra("age",8);
                intent.putExtra("DemoBean", new DemoBean(123));
                GT.DataSendReception.sendUpdateUiBroadcast("Key", intent);
            }
        });

    }

}

接收数据还有其他使用方法如:

public class MainActivity extends AppCompatActivity implements GT.DataSendReception.OnReceptionDataListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //注册接收信息
        GT.DataSendReception.registerUpdateUiBroadcast("Key", this);

    }

    @Override
    public void updateUi(Context context, Intent intent, String defaultBroadcastName) {
            //接收数据进行处理

    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
        //关闭名叫 Key 的广播
        GT.DataSendReception.close("Key");
    }
}

总结:该方法传输数据因为不依赖你传的activity,所以可以在任意class 进行注册接收发送数据

2、SaveObject (推荐指数:✪✪✪)

持久数据:数据永久性存储池

注意:此存储只能存储 实体类

方法名介绍:

//增删查改
/**
参数1:activity
参数2:操作的实体类
返回参数:本次操作是否成功,查询除外
*/
public static synchronized boolean saveObject(Context context, Object obj)
public static synchronized boolean deleteObject(Context context, Class<?> cla)
public static synchronized <T> T queryObject(Context context, Class<T> cla)
public static synchronized boolean updateObject(Context context, Object obj)

 我们新增一个实体类bean

public class DemoBean implements Serializable {

    private int DemoBeanId;

    public DemoBean(int demoBeanId) {
        DemoBeanId = demoBeanId;
    }

    public int getDemoBeanId() {
        return DemoBeanId;
    }

    public void setDemoBeanId(int demoBeanId) {
        DemoBeanId = demoBeanId;
    }

    @Override
    public String toString() {
        return "DemoBean{" +
                "DemoBeanId=" + DemoBeanId +
                '}';
    }
}

接下来就来写示例:

public class MainActivity extends AppCompatActivity {

    private TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tv = findViewById(R.id.tv);

        DemoBean queryObject = GT.SaveObject.queryObject(this, DemoBean.class);
        GT.log("queryObject:" + queryObject);
        if (queryObject == null) {
            tv.setText("未读取到数据");
            Toast.makeText(this,"未读取到数据,开始保存",Toast.LENGTH_LONG).show();
            GT.SaveObject.saveObject(this, new DemoBean(2021));
        }else{
            tv.setText("读取数据成功:\n" + queryObject);
            Toast.makeText(this,"读取数据成功!",Toast.LENGTH_LONG).show();
        }
    }

}

效果图:

3、GT_SharedPreferences(推荐指数:✪✪✪)

持久数据:对于原生 SharedPreferences的封装

public class MainActivity extends AppCompatActivity {

    private GT.GT_SharedPreferences sp;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //参数:SP名字,是否自动提交
        sp = new GT.GT_SharedPreferences(this,getPackageName(),true);

        //增删查改
        sp.save("name","小明");
        sp.query("name");
        sp.updata("name","大明");
        sp.delete("name");

        //读取 实体类
        UserBean userBean = sp.query("userBean", UserBean.class);
        sp.save("userBean",userBean);//保存 实体类
        sp.updata("userBean",userBean);//修改 实体类
        sp.delete("userBean");//删除 实体类

        sp.clear();//清空所有sp存储的内容

        //提交本次操作,因为在创建的时候,最后一个参数 commit 是默认提交为 true 所以操作后回自动提交事务
        //sp.commit();

    }

}

还有一种方式可以创建 SP,绑定 Activity 或者 Fragment 即可使用注解方式创建SP

public class MainActivity extends AppCompatActivity {

    //使用注解方式实例化
    @GT.GT_SharedPreferences.Build
    private GT.GT_SharedPreferences sp;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        GT.build(this);//绑定 Activity

        //可直接使用
        sp.save("name","kkk");
        sp.query("name");
    }
}

具体参数在注解中输入 set 即可设置具体参数

4、GT_IO(推荐指数:✪✪)

内部 IO 流存储

存储的数据在APP内部存储中,此功能很少用到

//使用实例: 第一步:
        GT.GT_IO io = new GT.GT_IO(this);
        //创建 IO 对象 第二步:
        io.save("存储的数据","King");
        //保存数据 第三步:
        String king = io.query("King"); //获取数据

5、FileUtils(推荐指数:✪✪✪✪)

增强版外部存储,轻轻松松自定义File可视文件组件

方法介绍:

保存单个文件
public static void saveData(String saveData, String savePaht, String fileName)

保存多个文件
public static void saveDataAll(String savePaht, Map<String, String> saveMap)

文件是否存在
public static boolean fileExist(String filePathAddFileName)

保存文件数据
public static void save(String saveData, String savePaht, String fileName) 

查询文件数据
public static String query(String queryPaht, String fileName)

查询当前文件路径汇总有多少个文件
public static List<String> queryFilePathFileNumber(String filePath)

获取文件描述
public static String getFileSizeDescriptor(String filePath, String fileName)

删除当前路径下所有的文件已经子文件
public static void deleteAllFiles(File deleteFile, boolean deleteThisFile)

重命名
public static void changeFileDirName(String path, String oldName, String newName)

获取U盘名称
public static String getUsbName()

复制单个文件
public static void copyFile(String fromFileStr, String toFileStr)

复制所有文件
public static int copyAllFile(String fromFile, String toFile)

获取文件夹中所有文件名
public static List<String> getFilesAllName(String path)

清空文件夹中所有文件
public static void deleteAllFile(File file, boolean isSaveFolder)

获取手机根路径
public static String getAppDirectory()

//今后会有部分更新...

详细的参数介绍可打开源码查看参数提示:

 总结:方便实用,FileUtil 今后的更新路线应该会在操作USB(U盘)数据方向兼容发展

6、Hibernate(热度更新:推荐指数:✪✪✪✪✪✪)

对原生SQLite数据库的封装,增删查改均一行代码

超级简单的SQLite:(不需要写任何SQL语句完成以下操作)

我们先了解一下 Hibernate 数据库  的基本特性:

字段 支持类型
String、[]字符串类型、数组
int、Integer、[]整数类型、
boolean、Boolean、[]布尔类型、数组、数组
double、Double、[]浮点类型、数组
float、Float、[]浮点类型、数组
Time时间类型
Date日期类型
long、Long、[]长整型、数组
short、Short、[]短整型、数组
byte[]字节数组
Object、[]实体类
List<?>? 可以是任何类型
Map<?>? 可以是任何类型

注意:主键目前版本暂时仅支持自增的只有。

注意:所有实体类建议要有空的无参构造方法

主键目前版本暂时仅支持自增的只有整数类型 ,如果没有在实体类中表示主键,Hibernate 会自动生成一个主键,本数据库不需要任何配置

基本方法介绍:

//保存数据
public <T> Hibernate save(T bean)

//保存多条数据
public <T> Hibernate saveAll(List<T> beanList)

//删除数据
public <T> Hibernate delete(T classOrBean)

//清空表中数据
public Hibernate deleteAll(Class<?> tableClass)

//查询数据
public <T> T query(Class<T> tableNameClass)

//查询表中全部数据
public <T> List<T> queryAll(Class<T> tableNameClass)

//修改数据
public <T> Hibernate update(T bean)

//修改全部数据
public Hibernate updateAll(Class<?> tableClass, ContentValues contentValues)

//查询条件,具体可参考更详细教程
public Hibernate where(Object conditions, Object values)

//倒序
public Hibernate flashback(String orderByStr)

限制
public Hibernate limit(int[] limitStr)

由于Hibernate 知识量太多不适合在本篇全部展示,如果对该封装的SQLite有兴趣的点击这里有更加详细的教程,后面更新的方向会向数据库数据加密方向进行。

Hibernate 详细教程:Android——超简单SQL实现教程_会飞的鱼-CSDN博客_android sql让你在开发中爱不释手的 GT 包。关注GSLS官网,查看更多源码 ヾ(✿゚▽゚)ノ工具包。所有文章 小编尽量让读者可以 直接 读懂 与 完全 复制粘贴,其中复杂或较多 的源码 会有 源码 并 贴上 github 网址。GT 类 里面的源码完全开源,较多的中文注释,让更多的人直接读懂。点个关注点个赞呗(〃'▽'〃),关注博主最新发布库:https://github.com/107937...https://blog.csdn.net/qq_39799899/article/details/105935756

7、CleanDataUtils(推荐指数:✪✪)

管理手机数据

方法介绍:

getTotalCacheSize(需要查下缓存大小)

clearAllCache(清空缓存)

deleteDir(删除文件)

cleanInternalCache(清除本应用内部缓存)

cleanDatabases(清除本应用所有数据库)

cleanSharedPreference(清除本应用SharedPreference)

cleanDatabaseByName(按名字清除本应用数据库)

cleanFiles(清除/data/data/com.xxx.xxx/files下的内容)

cleanExternalCache(清除外部cache下的内容(/mnt/sdcard/android/data/com.xxx.xxx/cache))

cleanCustomCache(清除自定义路径下的文件,使用需小心,请不要误删。而且只支持文件下的文件删除)

cleanApplicationData(清除本应用所有的数据)

deleteFilesByDirectory(删除方法 这里只会删除某个文件夹下的文件,如果传入的directory是个文件,将不做处理)

getFolderSize(获取文件)

deleteFolderFile(删除指定文件下文件)

getFormatSize(格式化单位)

8、GT_Random(推荐指数:✪✪)

随机类

方法介绍:

//获取一个未知整数
public static int getInt()

//在范围内获取随机数
public static int getInt(int min, int max)

//获取定义字符之间的随机字符
public static char getChar(char startChar, char closeChar)

9、SerialPortUtils(新品:推荐指数:✪✪✪✪✪)

串口类,无需增添第三文件,可直接构建使用!!!

相信网上很多的串口教程均是需要加很多的 so 文件或加入 jin 其他诸多配置,而成功集成GT库的话,串口通讯将变得十分简单:

方法介绍:

//读取数据后默认转十进制返回

//按照次数读取数据
public String readDataCount(int count)

//按时间读取数据
public String readDataTime(int time)

//按照在一定时间内读取的次数来读取数据
public String readDataTimeAddCount(int time, int count)

//按照起始符与结束符读取数据
public String readDataStartAddClose(String start, String close)

//读取本次所有数据
public String readDataAll()

//读取曲线数据,Params:spValue – 检测值与曲线值的分隔符
public String readCurveData(String spValue)


//读取原始数据,不会进行数据格式转换,使用方法与上面一样

public byte[] readByteDataCount(int count)

public byte[] readByteDataTime(int time)

public byte[] readByteDataTimeAddCount(int time, int count)

public byte[] readByteDataStartAddClose(String start, String close)

public byte[] readByteDataAll()

//其他功能方法

//设置读取数据期间的速度
public SerialPortUtils setReadSpeed(int readSpeed)

//设置等待下位机发送数据的等待间隔时间
public SerialPortUtils setWaitingTime(int waitingTime)

实际列子:

public class MainActivity extends AppCompatActivity {

    private GT.SerialPortUtils serialPortUtils;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //创建串口工具
        serialPortUtils = new GT.SerialPortUtils(this,"串口号/物理地址",9600);
//        serialPortUtils = new GT.SerialPortUtils(this,"串口号/物理地址",9600,true);//打开串口调试日志

        //简单的发送数据
        serialPortUtils.sendData("发送的数据");

        //发送数据进行 BG2312编码
        serialPortUtils.sendData("发送的数据", Charset.forName("GB2312"));

        new Thread(new Runnable() {
            @Override
            public void run() {

                String readData = serialPortUtils.readDataAll();//读取全部数据,均已十进制读取
                GT.log("readData:" + readData);

            }
        }).start();

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //释放资源
        serialPortUtils.close();
    }
}

当然还支持注解创建,使用方法与楼上一样不变

public class MainActivity extends AppCompatActivity {

    //使用注解方式实例化
    @GT.SerialPortUtils.Build(setComAll = "串口号/主板物理地址",setBaudRate = 9600)
    private GT.SerialPortUtils serialPortUtils;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        GT.build(this);//绑定 Activity

        serialPortUtils.sendData("aaa");

    }
}

总结:如果觉得还不实用,那你可以参考源码完全进行扩展使用

10、DataUtils(推荐指数:✪✪✪)

数据格式装换类

//16进制 byte 转10进制 int
public static int[] byte2Int(byte[] data)

//判断奇数或偶数,位运算,最后一位是1则为奇数,为0是偶数
public static int isOdd(int num)

//Hex字符串转int
public static int HexToInt(String inHex)

public static String IntToHex(int intHex)

//Hex字符串转byte
public static byte HexToByte(String inHex)

//1字节转2个Hex字符
public static String Byte2Hex(Byte inByte)

//字节数组转转hex字符串
public static String ByteArrToHex(byte[] inBytArr)

//字节数组转转hex字符串,可选长度
public static String ByteArrToHex(byte[] inBytArr, int offset, int byteCount)

//转hex字符串转字节数组
public static byte[] HexToByteArr(String inHex)

/*
按照指定长度切割字符串
Params:
inputString – 需要切割的源字符串
length – 指定的长度
Returns:

*/
public static List<String> getDivLines(String inputString, int length)

//计算长度,两个字节长度
public static String twoByte(String val)

//校验和
public static String sum(String cmd)

总结:目前 数据类 教程告一段落
 

第五章:网络类

1、Network(推荐指数:✪✪)

网络类用于判断是否可联网,获取P地址等...

方法介绍:

//监听网络状态 true 网络正常 false 网络异常
public static boolean netWorkStatus(Context context)

//获取手机 IP 地址
public static String getIPAddress(Context context)

//检测当前手机是否可上网
public static boolean isInternet(Context context)

//获取当前网络属于 无网络(返回0)、WF(返回1)、2G(返回2)、3G(返回3)、4G(返回4) 网络
public static int getNetworkState(Context context)


2、JSON(推荐指数:✪✪✪✪)

接口解析 json 与 Bean 互转 TODO 装换实体类建议创建好实体类的空的无参构造方法

使用示例:

先添加一个实体类:

public class DemoBean{

    //TODO 必须要的空构造方法
    public DemoBean(){}

    private int DemoBeanId;

    public DemoBean(int demoBeanId) {
        DemoBeanId = demoBeanId;
    }

    public int getDemoBeanId() {
        return DemoBeanId;
    }

    public void setDemoBeanId(int demoBeanId) {
        DemoBeanId = demoBeanId;
    }

    @Override
    public String toString() {
        return "DemoBean{" +
                "DemoBeanId=" + DemoBeanId +
                '}';
    }
}
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        DemoBean demoBean = new DemoBean(2021);
        //将实体类转为json数据
        String jsonData = GT.JSON.toJson(demoBean);
        GT.log("jsonData:" + jsonData);
        try {
            //将json数据转为实体类
            DemoBean demoBean1 = GT.JSON.fromJson(jsonData, DemoBean.class);
            GT.log("demoBean1:" + demoBean1);
        } catch (JSONException e) {
            e.printStackTrace();
        }


    }

}

效果图:

 总结:转换的实体类必须要有无参构造方法,不然可能会出现问题

3、HttpUtil 与 HttpCall 网络请求框架(推荐指数:✪✪✪✪✪)

网络请求框架

Android——超简单网络请求_PlayfulKing的博客-CSDN博客超简单的 网络请求框架 GThttps://blog.csdn.net/qq_39799899/article/details/125697371?spm=1001.2014.3001.5502

总结:这两种新的网络请求框架,有简易版与接口版,伙伴们可以按照自己框架或者自己需求来定。

4、WebViewUtils(推荐指数:✪✪✪✪)

WebWiew 工具类

加上网络权限

<uses-permission android:name="android.permission.INTERNET"/>

功能支持:

1.将网页上的 JSON 数据取下来(需要放在子线程运行)
2.加载 PC 版的网页
3.加载 App 网页
4.加载 html
5.WebView 加强
6.加载一个网页
7.加载一个Asset 文件里的 html 文件
8.加载一个 SD卡里的
9.加载富文本
10.监听所有加载的网页的进度

每个功能都对应着一个方法,具体参数请自行查看

使用示例:

(1)、获取网页上的源码:getHtmlData

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
         new Thread(new Runnable() {
            @Override
            public void run() {
                String url = "https://blog.csdn.net/qq_39799899/article/details/102490617";
                GT.WebViewUtils.getHtmlData(url, new GT.WebViewUtils.OnGetHtmlCodeListener() {
                    @Override
                    public void onGetStart(String url) {
                        GT.logt("开始获取");
                    }

                    @Override
                    public void onGetProgress(int progress) {
                        GT.logt("获取网页源码中..." + progress);
                    }

                    @Override
                    public void onGetClose(String url, String htmlCode, long htmlSize) {
                        GT.logt("网页源码:" + htmlCode);
                    }

                    @Override
                    public void onGetError(String url, Object errorMessage) {
                        GT.log("获取失败:" + errorMessage);
                    }
                });
            }
        }).start();
    }
}

效果图:

2021-08-16 15:06:36.437 6670-6736/com.tnd.myapplication I/GT_i: ------- htmlData:<!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <meta http-equiv="content-type" content="text/html; charset=utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=Edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
    <meta name="apple-mobile-web-app-status-bar-style" content="black">
    <meta name="report" content='{"pid": "blog", "spm":"1001.2101"}'>
    <meta name="applicable-device" content="mobile">
    <meta http-equiv="Cache-Control" content="no-transform"/>
    <meta http-equiv="Cache-Control" content="no-siteapp"/>
    <meta content="yes" name="apple-mobile-web-app-capable">
    <meta content="black" name="apple-mobile-web-app-status-bar-style">
    <meta content="telephone=no" name="format-detection">
    <meta content="email=no" name="format-detection">
    <meta name="referrer" content="always">
    <meta name="csdn-baidu-search" content='{"autorun":true,"install":true,"keyword":"android gt"}'>
    <title>Android——GT库发布_会飞的鱼-CSDN博客_android gt</title>
    <meta name="description" content='GT库最新版本: 1.1.5GT库官方教程发布时间:2020年1月7日 切换到github此次版本更新:------------------------------------------------------------------------------------------- * 更新时间:2020.1.7 * * &amp;lt;p&amp;gt; * * 

(2)、加载PC网页:

xml界面代码就补贴上了,就是一个充满全局的WebView就行

public class MainActivity extends AppCompatActivity {

    private WebView webView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        webView = new WebView(this);
        setContentView(webView);

        String url = "https://blog.csdn.net/qq_39799899?type=blog";
        GT.WebViewUtils.loadPCHtml(this, 
                webView, 
                url, //加载的网页
                false, //是否缓存
                new GT.WebViewUtils.OnLoadWebViewListener() {
            @Override
            protected void onLoadingProgress(WebView view, int progress) {
                super.onLoadingProgress(view, progress);
                GT.logt("加载网页中..." + progress);
            }
        });


    }

}

效果图:

 日志效果图:

(2)、加载APP网页:

public class MainActivity extends AppCompatActivity {

    private WebView webView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        webView = findViewById(R.id.webView);

       GT.WebViewUtils.loadAppHtml(this, webView, "https://blog.csdn.net/qq_39799899/article/details/102490617", false, new GT.WebViewUtils.OnLoadWebViewListener() {
           protected void onLoadingProgress(WebView view, int progress) {
                super.onLoadingProgress(view, progress);
                GT.logt("加载网页中..." + progress);
            }
       });


    }

}

效果图:

总结:加载PC网页与加载App网页,只需要把方法名的PC改成App即可

第六章:小工具类

1、GT_Date(推荐指数:✪✪✪)

强大的日期工具包

方法介绍:

//离现在有多少 年 月 日 ,时 分 秒 (加强版)
//仅仅支持 这种格式的时间(yyyy-MM-dd HH:mm:ss)或者时间戳
public static String toPastTimeX(String time2)

//获取中国日期
public static String getDateTime_CH()

//获取国外日期
public static String getDateTime_US()

//获取自定义格式的日期
public static String getDateTime(String dateTimeFormat)

//将多少秒转换成 时分秒 如:100秒 = 1分钟40秒
public static String secondsToTime(int seconds)

//获取当前星期-文字型
public static String getWeekOfDateString()

//获取当前星期-数字型
public static int getWeekOfDateInt()

//时间戳转 时间 YYYY-MM-DD 00:00:00
public String toTime(String dataTime)

//时间转时间戳
public long toTimestamp(String time)

//日历的高级功能
public static class Lunar{

//获得某天前个节气日期差
public static long getbeforesolarTerm(int year, Date date)
//获得某天后个节气日期差
public static long getaftersolarTerm(int year, Date date)
//获得某天前后两个节气序号
public static int[] getnearsolarTerm(int year, Date date)
//获得某年中所有节气Date
public static Date[] jieqilist(int year)
//返回农历年闰月月份
private static int getLunarLeapMonth(int lunarYear)
//返回农历年闰月的天数
private static int getLunarLeapDays(int lunarYear)
//返回农历年的总天数
private static int getLunarYearDays(int lunarYear)
//取 Date 对象中用全球标准时间 (UTC) 表示的日期
public static synchronized int getUTCDay(Date date)
//返回全球标准时间 (UTC) (或 GMT) 的 1970 年 1 月 1 日到所指定日期之间所间隔的毫秒数。
public static synchronized long UTC(int y, int m, int d, int h, int min, int sec)
//返回公历年节气的日期
private static int getSolarTermDay(int solarYear, int index)
//返回公历年节气的日期
public static Date getSolarTermCalendar(int solarYear, int index)
//取农历年生肖
public String getAnimalString()
//还有许多许多方法...
}

总结:还有许多方法小编就不贴出来了

1、ScreenOperation(推荐指数:✪✪✪)

手机屏幕操作

方法介绍:

//点击屏幕 可根据 屏幕的比例 与 具体的 X,Y 坐标点击

//传入在屏幕中的比例位置,坐标左上角为基准
public static void autoClickRatio(Activity act, final double ratioX, final double ratioY)
//传入在屏幕中的坐标,坐标左上角为基准
public static void autoClickPos(Activity act, final double x, final double y)

总结:今后会出无障碍点击屏幕

1、ApplicationUtils(推荐指数:✪✪✪✪)

小工具包

方法介绍:

//分析文字
public static void senText(Activity activity, String title, String content)
//分析文件
public static void shareFile(Activity activity, String sharTitle, String filePath)
//分析图片
public static void share(Activity activity, Bitmap bitmap)
//弹出软件盘
public static void editKeyboard(EditText editText, Activity activity)
//收起软键盘
public static void editKeyShrink(EditText editText, Activity activity)
//将字符串赋值到粘贴板上
public static void copyToClipboard(Context context, String text)
//保存图片
public static void saveImage(Activity activity, View view, String savePath, String fileName)
//获取App名称
public static String getAppName(Context context)
//获取软件版本号
public static int getVersionCode(Context mContext)
//获取软件版本名称
public static String getVerName(Context context)
//加压文件
public static void unzipFile(String zipPtath, String outputDirectory, boolean isDeleteZipPage)
//获取当前Apk包名
public static String getPackageName(Context context)
//获取当前手机应用列表
public static class PrintPhoneAppList
//获取当前手机APP信息
public static ArrayList<HashMap<String, Object>> getAllAppData(Context context)
//当前APP是否在前台
public static boolean isFrontDesk(Context context)
//编辑框提示错误信息
public static void hintErrorMessage(EditText editText, String errorMessage)
//手机截屏转Bitmap
public static Bitmap takeScreenShot(Activity pActivity)
//View 转 BitMap
public static Bitmap createBitmapFromView(View view)
//判断手机号码是否规则
public static boolean isPhoneNumber(String input)
//获取所有APPName
public static List<String> getAppAllPackName()



总结:这里面的小工具包功能会不定时更新

第七章:APP迭代类(更新、热修复bug)

1、UpdateApp(推荐指数:✪✪✪✪)

更新 APP 版本

第一步:加上必要权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 写入手机权限 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" /><!-- 读取手机权限 -->
<uses-permission android:name="android.permission.INTERNET" /> <!-- 网络权限 -->

第二步:从服务器下载APP并自动跳出安装界面

 GT.HttpUtil.downloadFile("http://qzonestyle.gtimg.cn/qzone/vas/opensns/res/doc/AppManage.apk",
                GT.FileUtils.getAppDirectory(this) + "/QQ签名工具.apk", new GT.HttpUtil.OnLoadData() {

                    @Override
                    public void onDownloadStart(File file) {
                        super.onDownloadStart(file);
                        GT.logt("下载开始");
                    }

                    @Override
                    public void onDownloading(int progress) {
                        super.onDownloading(progress);
                        GT.logt("下载中..." + progress);
                        
                    }

                    @Override
                    public void onDownloadSuccess(File file) {
                        super.onDownloadSuccess(file);
                        //参数三 需要在 AndroidMain.xml 中添加参数,详情请点击API方法内查看
                        GT.AppIteration.UpdateApp.installNewApk(MainActivity.this, file.getPath(), "");
                    }

                    @Override
                    public void onDownloadFailed(Exception e) {
                        super.onDownloadFailed(e);
                        GT.logt("下载失败");
                    }
                });

效果图:

1、RepairAPP(推荐指数:✪✪✪✪)

APP热更新

后续更新详细教程:目前可参考教程:Android——Android热修复简单实现_会飞的鱼-CSDN博客_android 热修复icon-default.png?t=N7T8https://blog.csdn.net/qq_39799899/article/details/102478355

第八章

1、BaseAdapter(推荐指数:✪✪✪✪)

针对与 RecyclerView.Adapter 进行封装本节将用 RecyclerView来示范

 第一步:新建一个主页面 与 适配器的 布局 文件

item_demo.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    >
    <TextView
        android:id="@+id/tv_name"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:text="姓名"
        android:layout_height="wrap_content"/>
    <TextView
        android:id="@+id/tv_age"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:text="年龄"
        android:layout_height="wrap_content"/>
</LinearLayout>

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    tools:context=".MainActivity">

    <ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="更新数据"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        />

</androidx.constraintlayout.widget.ConstraintLayout>

第二步:新建 实体类 与 适配器

demoBean

​
public class DemoBean{

    public DemoBean(){}

    private String name;
    private int age;

    public DemoBean(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "DemoBean{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

​

适配器

public class DemoAdapter extends GT.GT_Adapters.BaseAdapter<DemoBean> {

    //下面你适合那种构造方法那就用那种即可
    public DemoAdapter(Context context) {
        super(context);
    }

    @Override
    protected int loadLayout() {
        return R.layout.item_demo;//加载布局
    }

    @Override
    protected void initView(View itemView, int position, DemoBean demoBean) {
        super.initView(itemView, position, demoBean);
        //初始化View
        TextView tv_name = itemView.findViewById(R.id.tv_name);
        TextView tv_age = itemView.findViewById(R.id.tv_age);
        //设置数据
        tv_name.setText(demoBean.getName());
        tv_age.setText(String.valueOf(demoBean.getAge()));

    }

    @Override
    protected void loadData(View itemView, int position, DemoBean demoBean) {
        super.loadData(itemView, position, demoBean);
        //其他事件等业务逻辑

    }
}

第三步:写好使用代码

public class MainActivity extends AppCompatActivity {

    private RecyclerView recyclerView;
    private DemoAdapter demoAdapter;
    private List<DemoBean> demoBeanList = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //实例化 RecyclerView
        recyclerView = findViewById(R.id.recyclerView);

        //实例化适配器并设置垂直显示数据
        demoAdapter = new DemoAdapter(this);
        demoAdapter.setLinearLayoutManager_V(recyclerView);

        //模拟数据
        for (int i = 0; i < 100; i++) {
            demoBeanList.add(new DemoBean("小红" + i + "号", i));
        }

        //设置数据
        demoAdapter.setBeanList(demoBeanList);

        //单击数据刷新数据
        findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                demoBeanList.clear();
                for (int i = 0; i < 200; i++) {
                    demoBeanList.add(new DemoBean("大红" + i + "号", i));
                }
                //设置数据
                demoAdapter.setBeanList(demoBeanList);
            }
        });


    }
}

提示:

根据具体需求选好适合你的适配器构造方法如这样:

public class DemoAdapter extends GT.GT_Adapters.BaseAdapter<DemoBean> {

    //下面你适合那种构造方法那就用那种即可
    public DemoAdapter(Context context, RecyclerView rv, List<DemoBean> beanList, int layout_V_OR_H, int layout) {
        super(context, rv, beanList, layout_V_OR_H, layout);
    }

    @Override
    protected void initView(View itemView, int position, DemoBean demoBean) {
        super.initView(itemView, position, demoBean);
        //初始化View
        TextView tv_name = itemView.findViewById(R.id.tv_name);
        TextView tv_age = itemView.findViewById(R.id.tv_age);

        tv_name.setText(demoBean.getName());
        tv_age.setText(String.valueOf(demoBean.getAge()));

    }

    @Override
    protected void loadData(View itemView, int position, DemoBean demoBean) {
        super.loadData(itemView, position, demoBean);
        //其他事件等业务逻辑

    }
}

Activity就可以这样写:效果都一样

public class MainActivity extends AppCompatActivity {

    private RecyclerView recyclerView;
    private DemoAdapter demoAdapter;
    private List<DemoBean> demoBeanList = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //实例化 RecyclerView
        recyclerView = findViewById(R.id.recyclerView);

        //模拟数据
        for (int i = 0; i < 100; i++) {
            demoBeanList.add(new DemoBean("小红" + i + "号", i));
        }

        //实例化适配器并设置垂直显示数据
        demoAdapter = new DemoAdapter(this,recyclerView,demoBeanList, LinearLayoutManager.VERTICAL,R.layout.item_demo);

        //单击数据刷新数据
        findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                demoBeanList.clear();
                for (int i = 0; i < 200; i++) {
                    demoBeanList.add(new DemoBean("大红" + i + "号", i));
                }
                //设置数据
                demoAdapter.setBeanList(demoBeanList);
            }
        });

    }
}

此基类适配器除了这种写法还可以使用注解来写适配器,代码量更少,使用与上面一样

//加载布局
@GT.Annotations.GT_AnnotationAdapter(R.layout.item_demo)
public class DemoAdapter extends GT.GT_Adapters.AnnotationAdapter<DemoBean> {

    public DemoAdapter(Context context) {
        super(context);
    }

    @Override
    protected void initView(View itemView, int position, DemoBean demoBean) {
        super.initView(itemView, position, demoBean);
        //初始化View
        TextView tv_name = itemView.findViewById(R.id.tv_name);
        TextView tv_age = itemView.findViewById(R.id.tv_age);
        //设置值
        tv_name.setText(demoBean.getName());
        tv_age.setText(String.valueOf(demoBean.getAge()));
    }

    @Override
    protected void loadData(View itemView, int position, DemoBean demoBean) {
        super.loadData(itemView, position, demoBean);
        //事件其他业务逻辑

    }
}

1、Encryption(推荐指数:✪✪✪)

加密工具包

第一个:MD5加密

 public static String encryptMD5(String origin)

第二个:DES加密

//加密
public static String encryptPassword(Object clearText, Object password)

//解密
public static String decryptPassword(Object encryptedPwd, Object password) 

第三个:Base64加密

GT.Encryption.Base64

第九章:UI类(推荐章节)

1、ProgressDialogUtils(推荐指数:✪✪✪✪)

加载进度条

第一种:简易进度条 initProgressBarDialog

public class MainActivity extends AppCompatActivity {

    private ProgressDialog progressDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        progressDialog = GT.ProgressDialogUtils.initProgressBarDialog(this, false, "加载中...");

        findViewById(R.id.btn).setOnClickListener(v -> {
            progressDialog.show();//显示

            new Thread(() -> {
                while (progressDialog.getProgress() < progressDialog.getMax()){
                    progressDialog.setProgress(progressDialog.getProgress() + 1);
                    GT.Thread.sleep(20);
                }
                progressDialog.cancel();//取消当前进度条
                //重新创建一个新的进度条(演示用的)
                MainActivity.this.runOnUiThread(() -> progressDialog = GT.ProgressDialogUtils.initProgressBarDialog(MainActivity.this, false, "加载中..."));

            }).start();
        });


    }
}

效果图:

第二种:简易圆圈加载条 initProgressBarDialog

public class MainActivity extends AppCompatActivity {

    private ProgressDialog progressDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        progressDialog = GT.ProgressDialogUtils.initCircleProgressDialog(this, false, "3秒后自动取消...");

        findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                progressDialog.show();//显示
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                       GT.Thread.sleep(3000);
                        progressDialog.cancel();//取消
                    }
                }).start();
            }
        });
    }
}

效果图:


 

第三种:简易进度条加载条 initProgressBarDialog

public class MainActivity extends AppCompatActivity {

    private ProgressDialog progressDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        progressDialog = GT.ProgressDialogUtils.initProgressBarDialog(this, false, R.mipmap.ic_launcher, "标题", "内容", 250, null);

        findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                progressDialog.show();//显示
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        while (true){
                            if(progressDialog.getProgress() >= progressDialog.getMax()){
                                progressDialog.dismiss();//取消
                                break;
                            }
                            progressDialog.setProgress(progressDialog.getProgress() + 1);
                            GT.Thread.sleep(20);
                        }

                    }
                }).start();
            }
        });


    }
}

效果图:

第四种:简易圆形加载条 initCircleProgressDialog

public class MainActivity extends AppCompatActivity {

    private ProgressDialog progressDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        progressDialog = GT.ProgressDialogUtils.initCircleProgressDialog(this, false, R.mipmap.ic_launcher, "标题", "3秒后关闭", null);

        findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                progressDialog.show();//显示
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                       GT.Thread.sleep(3000);
                        progressDialog.dismiss();//取消
                    }
                }).start();
            }
        });
    }
}

效果图:

2、GT_Animation(推荐指数:✪✪✪✪)

GT动画库,真动画(运动后事件在最终运动处)与假动画(运动后事件在原处)

 效果图:

实现的主要代码如下:(动画后面加 F 的则表示 该动画 是假的动画 后面为 T 的则表示为 真动画)

public class MainActivity extends AppCompatActivity {

    @GT.Annotations.GT_View(R.id.btn_show)
    private Button btn_show;

   
    private GT.GT_Animation gt_animation;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        GT.build(this);//绑定 Activity

        gt_animation = new GT.GT_Animation();

    }

    @GT.Annotations.GT_Click({R.id.btnF_translate, R.id.btnF_scales, R.id.btnF_rotate, R.id.btnF_alpha, R.id.btnT_translate, R.id.btnT_scales, R.id.btnT_rotate, R.id.btnT_alpha, R.id.btn_show})
    public void onBtnClick(View view) {
        switch (view.getId()) {

            /**
             * 假动画
             */

            case R.id.btnF_translate:
                gt_animation.translate_F(0, 200, 0, 200, 2000, true, 0, true, btn_show);
                break;

            case R.id.btnF_scales:
                gt_animation.scale_F(1, 2, 1, 2, 2000, true, 0, true, btn_show);
                break;

            case R.id.btnF_rotate:
                gt_animation.rotate_F(0, 360, 2000, true, 0, true, btn_show);
                break;

            case R.id.btnF_alpha:
                gt_animation.alpha_F(1, 0.3f, 2000, true, 0, true, btn_show);
                break;

            /**
             * 真动画
             */

            case R.id.btnT_translate:
                gt_animation.translate_T(0, 200, 0, 200, 2000, 0, true, btn_show);
                break;

            case R.id.btnT_scales:
                gt_animation.scale_T(1, 3, 1, 3, 2000, 0, true, btn_show);
                break;

            case R.id.btnT_rotate:
                gt_animation.rotatesY_T(0, 360, 3000, 0, true, btn_show);
                break;

            case R.id.btnT_alpha:
                gt_animation.alpha_T(1, 0, 2000, 0, true, btn_show);
                break;
            case R.id.btn_show:
                GT.toast_s("触发点击事件");
                break;
        }
    }

}

XML代码如下:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btn_show"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        android:textSize="18sp"
        android:background="#03A9F4"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintHorizontal_bias="0.06"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.023" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintBottom_toBottomOf="parent"
        >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            >
            <Button
                android:id="@+id/btnF_translate"
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="wrap_content"
                android:text="假平移"
                />

            <Button
                android:id="@+id/btnF_scales"
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="wrap_content"
                android:text="假缩放"
                />

            <Button
                android:id="@+id/btnF_rotate"
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="wrap_content"
                android:text="假旋转"
                />
            <Button
                android:id="@+id/btnF_alpha"
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="wrap_content"
                android:text="假透明"
                />
        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            >
            <Button
                android:id="@+id/btnT_translate"
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="wrap_content"
                android:text="真平移"
                />

            <Button
                android:id="@+id/btnT_scales"
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="wrap_content"
                android:text="真缩放"
                />

            <Button
                android:id="@+id/btnT_rotate"
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="wrap_content"
                android:text="真旋转"
                />
            <Button
                android:id="@+id/btnT_alpha"
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="wrap_content"
                android:text="真透明"
                />
        </LinearLayout>

    </LinearLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

总结:简单的封装,支持单个 和 多结合动画播放,不懂参数的可以直接点进源码看中文注释。

本篇源码网址:https://github.com/1079374315/GT_Animator

源码非常容易看懂不信你瞧:

3、WindowUtils(推荐指数:✪✪✪✪)

WindowUtils 窗体类,封装了APP窗口类工具

方法介绍:(下面的方法在后面迭代中可能存在更新,具体请参考源码方法)

//开启游戏窗口
public static void startGameWindow(Activity activity)
//屏幕常亮
public static void light(Activity activity)
//设置全屏模式
public static void fullScreen(Activity activity)
//关闭虚拟按键
public static void Close_virtualButton(Activity activity)
//获取屏幕 宽度
public static int getWindowUtilsWidth(AppCompatActivity appCompatActivity)
//获取屏幕 高度
public static int getWindowUtilsHeight(AppCompatActivity appCompatActivity)
//隐藏状态栏
public static void hideStatusBar(AppCompatActivity activity)
//隐藏ActionBar
public static void hideActionBar(AppCompatActivity activity)
//隐藏导航栏
public static void hideNavigationBar(Activity activity)
//透明状态栏
public static void lucencyStatusBar(Activity activity)
//透明导航栏
public static void lucencyNavigationBar(Activity activity)
//沉浸式模式 (隐藏状态栏,去掉ActionBar,隐藏导航栏)
public static void immersionMode(Activity activity)
//返回当前是 横屏 还是 竖屏
public static boolean isLandscapeAndPortrait(Activity activity)
//0-6 的 值来进行强制的 横竖屏、自适应等 执行强制的 横屏 或 竖屏
public static void AutoLandscapeAndPortrait(Activity activity, int one_three)


4、ViewUtils(推荐指数:✪✪✪✪)

自定义View工具集合,可直接添加到xml 布局文件中

自定义View介绍:

//跑马灯
public static class MarqueeTextView extends TextView

//遥感组件
public static class RockerView extends View

//流动布局
public static class FlowLayout extends ViewGroup

//嵌套滑动
public class NestScrollView extends ScrollView

//延迟触发(如:EditText输入完后再触发,完美解决!)
public static class DelayTrigger

//圆角动态图 组件
public static class GTImageView extends AppCompatImageView

遥感组件我们单独介绍,其余的直接写到 xml 即可

遥感组件:

效果图:

第一步:写入 xml 布局中

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        android:textSize="24sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        />

    <view
        android:id="@+id/rv"
        class="com.gsls.gt.GT$Game$RockerView"
        android:layout_width="200dp"
        android:layout_height="200dp"
        app:rockerBackground="#FF9800"
        app:rockerRadius="50dp"
        app:areaBackground="#2196F3"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintHorizontal_bias="0.54"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.934" />

</androidx.constraintlayout.widget.ConstraintLayout>

第二步: 获取组件进行监听

@GT.Annotations.GT_Activity(R.layout.activity_main)
public class MainActivity extends GT.AnnotationActivity {

    @GT.Annotations.GT_View(R.id.tv)
    private TextView tv;

    @GT.Annotations.GT_View(R.id.rv)
    GT.Game.RockerView rv;

    @Override
    protected void initView(Bundle savedInstanceState) {
        build(this);//绑定 Activity

        rv.setCallBackMode(GT.Game.RockerView.CallBackMode.CALL_BACK_MODE_MOVE);//设置回调方式为 状态有变化的时候回调
        rv.setOnShakeListener(GT.Game.RockerView.DirectionMode.DIRECTION_8, new GT.Game.RockerView.OnShakeListener() {
            @Override
            public void onStart() {
                tv.setText("开始");
            }

            @Override
            public void direction(GT.Game.RockerView.Direction direction) {
                String direction1 = getDirection(direction);//获取方向
                tv.setText(direction1);//设置遥感转动的方向
            }

            @Override
            public void onFinish() {
                tv.setText("结束");
            }
        });

    }

    //返回字符串方向
    private String getDirection(GT.Game.RockerView.Direction direction) {
        String message = null;
        switch (direction) {
            case DIRECTION_LEFT:
                message = "左";
                break;
            case DIRECTION_RIGHT:
                message = "右";
                break;
            case DIRECTION_UP:
                message = "上";
                break;
            case DIRECTION_DOWN:
                message = "下";
                break;
            case DIRECTION_UP_LEFT:
                message = "左上";
                break;
            case DIRECTION_UP_RIGHT:
                message = "右上";
                break;
            case DIRECTION_DOWN_LEFT:
                message = "左下";
                break;
            case DIRECTION_DOWN_RIGHT:
                message = "右下";
                break;
            default:
                break;
        }
        return message;
    }

}

一些常用的参数:

app:rockerBackground="#FF9800"    //设置中心圆的颜色
app:rockerRadius="50dp"           //设置中心圆的半径
app:areaBackground="#2196F3"      //设置背景圆的颜色

总结:实现起来非常简单,这就是GT库的初衷。感谢您的关注。

5、GT_Activity(推荐指数:✪✪✪✪✪✪)

封装 Activity 管理器

第一种:BaseActivity 基类Activity

public class MainActivity extends GT.GT_Activity.BaseActivity {

    @Override
    protected int loadLayout() {
        return R.layout.activity_main;//加载布局
    }

    @Override
    protected void initView(Bundle savedInstanceState) {
        //初始化 View
    }

    @Override
    protected void loadData() {
        super.loadData();
        //其他业务逻辑

    }

}

第二种:AnnotationActivity  注解 Activity

@GT.Annotations.GT_AnnotationActivity(R.layout.activity_main)//加载布局
public class MainActivity extends GT.GT_Activity.AnnotationActivity {

    @Override
    protected void initView(Bundle savedInstanceState) {
        super.initView(savedInstanceState);
        //初始化 View
    }

    @Override
    protected void loadData() {
        super.loadData();
        //其他业务逻辑

    }

}

总结:就是这么简单,关于GT的注解篇均是属于 GT库高级教程,继承 GT注解Activity后将会解锁超级多的特色GT功能。关于这些特色功能会放在其他文章详细讲解!

6、GT_Fragment(推荐指数:✪✪✪✪✪✪)

封装 Fragment 管理器

第一种:BaseFragments 基类Fragment

//创建一个简易的Fragment
public class DemoFragment extends GT.GT_Fragment.BaseFragments{

    @Override
    protected int loadLayout() {
        return R.layout.item_demo;//加载布局
    }

    @Override
    protected void initView(View view, @Nullable Bundle savedInstanceState) {
        //初始化View
    }


    @Override
    protected void loadData() {
        super.loadData();
        //处理其他业务逻辑
    }
}

第二种:AnnotationFragment 基类Fragment

@GT.Annotations.GT_AnnotationFragment(R.layout.item_demo)
public class DemoFragment extends GT.GT_Fragment.AnnotationFragment {

    @Override
    protected void initView(View view, Bundle savedInstanceState) {
        super.initView(view, savedInstanceState);
        //初始化 View
    }

    @Override
    protected void loadData() {
        super.loadData();
        //处理其他业务逻辑
    }
}

xml布局:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#00FF0000"
    android:orientation="horizontal">

    <View
        android:id="@+id/view_bg"
        android:layout_width="400dp"
        android:layout_height="250dp"
        android:background="#ADFFEB3B"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/tv_title"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:background="#C403A9F4"
        android:gravity="center"
        android:text="标题"
        android:textColor="#FFFFFF"
        android:textSize="22sp"
        app:layout_constraintEnd_toEndOf="@+id/view_bg"
        app:layout_constraintStart_toStartOf="@id/view_bg"
        app:layout_constraintTop_toTopOf="@+id/view_bg" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingStart="10dp"
        android:paddingEnd="10dp"
        android:text="X"
        android:textColor="#FFFFFF"
        android:textSize="22sp"
        app:layout_constraintEnd_toEndOf="@+id/tv_title"
        app:layout_constraintTop_toTopOf="@+id/tv_title" />


</androidx.constraintlayout.widget.ConstraintLayout>

总结:就是这么简单,关于GT的注解篇均是属于 GT库高级教程,继承 GT注解Fragment后将会解锁超级多的特色GT功能。关于这些特色功能会放在其他文章详细讲解!

GT_Fragment 详细教程:

Android——多Fragment 超简单使用_PlayfulKing的博客-CSDN博客_android 多fragmentGT 第十五章: Fragment 框架GT 最新版发布:https://blog.csdn.net/qq_39799899/article/details/98891256如果不想依赖库 想手写 的同学可以去 GT 最新版发布 下载源码 进行学习。美帝 框架,让切换变得如此简单!先看看效果图: 《少量 Activity 对应 多个 Frage......https://blog.csdn.net/qq_39799899/article/details/99062031?spm=1001.2014.3001.5501

7、GT_Dialog(推荐指数:✪✪✪✪✪)

对话框封装类 管理器

第一种:BaseDialogFragment  基类Dialog

public class DemoDialogFragment extends GT.GT_Dialog.BaseDialogFragment {

    @Override
    protected int loadLayout() {
        return R.layout.item_demo;//加载布局
    }

    @Override
    protected void initView(View view, @Nullable Bundle savedInstanceState) {
        //初始化 View
    }

    @Override
    protected void loadData() {
        super.loadData();
        //处理其他业务逻辑
    }
}

第二种:AnnotationDialogFragment  注解类 Dialog

@GT.Annotations.GT_AnnotationDialogFragment(R.layout.item_demo)
public class DemoDialogFragment extends GT.GT_Dialog.AnnotationDialogFragment {

    @Override
    protected void initView(View view, @Nullable Bundle savedInstanceState) {
        super.initView(view, savedInstanceState);
        //初始化 View
    }

    @Override
    protected void loadData() {
        super.loadData();
        //处理其他业务逻辑
    }
}

item_demo.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#00FF0000"
    android:orientation="horizontal">

    <View
        android:id="@+id/view_bg"
        android:layout_width="200dp"
        android:layout_height="150dp"
        android:background="#ADFFEB3B"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/tv_title"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:background="#C403A9F4"
        android:gravity="center"
        android:text="标题"
        android:textColor="#FFFFFF"
        android:textSize="22sp"
        app:layout_constraintEnd_toEndOf="@+id/view_bg"
        app:layout_constraintStart_toStartOf="@id/view_bg"
        app:layout_constraintTop_toTopOf="@+id/view_bg" />

    <TextView
        android:id="@+id/tv_close"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingStart="10dp"
        android:paddingEnd="10dp"
        android:text="X"
        android:textColor="#FFFFFF"
        android:textSize="22sp"
        app:layout_constraintEnd_toEndOf="@+id/tv_title"
        app:layout_constraintTop_toTopOf="@+id/tv_title" />


</androidx.constraintlayout.widget.ConstraintLayout>

总结:是不是发现一个规律,凡是继承GT库的封装类,使用起来都差不多

:9种简易对话框Dialog

第1种,单按钮对话框:

//一个简易的按钮
                new GT.GT_Dialog.GT_AlertDialog(MainActivity.this)
                        .dialogButton(
                                R.drawable.ic_launcher_background,
                                "我的标题",
                                "我的内容",
                                true,//单击外部影黑区域是否关闭当前对话框
                                "按钮名称",
                                new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialog, int which) {
                                        GT.toast(MainActivity.this, "单击了我");
                                    }
                                }
                        ).show();

效果图:

第2种,双按钮对话框:

 //一个简易的按钮
        new GT.GT_Dialog.GT_AlertDialog(this)
                .dialogTwoButton(
                        R.drawable.ic_launcher_background,
                        "我的标题",
                        "我的内容",
                        false,  //点击外部是否可取消对话框
                        "取消",
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                GT.toast(MainActivity.this, "我是取消按钮");
                            }
                        }, "确定",
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                GT.toast(MainActivity.this, "我是确定按钮");
                            }
                        }
                ).show();

效果图:

 第3种,列表选择-对话框:

public class MainActivity extends AppCompatActivity {

    String[] items = {"1号", "2号", "3号", "4号", "5号"};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //一个简易的按钮
        new GT.GT_Dialog.GT_AlertDialog(this)
                .dialogList(
                        R.drawable.ic_launcher_background,
                        "标题",
                        false,
                        items,
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                GT.toast(MainActivity.this, items[which]);
                            }
                        }
                ).show();
    }
}

效果图:

 第4种,多选-对话框:

public class MainActivity extends AppCompatActivity {

    String[] items = {"1号", "2号", "3号", "4号", "5号"};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //一个简易的按钮
        new GT.GT_Dialog.GT_AlertDialog(this)
                .dialogMultiChoice(
                        R.drawable.ic_launcher_background,
                        "我是标题",
                        false,
                        items,
                        null,
                        "选中它们",
                        new GT.GT_Dialog.GT_AlertDialog.OnGetDataListener() {
                            @Override
                            public void getData(Object data) {
                                GT.log("data" , data);
                                List<String> list = (List<String>) data;
                                GT.log("arraySize:" + list.size());

                                GT.toast(MainActivity.this,"选中了" + list.size() + "条:" + data);

                            }
                        }
                ).show();

    }
}

效果图:

第5种,单选-对话框:

public class MainActivity extends AppCompatActivity {

    String[] items = {"1号", "2号", "3号", "4号", "5号"};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //一个简易的按钮
        new GT.GT_Dialog.GT_AlertDialog(this)
                .dialogSingleChoiceList(
                        R.drawable.ic_launcher_background,
                        "我的标题",
                        false,
                        items,
                        1,
                        "就它了",
                        new GT.GT_Dialog.GT_AlertDialog.OnGetDataListener() {
                            @Override
                            public void getData(Object data) {
                                GT.toast(MainActivity.this, data);
                            }
                        }
                ).show();

    }
}

效果图:

第6种,输入型-对话框:

 //一个简易的按钮
        new GT.GT_Dialog.GT_AlertDialog(this)
                .inputDialog(
                        R.drawable.ic_launcher_background,
                        "我是标题",
                        "我是内容",
                        false,
                        "确定",
                        new GT.GT_Dialog.GT_AlertDialog.OnGetDataListener() {
                            @Override
                            public void getData(Object data) {
                                GT.toast(MainActivity.this, data);
                            }
                        }
                ).show();

第7种,进度条-对话框:

public class MainActivity extends AppCompatActivity {

    private ProgressDialog progressDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //一个简易的按钮
        progressDialog = new GT.GT_Dialog.GT_AlertDialog(this)
                .progressBarDialog(
                        R.drawable.ic_launcher_background,
                        "更新APP",
                        "准备更新APP",
                        100,    //进度条最大值
                        0,      //当前进度条进度
                        100,    //延时时间
                        true,   //点击外部是否可取消
                        new GT.GT_Dialog.GT_AlertDialog.OnProgressBarListener() {
                            @Override
                            public void startLoad(int progress, int maxValue, int loadingSpeed) {
                                GT.log("开始加载");
                            }
                            @Override
                            public void underwayLoad(int progress) {
                                GT.log("加载中..." + progress);
                                GT.Thread.runAndroid(new Runnable() {//使用 UI 线程更新
                                    @Override
                                    public void run() {
                                        progressDialog.setMessage("当前更新版本:V1.0.0\n\n" +
                                                "更新内容:\n" +
                                                "\t\t1.优化了整体界面\n" +
                                                "\t\t2.本更新对话框仅适合简单版\n" +
                                                "\t\t3.使用起来非常方便\n\n" +
                                                "\t\t当前下载进度:" + progress + "%");
                                    }
                                });
                            }

                            @Override
                            public void closeLoad(long totalElapsedTime) {
                                GT.Thread.runAndroid(new Runnable() {//使用 UI 线程更新
                                    @Override
                                    public void run() {
                                        GT.log("totalElapsedTime:" + totalElapsedTime);
                                        String second = GT.GT_Date.secondsToTime((int) totalElapsedTime / 1000);//将秒转为 可识别时间
                                        GT.toast_time(MainActivity.this, "下载完成,总共耗时:" + second, 6000);
                                        progressDialog.dismiss();//销毁当前对话框,是否销毁可有自己决定
                                    }
                                });
                            }
                        }
                );

        //单击运行
        findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                progressDialog.show();


                //模拟网络下载
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        for (int i = 0; i <= 100; i++) {
                            progressDialog.setProgress(i);
                            GT.Thread.sleep(50);
                        }
                    }
                }).start();

            }
        });

    }
}

效果图:

第8种,加载条-对话框:

public class MainActivity extends AppCompatActivity {

    private ProgressDialog progressDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //一个简易的按钮
        progressDialog = new GT.GT_Dialog.GT_AlertDialog(this)
                .progressDialog(
                        R.drawable.ic_launcher_background,
                        "标题",
                        "内容",
                        false
                );

        findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                progressDialog.show();
                GT.toast(MainActivity.this, "延时3秒后消失");
                new Thread(new Runnable() {
                    @Override
                    public void run() {

                        GT.Thread.sleep(3000);
                        GT.Thread.runAndroid(new Runnable() {
                            @Override
                            public void run() {
                                progressDialog.dismiss();
                            }
                        });
                    }
                }).start();
            }
        });

    }
}

效果图:

第9种,自定义-对话框:

 第一步:添加 自定义的布局文件  dialog_view.xml 代码如下:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <View
        android:id="@+id/view"
        android:layout_width="300dp"
        android:layout_height="200dp"
        android:background="@mipmap/ic_launcher"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#000000"
        android:textSize="24sp"
        android:textStyle="bold"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.3"
        />

    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:layout_marginRight="8dp"
        android:text="按钮"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.519"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.671" />

</androidx.constraintlayout.widget.ConstraintLayout>

再在 res/styles.xml 中添加 去掉 对话框 默认背景的代码:

<!--dialog去阴影-->
    <style name="dialogNoBg">
        <item name="android:background">#00000000</item>
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowIsFloating">true</item>
    </style>

最后在 MainActivity 中去实现 自定义 对话框:

        //自定义 对话框
        GT.GT_AlertDialog.ViewDialog viewDialog = new GT.GT_AlertDialog.ViewDialog()
                .initLayout(this, R.layout.dialog_view, R.style.dialogNoBg);//加载 布局 并 设置样式 
        
        final TextView tv = viewDialog.getView().findViewById(R.id.tv);
        viewDialog.getView().findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                tv.setText("单击了 自定义对话框");
            }
        });
        viewDialog.getDialog().show();

效果图:

如果不满意,你可以试试 调用 这个方法:

/**
             * @param context       上下文
             * @param Style         样式
             * @param clickExternal 外部是否可点击
             * @param layout        布局
             * @param transparency  透明度
             * @param X             显示的 X 轴位置
             * @param Y             显示的 Y 轴位置
             * @return 当前类的对象
             */
            public ViewDialog initLayout(Context context, int layout, int Style, boolean clickExternal, int transparency, int X, int Y) 

还不满意?  小编觉得还可以抢救一下   继承 或 自己 补充 自定义 。

继承:

private class MyDialog extends GT.GT_AlertDialog.ViewDialog{

补充 自定义:

 Dialog dialog = viewDialog.getDialog();

其中还有一个实现 自定义 Dialog 的类 但小编不推荐使用,该类主要用于 自定义 进度条 使用:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        new Myprogress(this).show();

    }
    
    // 自定义 进度条
    private class Myprogress extends GT.GT_AlertDialog.Loading_view{

        public Myprogress(Context context) {
            super(context);
        }

        @Override
        public int initLayout() {
            return R.layout.dialog_view;//返回解析的 布局文件
        }

        @Override
        protected void loadLayout(final Context context) {
            TextView tv = findViewById(R.id.tv);    //获取 tv 组件
            tv.setText("进度条自定义");
            findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    GT.toast_s(context,"单击了 按钮");
                    dismiss();//关闭
                }
            });
        }

    }

}

效果图:

总结:简单使用,可直接复制使用

8、GT_FloatingWindow(推荐指数:✪✪✪✪✪)

Android——超简单悬浮窗使用教程_PlayfulKing的博客-CSDN博客_android 自定义悬浮框完全自定义悬浮窗,保证100%学会的超简单悬浮窗先看看31行代码的效果图:再来看看我无聊制作的悬浮窗:我们来看看这些都是如何实现的第一步:自定义的xml布局 demo_floating_window<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://...https://blog.csdn.net/qq_39799899/article/details/120470961?spm=1001.2014.3001.5501

9、GT_View(新品:推荐指数:✪✪✪✪✪)

GT_View 专门用来解决局部View特别复杂时会让 Avtibity 或 Fragment 变复杂的问题

Android——完全自定义 底部弹出支付页面_PlayfulKing的博客-CSDN博客完全轻松自定义底部弹窗https://blog.csdn.net/qq_39799899/article/details/127268713?spm=1001.2014.3001.5501

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <LinearLayout
        android:id="@+id/ll"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        >

        <TextView
            android:id="@+id/tv"
            android:text="待改变"
            android:textSize="28sp"
            android:layout_width="match_parent"
            android:layout_height="40dp"
            />

        <Button
            android:id="@+id/btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="修改"
            />

    </LinearLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

新建DemoView .java文件

public class DemoView extends GT.GT_View.BaseView {

    public DemoView(View view) {
        super(view);
    }

    private TextView tv;
    private Button btn;

    @Override
    protected void loadLayout(View view) {
        //初始化 View
        tv = view.findViewById(R.id.tv);
        btn = view.findViewById(R.id.btn);

    }

    @Override
    protected void loadData(View view) {
        super.loadData(view);
        //具体业务逻辑
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                tv.setText("成功了!");
            }
        });
    }
}
当然还有注解版的
public class DemoView extends GT.GT_View.AnnotationView {

    public DemoView(View view) {
        super(view);
    }

    @GT.Annotations.GT_View(R.id.tv)
    private TextView tv;
    @GT.Annotations.GT_View(R.id.btn)
    private Button btn;

    @Override
    protected void initView(View view) {
        super.initView(view);
        //具体业务逻辑
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                tv.setText("成功了!");
            }
        });
    }
}
 

主界面:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        new DemoView(findViewById(R.id.ll));//将ll布局中的所有业务逻辑均在 DemoView 中实现

    }
}

总结:继承来自 GT库中的封装类,如 Activity、Fragment、DialogFragment、Floating,GT_View 他们的使用方法都是一致的,学会一个即可触类旁通。

第十章:设备监听类 DeviceListening(推荐指数:✪✪✪)

手机设备的监听

模块介绍:

//获取当前手机信息
MobilePhoneAttribute
    public String getModel()        //获取手机型号
    public String getSDK()          //获取SDK版本
    public String getRELEASE()      //获取手机系统版本号

//安卓手机音量类
GT_AudioManager
    public int getVoiceCall()//获取 通话声音 最大值 与 当前通过的声音值
    public int getVoiceCallMax()//获取 音量操作类对象
    public void setVoiceCallValue(int value)//设置音量大小
    public int getVoiceSystem()//获取当前手机的声音值
    public int getVoiceSystemMax()//获取 系统音量 最大值
    public void setVoiceSystemValue(int value)//设置系统音量值
    public int getVoiceRing()//获取 当前通过的声音值
    public int getVoiceRingMax()//铃声音量 最大值
    public void setVoiceRingValue(int value)//设置 铃声音量 的音量
    public int getVoiceMusic()//获取 当前通过的声音值
    public int getVoiceMusicMax()//获取 音乐音量(多媒体) 最大值
    public void setMusicValue(int value)//设置 多媒体 的音量
    public int getVoiceAlarm()//获取  当前通过的声音值
    public int getVoiceAlarmMax()//获取 提示声音 音量 最大值
    public void setVoiceAlarmValue(int value)//设置 提示声音 的音量
    public void gemgMusiceNoSet()//游戏过程中只允许调整多媒体音量,而不允许调整通话音量。

//监听屏幕状态类
ScreenListener
    /**
             * 监听
             * 手机屏幕点亮
             * 手机屏幕锁屏
             * 手机屏幕解锁
             * <p>
             * 使用实例:
             * GT.ScreenListener screenListener  = new GT.ScreenListener(this); //初始化 ScreenListener
             * screenListener.begin(new GT.ScreenListener.ScreenStateListener(){....} //new 一个匿名内部类 即可
             * 在销毁该 Activity 时一定要 调用该方法来注销广播
             * unregisterListener(); 方法来注销该广播
             */

//监听耳机是否插入
GT_HeadsetPlugReceiver
 /**
             * 监听 耳机
             * <p>
             * 使用实例:
             * GT.GT_HeadsetPlugReceiver gt_headsetPlugReceiver = new GT.GT_HeadsetPlugReceiver(this); //初始化 GT_HeadsetPlugReceiver
             * gt_headsetPlugReceiver.isHeadset_TF();    //获取当前耳机的状态  插入则返回 true 否则返回 false
             * 在销毁该 Activity 时一定要 调用该方法来注销广播
             * unregisterListener(); 方法来注销该广播
             */

//屏幕旋转监听
Spiritleve
    
  /**
             * 用法如下:
             * //屏幕旋转监听 内部类
             * class SV extends SpiritleveView{
             * *
             * public SV(Context context) {
             * super(context);
             * }
             * *
             *
             * @Override protected void getPosition(float xAngle, float yAngle) {
             * super.getPosition(xAngle, yAngle);
             * GT.log("X:" + (int)xAngle + "," + "Y:" + (int)yAngle);
             * }
             * }
             * *
             * 最后再在方法中初始化
             * new SV(activity);
             * *
             */


public class MainActivity extends AppCompatActivity {

    private GT.DeviceListening.GT_HeadsetPlugReceiver gt_headsetPlugReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //获取当前手机信息
        GT.DeviceListening.MobilePhoneAttribute mobilePhoneAttribute = new GT.DeviceListening.MobilePhoneAttribute();
        GT.log_i("获取手机型号:" + mobilePhoneAttribute.getModel());
        GT.log_i("获取手机SDK版本号:" + mobilePhoneAttribute.getSDK());
        GT.log_i("获取手机系统版本号:" + mobilePhoneAttribute.getRELEASE());

        // 手机音量类
        GT.DeviceListening.GT_AudioManager gt_audioManager = new GT.DeviceListening.GT_AudioManager(this);
        GT.log_i("获取 通话声音 最大值 与 当前通过的声音值:" + gt_audioManager.getVoiceCall());
        GT.log_i("获取当前手机的声音值:" + gt_audioManager.getVoiceSystem());
        GT.log_i("获取 系统音量 最大值:" + gt_audioManager.getVoiceSystemMax());
        GT.log_i("获取 当前通过的声音值:" + gt_audioManager.getVoiceRing());
        GT.log_i("铃声音量 最大值:" + gt_audioManager.getVoiceRingMax());
        GT.log_i("获取 当前通过的声音值:" + gt_audioManager.getVoiceMusic());
        GT.log_i("获取 音乐音量(多媒体) 最大值:" + gt_audioManager.getVoiceMusicMax());
        GT.log_i("获取  当前通过的声音值:" + gt_audioManager.getVoiceAlarm());
        GT.log_i("获取 提示声音 音量 最大值:" + gt_audioManager.getVoiceAlarmMax());

        gt_audioManager.gemgMusiceNoSet();//游戏过程中只允许调整多媒体音量,而不允许调整通话音量。

        gt_audioManager.setVoiceCallValue(12);//设置当前手机 音量大小
        gt_audioManager.setVoiceSystemValue(12);//设置系统音量值
        gt_audioManager.setVoiceRingValue(12);//设置 铃声音量 的音量
        gt_audioManager.setMusicValue(12);//设置 多媒体 的音量
        gt_audioManager.setVoiceAlarmValue(12);//设置 提示声音 的音量

        //监听耳机是否插入
        gt_headsetPlugReceiver = new GT.DeviceListening.GT_HeadsetPlugReceiver(this);
        gt_headsetPlugReceiver.registerHeadsetPlugReceiver();//注册  监听耳机  广播

        GT.log_i("监听耳机:" + gt_headsetPlugReceiver.isHeadset_TF());//建议加在 线程中 用于一直监听

        /**
         *  Spiritleve 屏幕旋转监听
         *  有实现的类,看源码调用,如过不会使用,可致电小编,小编给你写详细 dome 
         */


        /**
         * ScreenListener 监听屏幕状态类
         * 有实现的类,看源码调用,如过不会使用,可致电小编,小编给你写详细 dome 
         */
        

    }

    @Override
    protected void onStop() {
        super.onStop();
        gt_headsetPlugReceiver.unregisterListener();//注销  监听耳机  广播
    }
}

第十一章:多媒体类(推荐指数:✪✪✪)

手机设备的音乐、音频,视频等...

 播放音乐:(长的声音)

GT.GT_MediaPlayer mediaPlayer = new GT.GT_MediaPlayer(this);//实例化对象
        mediaPlayer.loadMusic(R.raw.bg_music);  //加载 或 更新 将要播放的 音频, 此方法可用于 更新接下来要播放的音频
        mediaPlayer.play_pause();//暂停 或 播放
        mediaPlayer.stop();//停止播放
        mediaPlayer.close();//释放资源

播放音频(短的声音)

GT.GT_SoundPool gt_soundPool = new GT.GT_SoundPool(this);

        //添加要播放的短音频
        Map<String,Integer> map = new HashMap<>();
        map.put("开门",R.raw.open_door);
        map.put("开枪",R.raw.shoot);
        map.put("开枪2",R.raw.shoot2);

        gt_soundPool.updateMusic("快的射击",R.raw.shoot2);//修改 音频

        gt_soundPool.initMusic(map);//初始化 音频数据
        /**
         * 播放音频
         *
         * @param key   指定播放的音频key
         * @param loop  是否循环 false为不循环, true 为循环
         * @param rate  速率 为正常速率 1  最低为 0.5,最高为 2
         * @return
         */
        gt_soundPool.play("快的射击",false,1);

播放视频:

 /**
   * 使用说明:
   * 第一步:在 xml 中 定义好 SurfaceView 组件
   * 第二步:video = new GT.GT_Video(this,R.raw.lmh,surfaceView);//初始化 GT_Video 视频播放器
   * 第三步:播放 video.play();、暂停 video.pause();、 停止 video.stop();、
   * 释放资源 video.close();
   */

总结:全是用原生写的 不会或不懂的可以致电或查看源码,源码开放。

第十二章:GT注解(推荐指数:✪✪✪✪✪✪)

GT高级使用方法

xml布局:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/tv"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:gravity="center"
        android:text="待设置参数"
        android:textSize="28sp"
        app:layout_constraintBottom_toTopOf="@+id/ll"
        app:layout_constraintTop_toTopOf="parent" />

    <LinearLayout
        android:id="@+id/ll"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintBottom_toBottomOf="parent">

        <Button
            android:id="@+id/btn1"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="按钮1" />

        <Button
            android:id="@+id/btn2"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="按钮2" />

    </LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

GT注解的使用:

public class MainActivity extends AppCompatActivity {

    @GT.Annotations.GT_View(R.id.tv)
    private TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        GT.build(this);//绑定 Activity

        tv.setText("获取成功!");

    }

    @GT.Annotations.GT_Click({R.id.btn1,R.id.btn2})
    public void onClickView(View view){
        switch (view.getId()){
            case R.id.btn1:
                GT.toast(MainActivity.this,"单击按钮1");
                break;
            case R.id.btn2:
                GT.toast(MainActivity.this,"单击按钮2");
                break;
        }
    }

}

总结:将 findViewById 简化到注解上,若果是继承来着GT库里的封装类,那么将不需要再写绑定语句,可直接使用GT注解

其他用法如下:

 使用 GT 注解来开发一个 多个 Fragment 之间切换的小实例

效果图:

               

《少量 Activity 对应 多个 Fragemnt》                     《单 Activity 对应 多个 Fragemnt》

代码详情请传送到:Android——多Fragment 超简单使用_android 多个fragment_PlayfulKing的博客-CSDN博客

总结:只用注解只要添加 绑定操作 就可以了,如:绑定 Activity 或 绑定 Fragment 即可在 Activity 与 Fragment 内使用注解,如果 GT注解 配合 GT 注解基类 那你的代码将会得到不一样的变化。

https://blog.csdn.net/qq_39799899/article/details/127268713?spm=1001.2014.3001.5501icon-default.png?t=N7T8https://blog.csdn.net/qq_39799899/article/details/127268713?spm=1001.2014.3001.5501

第十三章:GT线程(推荐指数:✪✪✪✪✪)

异步线程框架:

Android——GT.Observable 异步框架教程_PlayfulKing的博客-CSDN博客_android 异步框架前言该框架主要解决切换异步线程的问题,当然在前不久博主发布的 GT.EventBus 框架 也能实现切换异步线程,但和 GT.Observable 使用的场景均有所不同,相信在某些场景下,你会更喜欢这个异步切换.提示:GT.EventBus 与 GT.Observable 可以配合着使用会更香这次框架与RxJava 的异步切换线程有相似之处,也是使用链式结构.接下来我们就来看看具体的使用假如需要从数据库读取数据后显示在屏幕上,最平常的实现咋实现呢?.........https://blog.csdn.net/qq_39799899/article/details/123982353?spm=1001.2014.3001.5501

 主线程操作:

GT.Thread.runAndroid(new Runnable() {
            @Override
            public void run() {
                //UI线程操作
            }
        });
GT.Thread.runAndroid(new Runnable() {
            @Override
            public void run() {
                //UI线程操作
            }
        },5000);//延时5秒后再运行该线程
 GT.Thread.runAndroid(view, new Runnable() {
            @Override
            public void run() {
                //UI线程操作
            }
        });
GT.Thread.runAndroid(activity, new Runnable() {
            @Override
            public void run() {
                //UI线程操作
            }
        });

简易使用线程池(推荐):

 /**
         * 0:此线程池中可创建无线个线程,且重复利用空闲线程
         * 10:此线程池中最多只能同时创建 10 个线程 (大于0的都算按照线程池创建最大数算)
         */
        GT.Thread.getInstance(0).execute(new Runnable() {
            @Override
            public void run() {

                //线程池

            }
        });

        //获取一个崭新的线程池
        ExecutorService instance = GT.Thread.getInstance(10, true);
        instance.execute(new Runnable() {
            @Override
            public void run() {

            }
        });

子线程操作:

GT.Thread.runJava(new Runnable() {
            @Override
            public void run() {
                //子线程操作
            }
        });

延时:

public static void sleep(long millis)

线程池:

GT.Thread.getInstance(0).execute(new Runnable() {
            @Override
            public void run() {
                //逻辑操作
            }
        });
/**
         * 循环 计时器
         *
         * @param delay     多少秒过后进行 开始计时器
         * @param period    每隔多少毫秒进行一次计时
         * @param timerTask 匿名类 new TimerTask 即可 然后在 run 方法中写耗时操作
         * @return
         */
        public static Timer Timer(long delay, long period, TimerTask timerTask)

/**
         * 简易 循环计时器
         *
         * @param timerTask
         * @return
         */
        public static Timer Timer(TimerTask timerTask)

/**
         * Timer 整体封装
         */
        public static class GT_Timer {

 /**
         * AsyncTask 封装
         *
         * @param gtAsyncTask
         * @return
         */
        public static GTAsyncTask asyncTask(GTAsyncTask gtAsyncTask)

/**
         * 自动开启的 AsyncTask 封装
         *
         * @param start
         * @param gtAsyncTask
         * @return
         */
        public static GTAsyncTask asyncTask(boolean start, GTAsyncTask gtAsyncTask)

 /**
         * AsyncTask 整体封装
         */
        public static class AsyncTask

 /**
         * 定义继承后要实现的类
         */
        public abstract static class GTAsyncTask extends android.os.AsyncTask<Object, Object, Object> 

第十四章:动态权限授权类(新品-推荐指数:✪✪✪✪✪)

超级简单且轻量级的动态授权框架

使用介绍:

 //权限动态申请
        GT.AppAuthorityManagement.Permission.init(this,new String[]{

        }).permissions(new GT.AppAuthorityManagement.Permission.OnPermissionListener() {
            @Override
            public void onExplainRequestReason(GT.AppAuthorityManagement.Permission.PermissionDescription onPDListener) {
                onPDListener.setAcceptAdvice(false);//核心,设置拒绝授权
                //onPDListener.setAcceptAdvice(true);//核心,设置同意授权
            }

            @Override
            public boolean onForwardToSettings() {
                //特殊权限特殊处理,如:需要进入 系统设置 中或 应用信息中的代码可自定义填写
                return true;//默认是false 一定有改过来设置为 true
            }

            @Override
            public void request(boolean allGranted, String[] grantedList, String[] deniedList, String message) {
                GT.logt("allGranted:" + allGranted);
                GT.log("message", message);
                if (allGranted) {
                    //全部授权
                    GT.log("全部授权");

                    
                } else {
                    //未全部授权
                    GT.log("grantedList:" + grantedList.length);
                    GT.log("deniedList:" + deniedList.length);
                }
            }
        });

实践使用:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                //权限动态申请
                 GT.AppAuthorityManagement.Permission.init(this,new String[]{
                        Manifest.permission.READ_EXTERNAL_STORAGE,
                        Manifest.permission.WRITE_EXTERNAL_STORAGE,
                        Manifest.permission.CALL_PHONE
        }).permissions(new GT.AppAuthorityManagement.Permission.OnPermissionListener() {
            @Override
            public void onExplainRequestReason(GT.AppAuthorityManagement.Permission.PermissionDescription onPDListener) {
                new GT.GT_Dialog.GT_AlertDialog(MainActivity.this).dialogTwoButton(
                        R.drawable.ic_launcher_background,
                        "授予权限",
                        "为了更好的让应用程序服务您,\n" +
                                "请授予以下权限:\n" +
                                "1.电话权限\n" +
                                "2.读写权限\n",
                        false,
                        "拒绝授权", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                GT.log("拒绝");
                                onPDListener.setAcceptAdvice(false);//核心,设置拒绝授权
                            }
                        },
                        "同意授权", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                GT.log("同意");
                                onPDListener.setAcceptAdvice(true);//核心,设置同意授权
                            }
                        }
                ).show();
            }

            @Override
            public boolean onForwardToSettings() {
                return true;
            }

            @Override
            public void request(boolean allGranted, String[] grantedList, String[] deniedList, String message) {
                GT.logt("allGranted:" + allGranted);
                GT.log("message", message);
                if (allGranted) {
                    //全部授权
                    GT.log("全部授权");

                    Settings.System.putInt(getContentResolver(),Settings.System.ACCELEROMETER_ROTATION, 0);//关闭重力感应
                } else {
                    //未全部授权
                    GT.log("grantedList:" + grantedList.length);
                    GT.log("deniedList:" + deniedList.length);
                }
            }
        });

            }
        });

    }
}

效果图:

第十五章:GT 黑科技(新品-推荐指数:✪✪✪✪✪)

第一个:超简单无障碍服务

效果图:

实现步骤非常简单:

第一步:创建无障碍服务类 继承 GT库中的 AccessibilityServiceBase基类

public class DemoServer extends GT.DarknessMagic.AccessibilityServiceBase{

    @Override
    protected void initView(int action, String packageName, AccessibilityNodeInfo rootInfo, AccessibilityEvent event) {
        GT.log("packageName:" + packageName);//当前操作日志
    }

    @Override
    protected void loadData(int action, String packageName, AccessibilityNodeInfo rootInfo, AccessibilityEvent event, String run_Activity) {
        super.loadData(action, packageName, rootInfo, event, run_Activity);

    }
}

第二步:在 AndroidManifest.xml 中静态注册新创建的服务类

 <application
        ....


     <!-- 无障碍服务 -->
        <service
            android:name=".DemoServer"
            android:enabled="true"
            android:exported="true"
            android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
            <intent-filter>
                <action android:name="android.accessibilityservice.AccessibilityService" />
            </intent-filter>
            <meta-data
                android:name="android.accessibilityservice"
                android:resource="@xml/accessible_service_describe" />
        </service>



</>

注意:这里面的@xml/accessible_service_describe 文件如果你不自定义那就默认使用GT库给予的说明文件

第三步:

            
//申请使用无障碍服务
                if (!DemoServer.isStart()) {
                    try {
                        startActivity(new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS));
                    } catch (Exception e) {
                        startActivity(new Intent(Settings.ACTION_SETTINGS));
                        e.printStackTrace();
                    }
                }

总结:超级简单的实现了,配置文件都asd 可以直接省了,使用GT库默认给予的配置文件就行,默认监听所有APP,如果想自定义,直接打开GT默认的配置文件拷贝一份,自定义即可,里面也有非常详细的配置文件说明


 

总结:简单方便的使用,就是GT库所诞生的初衷。给个关注呗,今后会诞生更多的黑科技

  • 9
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 16
    评论
GT-Power 是一款用于内燃机系统模拟和分析的软件工具。它被广泛应用于汽车、摩托车、卡车和发动机制造业,以支持设计师和工程师进行性能评估、燃料效率分析以及排放和系统优化等方面的工作。 GT-Power 提供了一个直观易用的界面,使用户能够快速建立和配置内燃机模型。其先进的模型包含各种不同类型的发动机和车辆元件,例如气缸、汽缸盖、气门、活塞等,这些元件可以根据用户的需求进行自定义和连接。用户只需通过简单的拖拽和放置操作即可创建一个完整的模型。 在模拟过程中,GT-Power 能够准确地考虑各种因素,如燃烧室压力、燃烧过程、热交换、供油系统和排气系统等。通过这些分析,用户可以了解到内燃机在不同工况下的性能表现,包括功率输出、燃油消耗、排放物生成等。同时,GT-Power 还能够模拟和预测各种不同的控制策略对性能的影响,如喷油时机、进气和排气门的开启时间等。 另外,GT-Power 还具备强大的数据分析和可视化功能。用户可以自定义指标和图表来展示模拟结果,从而更好地理解和解释内燃机的行为。此外,GT-Power 还支持导出数据和结果,以便用户与其他工程师和团队进行共享和讨论。 总的来说,GT-Power 是一款功能强大而且易于使用的软件工具,它为内燃机系统的建模和分析提供了全面的支持。通过使用 GT-Power,用户可以更好地了解和优化内燃机的性能,从而实现更高效、更环保的车辆和发动机设计。

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PlayfulKing

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

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值