让你在开发中爱不释手的 GT 包。关注GSLS官网,查看更多源码 ヾ(✿゚▽゚)ノ工具包。
所有文章 小编尽量让读者可以 直接 读懂 与 完全 复制粘贴,其中复杂或较多 的源码 会有 源码 并 贴上 github 网址。
GT库技术共享讨论群[QQ:814506562]
为了方便GT库友们:(创群日期:2023.10.23)
一起交流,一起贡献开源技术
希望在库友们的共同的努力下,
将我们开源GT库建设的越好用、越稳定。
致谢语:
非常感谢一路以来支持GT库的伙伴们,
因为GT库覆盖的技术方便太广涉及代码量太多,一人之力难以全面维护好,
所以在此创建 GT库官方群1 集齐GT友集体智慧,将库建设成为更好更全更稳定的库。
贡献名单:(贡献多者麻烦找我要个管理位,对GT库有疑惑的请发群里或请联系管理大大)
GT 类 里面的源码完全开源,较多的中文注释,让更多的人直接读懂。
点个关注点个赞呗(〃'▽'〃),关注博主最新发布库:https://github.com/1079374315/GT
让创造变得如此简单!
GT库特点:减少代码量、方便快捷、用于记录、
内部总代码量特别多,但每个功能区的代码均可以拷贝出去新建文件单独使用。
以下编辑有13万字,前方高能,因为有许多功能知识量特别多故不在此篇文章做详细介绍但会在其专属文章进行详细介绍。
有什么好的建议可在次评论去留言
更新时间:2023 年 6 月 3 日
使用GT库里的,当然需要先依赖好GT库啦:
目录
第一步:将以下存储库将其添加到根构建中。存储库末尾的 build.gradle(Project:******)
第二步:添加依赖关系 build.gradle(Module:app)
1、DataSendReception(新品-推荐指数:✪✪✪✪✪)
9、SerialPortUtils(新品:推荐指数:✪✪✪✪✪)
3、HttpUtil 与 HttpCall 网络请求框架(推荐指数:✪✪✪✪✪)
针对与 RecyclerView.Adapter 进行封装本节将用 RecyclerView来示范
1、ProgressDialogUtils(推荐指数:✪✪✪✪)
第一种:简易进度条 initProgressBarDialog
第二种:简易圆圈加载条 initProgressBarDialog
第三种:简易进度条加载条 initProgressBarDialog
第四种:简易圆形加载条 initCircleProgressDialog
GT动画库,真动画(运动后事件在最终运动处)与假动画(运动后事件在原处)
第二种:AnnotationActivity 注解 Activity
第二种:AnnotationFragment 基类Fragment
第一种:BaseDialogFragment 基类Dialog
第二种:AnnotationDialogFragment 注解类 Dialog
8、GT_FloatingWindow(推荐指数:✪✪✪✪✪)
Android——超简单悬浮窗使用教程_PlayfulKing的博客-CSDN博客_android 自定义悬浮框完全自定义悬浮窗,保证100%学会的超简单悬浮窗先看看31行代码的效果图:再来看看我无聊制作的悬浮窗:我们来看看这些都是如何实现的第一步:自定义的xml布局 demo_floating_window9、GT_View(新品:推荐指数:✪✪✪✪✪)
GT_View 专门用来解决局部View特别复杂时会让 Avtibity 或 Fragment 变复杂的问题
第十章:设备监听类 DeviceListening(推荐指数:✪✪✪)
总结:简单方便的使用,就是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(推荐指数:✪✪✪)
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有兴趣的点击这里有更加详细的教程,后面更新的方向会向数据库数据加密方向进行。
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 网络请求框架(推荐指数:✪✪✪✪✪)
网络请求框架
总结:这两种新的网络请求框架,有简易版与接口版,伙伴们可以按照自己框架或者自己需求来定。
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 * * &lt;p&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 热修复https://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 详细教程:
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 变复杂的问题
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 注解基类 那你的代码将会得到不一样的变化。
第十三章:GT线程(推荐指数:✪✪✪✪✪)
异步线程框架:
主线程操作:
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[]{
android.Manifest.permission.READ_EXTERNAL_STORAGE,
android.Manifest.permission.WRITE_EXTERNAL_STORAGE,
android.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("全部授权");
} 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默认的配置文件拷贝一份,自定义即可,里面也有非常详细的配置文件说明