文章介绍:
让你在开发中爱不释手的 GT 包。关注GSLS官网,查看更多源码 ヾ(✿゚▽゚)ノ工具包。
所有文章 小编尽量让读者可以 直接 读懂 与 完全 复制粘贴,其中复杂或较多 的源码 会有 源码 并 贴上 github 网址。
GT 类 里面的源码完全开源,较多的中文注释,让更多的人直接读懂。
点个关注点个赞呗(〃'▽'〃),关注博主最新发布库:https://github.com/1079374315/GT
美帝 框架,让创造变得如此简单!
更新时间:2020 年 1 月 7 日
目录
GT 第四章:Notification 通知类 (适配 Android 9.0)
GT 第九章: 网络请求OkGo/OkHttp3 + JSON
GT 第十六章: DeviceListening 设备监听类
GT 第十九章: BaseActivity,AnnotationActivity类的继承:
GT 前 言:依赖教程
现在的 Android开发中 几乎离不开 依赖包,别人写好的优秀组件,我们可以直接拿来用,用法也简单,这样大大提高了我们开发Android的效率,有些还在学校的学生如果没有接触过依赖包,我就在这里简单讲一下。
第一步:将以下存储库将其添加到根构建中。存储库末尾的gradle
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
第二步:添加依赖关系
(注意:当前演示的版本号是1.0.2版本,今后会有新的版本发布,欢迎使用最新版)
dependencies {
implementation 'com.github.1079374315:GT:v1.0.2'
}
最后再进行同步一下 Sync New,在此期间记得打开网络,需要联网。
GT 第一章:Log 多类型 打印
新建一个空的项目,在项目中的 MainActivity 中添加一下代码:
【注意:GT库需达到1.0.2版本】
/** log 日志 命脉 */
//GT.getGT().setLogTf(true);//默认值为 true 如果设置为 false 则所有非 GT 内部发出的 log 都不会打印
/** 经典log */
GT.log_d(getClass().getName() + ": 经典的 log");
/** 打印 log e int类型 日志 */
GT.log_e(1079);
/** 打印 log i boolean类型 日志 */
GT.log_i(true);
/** 打印 较多数据的 log 日志 */
GT.log_e("我的较多数据 日志 ","Licensed under the Apache License, Version 1.0.2 (the \"License\");\n" +
"you may not use this file except in compliance with the License.\n" +
"You may obtain a copy of the License at");
/** 打印 一个对象 */
GT.log_i(new Fragment());
我们在 Verbose 的右侧窗口进行日志筛选,再来 看看打印的结果:
我们试试将 log 筛选 调节的更严一些:
总结:让你的 log 随心所欲 ,写更少的代码 打更酷的 log 。
GT 第二章:Toast 家族
新建一个空的项目,在项目中的 MainActivity 中添加一下代码:
【注意:GT库需达到1.0.2版本】
// Toast 提示 命脉
// GT.getGT().setToastTf(false);//默认为 true 如果设置为 false 则所有非 GT 内部发出的 Toast 都会不显示
//最不打眼的 Toast
GT.toast_s(this,"普通 Toast ");
//自定义时间的 Toast
GT.toast_time(this,"自定义时间的 Toast", 4000);
运行效果图:
当然我们还有 简便式 Toast 添加以下代码:
// Toast 提示 命脉
// GT.getGT().setToastTf(false);//默认为 true 如果设置为 false 则所有非 GT 内部发出的 Toast 都会不显示
//初始化上下文
GT.getGT().setCONTEXT(this);//当你初始化这家伙 就可以对 Toast 随心所以了
GT.toast_s("简便式 Toast ");
GT.toast_time("简便 + 自定义时间",5000);
我们给 Toast 穿上衣服试试:
1:创建 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>
2.自定义 Toast 的代码:
//初始化 Toast 的 布局(R.layout.toast_view) 并 设置 居中 (Gravity.CENTER)
GT.ToastView toastView = new GT.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” 你可以去试试。
GT 第三章:AlertDialog 的故事
新建一个空的项目,在项目中的 MainActivity 中添加一下代码:
【注意:GT库需达到1.0.2版本】
//带有按钮的 对话框
new GT.GT_AlertDialog(this).dialogButton(R.mipmap.ic_launcher, "标题", "我的内容", "好的", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
GT.toast_s(MainActivity.this,"单击了好的");
}
}).show();
效果图:
新建一个空的项目,在项目中的 MainActivity 中添加一下代码:
final String[] items = {"1 号","2 号","3 号","4 号","5 号"};
//带有列表的 对话框
new GT.GT_AlertDialog(this).dialogList(R.mipmap.ic_launcher, "标题", items, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
GT.toast_s(MainActivity.this,"单击了 " + items[i]);
}
}).show();
效果图:
新建一个空的项目,在项目中的 MainActivity 中添加一下代码:
final String[] items = {"1 号","2 号","3 号","4 号","5 号"};
//带有多选项的 对话框
new GT.GT_AlertDialog(this).dialogMultiChoice(R.mipmap.ic_launcher, "标题", items, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i, boolean b) {
GT.toast_s(MainActivity.this,"你选中了 " + items[i] + " = " + b);
}
}).show();
效果图:
新建一个空的项目,在项目中的 MainActivity 中添加一下代码:
final String[] items = {"1 号","2 号","3 号","4 号","5 号"};
//带有多选项的 对话框
new GT.GT_AlertDialog(this).dialogSingleChoiceList(R.mipmap.ic_launcher, "标题", items, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
GT.toast_s(MainActivity.this,"选择了:" + items[i]);
}
}).show();
效果图:
当然我们还有 自定义 AlertDialog 的 方法支持:
第一步:添加 自定义的布局文件 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();//关闭
}
});
}
}
}
效果图:
总结:写更少代码,做更多功能。小帅哥们,快来玩呀。
GT 第四章:Notification 通知类 (适配 Android 9.0)
新建一个空的项目,在项目中的 MainActivity 中添加一下代码:
【注意:GT库需达到1.0.2版本】
new GT.GT_Notification(this)
.setNotifyId(0x1)
.setChanelId(getClass().getName())
.setChanelDescription("GT通知")
.setChanelName("GT 名字")
/**
* 初始化 通知类
*
* @param icon 图标
* @param title 标题
* @param text 内容
* @param time 设置发送通知的时间
* @param voiceTF 是否设置声音振动
* @param autoCancel 设置通知打开后自动消失
* @param cla 设置单击后跳转的 页面
* @return 返回 通知类
*/
.sendingNotice(R.drawable.ic_launcher_background,"标题","我的通知内容",0,true,true,MainActivity.class);
效果图:
总结:你问我自定义的呢, 自定义 通知? 下一个版本更新加上去,小编写过一个类似酷狗音乐通知栏的dome 如果你需要源码的话,请向我致电!!!(在评论中留言)
GT 第五章:GT 中 一些不为人知的骚操作
新建二个空的项目,在项目中的 MainActivity 中添加一下代码:
【注意:GT库需达到1.0.2版本】
//初始化 上下文
GT.getGT().setCONTEXT(this);
findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//跳转页面 第一式 不需要 初始化 上下文
// GT.startAct(new Intent(MainActivity.this,Main2Activity.class));
//跳转页面 第二式 不需要 初始化 上下文
// GT.startAct(MainActivity.this,Main2Activity.class);
//跳转页面 第三式 需要 初始化 上下文
GT.startAct(Main2Activity.class);
}
});
对应的 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">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="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_constraintHorizontal_bias="0.498"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.658" />
</androidx.constraintlayout.widget.ConstraintLayout>
效果图:
总结:小编是有多懒...
GT 第六章:不一样的 SharedPreferences
新建一个空的项目,在项目中的 activity_main.xml 中添加一下代码:
【注意:GT库需达到1.0.2版本】
<?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/saveData"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="保存数据:"
android:textSize="24sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.2" />
<TextView
android:id="@+id/queryData"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="取出数据:"
android:textSize="24sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintHorizontal_bias="0.552"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintStart_toStartOf="@+id/saveData"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.427" />
</androidx.constraintlayout.widget.ConstraintLayout>
项目中的 MainActivity 中添加一下代码:
/**
* 初始化 SP
* @param context 上下文
* @param SPName 存储的名字
* @param permissions 存储可读取的权限
* @param commit 是否自动提交
*/
GT.GT_SharedPreferences gt_sp = new GT.GT_SharedPreferences(this,getResources().getString(R.string.app_name),GT.GT_SharedPreferences.PRIVATE,true);
TextView tv_save = findViewById(R.id.saveData);
TextView tv_query = findViewById(R.id.queryData);
//存数据
gt_sp.save("QQ",1079374315);//存 int 类型
// gt_sp.save("QQ","1079374315");//存 String 类型
// gt_sp.save("QQ",true);//存 boolean 类型
// gt_sp.save("QQ",2019f);//存 float 类型
tv_save.setText(tv_save.getText() + "1079374315");
//取数据
Object qq = gt_sp.query("QQ");
tv_query.setText(tv_query.getText() + qq.toString());
// gt_sp.clear();//清空当前所有存储数据
效果图:
当前支持存储的类型有:String、Integer、Long、Float、Boolean、Set、Object 没错,用法都差不多:
增加:save
删除:delete
查询:query
修改:updata
LoginBean loginBean = new LoginBean(user, paw);
gt_sp.save("LoginBean",loginBean);//保存对象
小编特意写了一个 保存 Object 的dome 请看效果图:
项目源码:https://github.com/1079374315/GT_SP_Login
如果组件摆放的位置不如意,就随便托托,皮皮更健康。
总结:增删查改 简单 功能 增强 ,实乃 编程居家 好配方。
GT 第七章:手机 SD 卡 IO 操作
新建一个空的项目,在项目中的 MainActivity 中添加一下代码:
【注意:GT库需达到1.0.2版本】
// * 第一步:
GT.GT_IO io = new GT.GT_IO(this);//创建 IO 对象
// * 第二步:
io.save("1079374315","qq");//保存数据
// * 第三步:
String qq = io.query("qq"); //获取数据
GT.log_e("QQ:" + qq);//打印 取出的 数据
效果图:
当然还有存储到 SD 目录的 方法支持,在项目中的 MainActivity 中添加一下代码:
// * 第一步:
GT.GT_File file = new GT.GT_File();//创建 File 对象
// * 第二步: 保存的数据 保存的文件夹 路径 保存的文件名 记得加扩展名
file.save("第一章:","/我的小说/武侠小说/","斗罗大陆.txt");//保存数据
// * 第三步:
String query = file.query("/我的小说/武侠小说/", "斗罗大陆.txt"); //获取数据
GT.log_e("取出的数据:" + query);//打印 取出的 数据
在 AndroidManifest.xml 中添加 写入 读取 权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
效果图:
还有专门针对于 手机清理的 CleanDataUtils 类方法有:
有兴趣同学可以去看着源码注释 使用 ,都是中国人 别说看不懂中文o( ̄▽ ̄)d 。
/**
* 管理手机数据
*/
public static class 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(格式化单位)
GT 第八章:network 网络类
新建一个空的项目,在项目中的 MainActivity 中添加一下代码:
【注意:GT库需达到1.1.3版本】
boolean internet = GT.Network.isInternet(this);//当前是否可以上网 true 网络畅通 false 无法连接网络
if(internet){
String ipAddress = GT.Network.getIPAddress(this);//获取当前 IP 地址
GT.log_i("可以上网:IP:" + ipAddress);
}else{
GT.log_i("无法上网");
}
在 AndroidManifest.xml 中添加 写入 读取 权限:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
效果图:
总结:网络类有点少,后面慢慢更新,如果你有更多好的网络源码请参与编辑吧——少年郎。
GT 第九章: 网络请求OkGo/OkHttp3 + JSON
新建一个空的项目,在项目中的 MainActivity 中添加一下代码:
【注意:GT库需达到1.1.3版本】
请求:OkGo Get 方式
public class MainActivity extends AppCompatActivity {
String urlApi = "https://apis.map.qq.com/ws/geocoder/v1/?location=" +
"22.5948,114.3069163" +
"&key=J6HBZ-N3K33-D2B3V-YH7I4-37AVE-NJFMT&get_poi=1";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//OkGo 的 get 请求
new GT.OkGo(urlApi).loadDataGet(new StringCallback() {
@Override
public void onSuccess(Response<String> response) {
GT.log_e("请求下来的 JSON 数据:",response.body());
//进行数据筛选
GT.JSON json = new GT.JSON(response.body());//装入数据
json.initBeanData(response.body());
Object message = json.get("message");
GT.log_i("message:" + message);
//初始化数据
json.initBeanData(json.get("result").toString());
Object address = json.get("address");
GT.log_i("address:" + address);
json.initBeanData(json.get("formatted_addresses").toString());
Object recommend = json.get("recommend");
GT.log_i("recommend:" + recommend);
}
});
}
}
记得加网络权限:
<uses-permission android:name="android.permission.INTERNET"/>
效果图:
08-09 16:32:45.790 6090-6090/? E/GT_e: ------- Run
---------------------请求下来的 JSON 数据:------------------------
{
"status": 0,
"message": "query ok",
"request_id": "462ff366-ba80-11e9-8c6e-5254002f3dc2",
"result": {
"location": {
"lat": 22.5948,
"lng": 114.306916
},
"address": "广东省深圳市盐田区宋彩道",
"formatted_addresses": {
"recommend": "大梅沙海景酒店",
"rough": "大梅沙海景酒店"
},
"address_component": {
"nation": "中国",
"province": "广东省",
"city": "深圳市",
"district": "盐田区",
"street": "宋彩道",
"street_number": "宋彩道"
.....
.....
.....
08-09 16:32:45.792 6090-6090/? I/GT_i: ------- message:query ok
08-09 16:32:45.793 6090-6090/? I/GT_i: ------- address:广东省深圳市盐田区宋彩道
08-09 16:32:45.793 6090-6090/? I/GT_i: ------- recommend:大梅沙海景酒店
请求:OkGo 的 Post 请求 带参数
public class MainActivity extends AppCompatActivity {
String Api = "https://apis.map.qq.com/ws/geocoder/v1/?";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//OkGo 的 Post 请求 带参数
Map<String,String> map = new HashMap<>();
map.put("location","22.5948,114.3069163");
map.put("key","J6HBZ-N3K33-D2B3V-YH7I4-37AVE-NJFMT");
map.put("get_poi","1");
new GT.OkGo(Api,map).loadDataPost(new StringCallback() { //Post 请求方式
@Override
public void onSuccess(Response<String> response) {
GT.log_i("请求成功!");
GT.log_e("请求下来的数据:",response.body());
}
@Override
public void one rror(Response<String> response) {
GT.log_e("请求失败!");
}
});
}
}
效果图:
请求:OkHttp 的 Post 请求 带参数:
public class MainActivity extends AppCompatActivity {
String Api = "https://apis.map.qq.com/ws/geocoder/v1/?";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//OkGo 的 Post 请求 带参数
Map<String,String> map = new HashMap<>();
map.put("location","22.5948,114.3069163");
map.put("key","J6HBZ-N3K33-D2B3V-YH7I4-37AVE-NJFMT");
map.put("get_poi","1");
/**
* OkHttp(String url) 默认使用 get 请求
* OkHttp(String url, Map<String, String> map) 默认使用 post 请求
*/
new GT.OkHttp(Api,map).loadDAta(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
GT.log_i("请求下来的数据:" + response.body().string());
}
});
}
}
效果图:
08-09 16:49:00.956 6443-6460/? I/GT_i: ------- 请求下来的数据:{
"status": 0,
"message": "query ok",
"request_id": "8b89cb06-ba82-11e9-8269-6c92bf53528b",
"result": {
"location": {
"lat": 22.5948,
"lng": 114.306916
},
"address": "广东省深圳市盐田区宋彩道",
"formatted_addresses": {
"recommend": "大梅沙海景酒店",
"rough": "大梅沙海景酒店"
},
原始网络请求:
public class MainActivity extends AppCompatActivity {
String url = "https://apis.map.qq.com/ws/geocoder/v1/?";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//OkGo 的 Post 请求 带参数
Map<String, String> map = new HashMap<>();
map.put("location", "22.5948,114.3069163");
map.put("key", "J6HBZ-N3K33-D2B3V-YH7I4-37AVE-NJFMT");
map.put("get_poi", "1");
GT.HttpUtil.postRequest(url, map, "utf-8", new GT.HttpUtil.OnLoadData() {
@Override
public void onSuccess(String response) {
GT.log_i("原始网络 请求成功:" + response);
}
@Override
public void one rror(String error) {
GT.log_i("请求失败:" + error);
}
});
}
}
结果:
2019-09-27 09:57:04.113 14211-14211/com.gsls.gt_animator I/GT_i: ------- 原始网络 请求成功:{
"status": 0,
"message": "query ok",
"request_id": "1b1cc4cc-e0ca-11e9-8a7c-7cd30a58fda9",
"result": {
"location": {
"lat": 22.5948,
"lng": 114.306916
},
"address": "广东省深圳市盐田区宋彩道",
"formatted_addresses": {
"recommend": "大梅沙海景酒店",
"rough": "大梅沙海景酒店"
},
总结:介绍了一些网络请求的方法,还有些就看读中文注释吧。少了的也欢迎 读者 前来投稿 后 参与编辑。
GT 第十章:Web 快捷键
新建一个空的项目,在项目中的 MainActivity 中添加一下代码:
【注意:GT库需达到1.1.3版本】
直接拔取 Web 上的 JSON 数据:
public class MainActivity extends AppCompatActivity {
String urlApi = "https://apis.map.qq.com/ws/geocoder/v1/?location=" +
"22.5948,114.3069163" +
"&key=J6HBZ-N3K33-D2B3V-YH7I4-37AVE-NJFMT&get_poi=1";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Thread(new Runnable() {
@Override
public void run() {
String htmlData = null;
try {
htmlData = GT.WebApi.getHtmlData(urlApi);
} catch (Exception e) {
e.printStackTrace();
}
GT.log_e("拔下的 htmlData:",htmlData);
}
}).start();
}
}
效果图:
08-09 16:56:18.915 6725-6741/? E/GT_e: ------- Run
---------------------拔下的 htmlData:------------------------
{
"status": 0,
"message": "query ok",
"request_id": "909ae75a-ba83-11e9-80bb-6c92bf93b501",
"result": {
"location": {
"lat": 22.5948,
"lng": 114.306916
},
"address": "广东省深圳市盐田区宋彩道",
"formatted_addresses": {
"recommend": "大梅沙海景酒店",
"rough": "大梅沙海景酒店"
},
总结:在拔下数据的时候一定要放在 子线程中执行,因为是个耗时操作。麻麻再也不怕,我拔不下数据了。(ノ´▽`)ノ♪
GT 第十一章:加载 PC 版 Google 地图
新建一个空的项目,在项目中的 MainActivity 中添加一下代码:
【注意:GT库需达到1.1.3版本】
public class MainActivity extends AppCompatActivity {
private String url = "http://www.google.cn/maps/@17.1669642,109.2817502,14972247m/data=!3m1!1e3";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
WebView webView = findViewById(R.id.webView);
GT.loadPCHtml.setWebViewLoadPC(webView,url);
}
}
在 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"
tools:context=".MainActivity">
<WebView
android:id="@+id/webView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>
记得要添加网络权限:
<uses-permission android:name="android.permission.INTERNET"/>
效果图:
总结:有时有项目需要强行加载 PC 版网页,这时记得想想我。(◕ᴗ◕✿)
GT 第十二章:Date 日期类
新建一个空的项目,在项目中的 MainActivity 中添加一下代码:
【注意:GT库需达到1.1.3版本】
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
GT.GT_Date gt_date = new GT.GT_Date();
GT.log_i("Time:" + gt_date.getTime());//获取完整时间
GT.log_i("WeekOfDate:" + gt_date.getWeekOfDate());//获取星期
GT.log_i("toTime:" + gt_date.toTime("1565343841"));//时间戳转时间
GT.log_i("toPastTime:" + gt_date.toPastTime("1565221646"));//离现在过去几小时
}
}
效果图:
08-09 17:48:12.534 7756-7756/? I/GT_i: ------- Time:2019-08-09 17:48:12
08-09 17:48:12.534 7756-7756/? I/GT_i: ------- WeekOfDate:星期五
08-09 17:48:12.534 7756-7756/? I/GT_i: ------- toTime:2019-08-09 17:44:01
08-09 17:48:12.535 7756-7756/? I/GT_i: ------- toPastTime:10小时前
总结:傻瓜式的使用,还有一大波傻瓜 方法我就不写出来了如:
单独获取 年份、单独获取 月份、获取当月的第 几日、获取时、获取分、获取秒、等等
GT 第十三章:分享功能、加载图片
新建一个空的项目,在项目中的 MainActivity 中添加一下代码:
【注意:GT库需达到1.1.3版本】
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ImageView imageView = findViewById(R.id.image);
/**
* 加载图片
*
* @param context 上下文
* @param ImageResources 要加载的图片资源
* @param imageView 加载到那个组件上
*/
GT.ImageOptimize.loadImage(this,R.mipmap.ic_launcher,imageView);//加载图片
}
}
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">
<ImageView
android:id="@+id/image"
android:layout_width="200dp"
android:layout_height="100dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
效果图:
接下来看看分享功能:
在项目中的 MainActivity 中添加一下代码:跳转目录
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ImageView imageView = findViewById(R.id.image);
/**
* 加载图片
*
* @param context 上下文
* @param ImageResources 要加载的图片资源
* @param imageView 加载到那个组件上
*/
GT.ImageOptimize.loadImage(this,R.mipmap.ic_launcher,imageView);//加载图片
//单击图片 进分享操作
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new GT.GT_Share(MainActivity.this).senText("标题","我分享的内容");
}
});
}
}
效果图:
总结:Q分享消息试过,亲测成功,但微信还没试过。要是不行记得致电哦。٩(๑>◡<๑)۶
GT 第十四章: Window 窗口 操作类
新建一个空的项目,在项目中的 MainActivity 中添加一下代码:
【注意:GT库需达到1.1.3版本】
public class MainActivity extends AppCompatActivity {
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// GT.Window.fullScreen(this); //设置全屏模式
setContentView(R.layout.activity_main);
GT.log_i("屏幕宽度:" + GT.Window.getWindowWidth(this));
GT.log_i("屏幕高度:" + GT.Window.getWindowHeight(this));
GT.Window.light(this); //设置屏幕常亮
GT.Window.Close_virtualButton(this); //关闭虚拟按钮
// GT.Window.hideStatusBar(this); //隐藏状态栏
GT.Window.lucencyStatusBar(this); //透明状态栏
GT.Window.hideActionBar(this); //隐藏ActionBar
// GT.Window.hideNavigationBar(this); //隐藏导航栏
// GT.Window.lucencyNavigationBar(this); //透明导航栏
// GT.Window.immersionMode(this); //沉浸式模式 (隐藏状态栏,去掉ActionBar,隐藏导航栏)
/**
* 返回当前是 横屏 还是 竖屏
*
* @param activity
* @return 横屏返回 true 竖屏返回 false
*/
GT.log_i("横竖屏检测:" + GT.Window.isLandscapeAndPortrait(this));
/**
* one_three: 0-6 的 值来进行强制的 横竖屏、自适应等
* 执行强制的 横屏 或 竖屏
*
* @param activity
*/
GT.Window.AutoLandscapeAndPortrait(this,5);//自动适宜 正横屏、反横屏、正竖屏
}
}
我们再来看看 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"
android:background="#2196F3"
tools:context=".MainActivity">
</androidx.constraintlayout.widget.ConstraintLayout>
效果图:
给颗糖豆:
public class MainActivity extends AppCompatActivity {
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
GT.Window.fullScreen(this); //设置全屏模式
setContentView(R.layout.activity_main);
GT.Game.startGameWindow(this);//开启游戏的 沉浸式模式
}
}
总结:开发游戏必备的 窗口知识点。小编在 2019 年 12 月底 会在TabTab发布处女游戏,到时候记得赏脸哦。(*/ω\*)
GT 第十五章: GT_Fragment 框架
美帝 框架,让切换变得如此简单!
新建一个空的项目,我们先看一下dome 的文件目录结构:
【注意:GT库需达到1.1.3版本】
新建 activity 与 fragment 文件夹,目录简单:一个 Activity 、四个 Fragment 再加 对应的布局文件。
第一步:新建 四个 Fragment 与 对应的 xml 布局文件
fragment_a.xml——fragment_b.xml——fragment_c.xml——fragment_d.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=".activity.MainActivity"
>
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:text="Fragment A"
android:background="#FFEB3B"
android:textSize="28sp"
android:textStyle="bold"
android:textColor="#000000"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
fragment_b.xml 与上相同 只需修改:
android:text="Fragment B"
android:background="#4CAF50"
fragment_c.xml 与上相同 只需修改:
android:text="Fragment C"
android:background="#03A9F4"
fragment_d.xml 与上相同 只需修改
android:text="Fragment D"
android:background="#FF00"
Fragment_A.class——Fragment_C.class——Fragment_C.class——Fragment_D.class代码:
注意:也可以 不继承 BaseFragments 继承 app.Fragment 下的 也可以。
Fragment_A.xml 代码:
//继承来之 GT 的 BaseFragments 类
public class Fragment_A extends GT.GT_Fragment.BaseFragments{
@Override
protected int loadLayout() { //重写 loadLayout 方法
return R.layout.fragment_a; //返回解析的布局文件
}
@Override
protected void initView(@NonNull View view, @Nullable Bundle savedInstanceState) { //重写 initView 方法
// 写 Fragment 业务需求代码
}
}
Fragment_B.xml 与上相同 只需修改:
@Override
protected int loadLayout() {
return R.layout.fragment_b;
}
Fragment_C.xml 与上相同 只需修改:
@Override
protected int loadLayout() {
return R.layout.fragment_c;
}
Fragment_D.xml 与上相同 只需修改
@Override
protected int loadLayout() {
return R.layout.fragment_d;
}
第二步:写 MainActivity 与 activity_main 代码:
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=".activity.MainActivity">
<FrameLayout
android:id="@+id/fLayout"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@+id/lLayout"
/>
<LinearLayout
android:id="@+id/lLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
android:orientation="horizontal"
android:padding="5dp"
android:background="#FFFFFF"
>
<Button
android:id="@+id/btn1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="按钮1"
android:onClick="onClick"
/>
<Button
android:id="@+id/btn2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="按钮2"
android:onClick="onClick"
/>
<Button
android:id="@+id/btn3"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="按钮3"
android:onClick="onClick"
/>
<Button
android:id="@+id/btn4"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="按钮4"
android:onClick="onClick"
/>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
MainActivity.class 代码:
public class MainActivity extends AppCompatActivity {
private GT.GT_Fragment gt_f;//定义 Fragment 管理器
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//添加要管理的 Fragment
List<Fragment> list = new ArrayList<>();
list.add(new Fragment_A());
list.add(new Fragment_B());
list.add(new Fragment_C());
list.add(new Fragment_D());
//初始化 Fragment 管理器
gt_f = GT.GT_Fragment.getGT_fragment()
// 初始化 GT_Fragment 管理器参数
.initFragment(savedInstanceState,this,getSupportFragmentManager())
// 参数1:帧布局的 id 参数2:存储 Fragment 的 list 参数3:默认加载首页的页面 一般设置为 0 就如 list.get(0);
.loadFragment(R.id.fLayout,list,0);
}
public void onClick(View view) {
switch (view.getId()){
case R.id.btn1:
gt_f.startFragment(Fragment_A.class);//跳转到 Fragment_A
break;
case R.id.btn2:
gt_f.startFragment(Fragment_B.class);//跳转到 Fragment_B
break;
case R.id.btn3:
gt_f.startFragment(Fragment_C.class);//跳转到 Fragment_C
break;
case R.id.btn4:
gt_f.startFragment(Fragment_D.class);//跳转到 Fragment_D
break;
}
}
}
看看效果图:
《少量 Activity 对应 多个 Fragemnt》 《单 Activity 对应 多个 Fragemnt》
本章节 dome 网址:https://github.com/1079374315/GT_Fragment.git
GT_Fragment 使用之 进阶版(单 Activity 与对应 多 Fragment 开发):https://github.com/1079374315/GT_Activity_Fragments.git
在 单 Activity 与对应 多 Fragment 开发 其中 的 打开新的页面 与 销毁当前页面 代码作了优化:
startFragment(Fragment_n.newInstance());//打开一个新的 Fragment
finish();//关闭当前 Fragment
包括 解决 多层 Fragment 嵌套的状态下 监听 物理返回按钮或其它按键的优化:
//监听 物理返回按键
getGT_Fragment().onKeyDown(view, new View.OnKeyListener() {
@Override
public boolean onKey(View view, int keyCode, KeyEvent keyEvent) {
if (keyCode == 4 && keyEvent.getAction() == KeyEvent.ACTION_DOWN) {
// 这里的 activity 可以直接 写 不用去写 获取 activity 的代码
Toast.makeText(activity, "监听到你按下 物理返回 按钮", Toast.LENGTH_SHORT).show();
// finish();//关闭当前 Fragment
return true;//只将 返回按键进行监听
}
return false;//其余的如 音量小 音量大等等,不进行监听,都交给 Activity 管理。
}
});
总结:美帝 框架,让切换变得如此简单!
GT 第十六章: DeviceListening 设备监听类
新建一个空的项目,在项目中的 MainActivity 中添加一下代码:
【注意:GT库需达到1.1.3版本】
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();//注销 监听耳机 广播
}
}
效果图:
08-10 16:35:56.610 5881-5881/? I/GT_i: ------- 获取手机型号:MI 6
08-10 16:35:56.610 5881-5881/? I/GT_i: ------- 获取手机SDK版本号:22
08-10 16:35:56.610 5881-5881/? I/GT_i: ------- 获取手机系统版本号:5.1.1
08-10 16:35:56.639 5881-5881/? I/GT_i: ------- 获取 通话声音 最大值 与 当前通过的声音值:4
08-10 16:35:56.639 5881-5881/? I/GT_i: ------- 获取当前手机的声音值:5
08-10 16:35:56.639 5881-5881/? I/GT_i: ------- 获取 系统音量 最大值:7
08-10 16:35:56.639 5881-5881/? I/GT_i: ------- 获取 当前通过的声音值:5
08-10 16:35:56.639 5881-5881/? I/GT_i: ------- 铃声音量 最大值:7
08-10 16:35:56.639 5881-5881/? I/GT_i: ------- 获取 当前通过的声音值:11
08-10 16:35:56.639 5881-5881/? I/GT_i: ------- 获取 音乐音量(多媒体) 最大值:15
08-10 16:35:56.640 5881-5881/? I/GT_i: ------- 获取 当前通过的声音值:6
08-10 16:35:56.640 5881-5881/? I/GT_i: ------- 获取 提示声音 音量 最大值:7
08-10 16:35:56.649 5881-5881/? I/GT_i: ------- 监听耳机:false
总结:给了一系列工具 轻松获取,欢迎关注最新版 GT 库,有可能已经增加了其它内容呢。
GT 第十七章: 超简单的 多媒体
新建一个空的项目,在项目中的 MainActivity 中添加一下代码:
【注意:GT库需达到1.1.3版本】
播放音乐:(长的声音)
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 第十八章: Thread 更新UI线程
Adnroid 中 向后台请求网络是常用的事,而凡是耗时的操作都应该写在子线程当中,来试试这些 线程 骚操作吧:
【注意:GT库需达到1.1.3版本】
正常子线程:
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(5000);//延时 5 秒
Log.i("TAG","请求网络");//打印
} catch (InterruptedException e) {
e.printStackTrace();
}
//...请求网络
}
}).start();
GT 中的子线程:
GT.Thread.runJava(new Runnable() {
@Override
public void run() {
GT.Thread.sleep(5000);//延时 5 秒
GT.log_i("请求网络");//打印
//...请求网络
}
});
我们知道更新 Android UI 只能在 UI 线程中更新,如果用 子线程更新会发生异常,如果你还在用 handler 更新UI 不如试试这个方法:
GT 中更新 UI:
GT.Thread.runAndroid(new Runnable() {
@Override
public void run() {
//...更新 UI 操作
}
});
里面还有一些好用的方法如:
/**
* 循环 计时器
*
* @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 第十九章: BaseActivity,AnnotationActivity类的继承:
【注意:GT库需达到1.1.3版本】
新建一个 普通 Activity 如下:
public class MainActivity extends GT.BaseActivity {
@Override
protected int initLayout(Bundle savedInstanceState) {
return R.layout.activity_main;
}
@Override
protected void initView() {
//处理相关逻辑
}
}
新建一个 注解 Activity 如下:
@GT.Annotations.GT_Activity(R.layout.activity_main)
public class MainActivity extends GT.AnnotationActivity {
@Override
protected void initView() {
build(this);//绑定activity
//处理相关逻辑
}
}
总结:使用非常简单,继承GT中自带的Activity即可。
GT 第二十章: GT注解的调用:
【注意:GT库需达到1.1.3版本】
使用 GT 注解来开发一个 多个 Fragment 之间切换的小实例
效果图: 项目目录
第一步:添加4个 fragment 的 xml 布局 与 activity_main 布局
fragment_1.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#F44336"
>
</LinearLayout>
fragment_2.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#03A9F4"
>
</LinearLayout>
fragment_3.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#4CAF50"
>
</LinearLayout>
fragment_4.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"
android:background="#FF9800"
tools:context=".MainActivity">
<TextView
android:id="@+id/ioc_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/ioc_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="单击测试"
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.603" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintBottom_toTopOf="@+id/ioc_tv"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<Button
android:id="@+id/ioc_btn01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按钮1" />
<Button
android:id="@+id/ioc_btn02"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按钮2" />
<Button
android:id="@+id/ioc_btn03"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按钮3" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
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">
<FrameLayout
android:id="@+id/frameLayout"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@+id/linearLayout"
/>
<LinearLayout
android:id="@+id/linearLayout"
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_weight="1"
android:layout_height="wrap_content"
android:text="F1"
/>
<Button
android:id="@+id/btn2"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="F2"
/>
<Button
android:id="@+id/btn3"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="F3"
/>
<Button
android:id="@+id/btn4"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="F4"
/>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
第二步:添加 4 个 Fragment 类 与 编写 MainActivity 代码:
Fragment_1
public class Fragment_1 extends Fragment {
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_1,container,false);
}
}
Fragment_2
public class Fragment_1 extends Fragment {
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_1,container,false);
}
}
Fragment_3
public class Fragment_3 extends Fragment {
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_3,container,false);
}
}
Fragment_4
public class Fragment_4 extends Fragment {
@GT.Annotations.GT_View(R.id.ioc_tv)
private TextView tv;
@GT.Annotations.GT_View(R.id.ioc_btn)
private Button btn;
@GT.Annotations.GT_Object(valueString = "1079", valueInt = 21, types = {GT.Annotations.GT_Object.TYPE.STRING, GT.Annotations.GT_Object.TYPE.INT}, functions = {"setUsername", "setAge"})
private LoginBean loginBean;
@GT.Annotations.GT_Res.GT_String(R.string.StringTest)
private String data;
@GT.Annotations.GT_Res.GT_Color(R.color.colorTest)
private int MyColor;
@GT.Annotations.GT_Res.GT_Drawable(R.drawable.ic_launcher_background)
private Drawable btnBG;
@GT.Annotations.GT_Res.GT_Dimen(R.dimen.tv_size)
private float TextSize;
@GT.Annotations.GT_Res.GT_Animation(R.anim.alpha)
private Animation animation;
@GT.Annotations.GT_Res.GT_StringArray(R.array.ctype)
private String[] strArray;
@GT.Annotations.GT_Res.GT_IntArray(R.array.textInt)
private int[] intArray;
@GT.Annotations.GT_Res.GT_Layout(R.layout.activity_main)
private View layout;
@GT.Annotations.GT_Collection.GT_List(valueString = {"111", "222", "333"})
private List<String> stringList;
@GT.Annotations.GT_Collection.GT_Map(valueKey = {"username","password"},valueInt = {4444,5555})
private Map<String,Integer> userMap;
@GT.Annotations.GT_Collection.GT_Set(valueInt = {11,22,33,44})
private Set<Integer> booleanSet;
private static final String TAG = "GT_";
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_4, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
GT.getGT().build(this, view);//绑定 Fragment
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.i(TAG, "loginBean: " + loginBean);
Log.i(TAG, "data: " + data);
Log.i(TAG, "color: " + MyColor);
Log.i(TAG, "Drawable: " + btnBG);
Log.i(TAG, "TextSize: " + TextSize);
Log.i(TAG, "animation: " + animation);
Log.i(TAG, "strArray: " + strArray);
Log.i(TAG, "intArray: " + intArray);
Log.i(TAG, "layout: " + layout);
Log.i(TAG, "stringList: " + stringList);
Log.i(TAG, "userMap: " + userMap);
Log.i(TAG, "booleanSet: " + booleanSet);
tv.setText("实现成功!");
btn.setTextColor(MyColor);
btn.setTextSize(TextSize);
btn.setBackgroundDrawable(btnBG);
btn.startAnimation(animation);
}
});
}
@GT.Annotations.GT_Click({R.id.ioc_btn01, R.id.ioc_btn02, R.id.ioc_btn03})
public void testBtnOnCLick(View view) {
switch (view.getId()) {
case R.id.ioc_btn01:
Log.i(TAG, "单击 1 号");
break;
case R.id.ioc_btn02:
Log.i(TAG, "单击 2 号");
break;
case R.id.ioc_btn03:
Log.i(TAG, "单击 3 号");
break;
}
}
}
MainActivity
public class MainActivity extends AppCompatActivity {
//实例化 4 个 Fragment 并注入到 List 中
@GT.Annotations.GT_Collection.GT_List({Fragment_1.class, Fragment_2.class, Fragment_3.class, Fragment_4.class})
private List<Fragment> fragmentList;
//定义 Fragment 管理器
private GT.GT_Fragment gt_fragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
GT.getGT().build(this);//绑定 Activity
//实例化 Fragment 管理器 并初始化要管理的 Fragment
gt_fragment = GT.GT_Fragment.getGT_fragment()
.initFragment(savedInstanceState, this, getSupportFragmentManager())
.loadFragment(R.id.frameLayout, fragmentList, 0);
}
@GT.Annotations.GT_Click({R.id.btn1,R.id.btn2,R.id.btn3,R.id.btn4})
public void onBtnClick(View view){
switch (view.getId()){
case R.id.btn1:
gt_fragment.startFragment(Fragment_1.class);//跳转到 Fragment_1 页面
break;
case R.id.btn2:
gt_fragment.startFragment(Fragment_2.class);//跳转到 Fragment_2 页面
break;
case R.id.btn3:
gt_fragment.startFragment(Fragment_3.class);//跳转到 Fragment_3 页面
break;
case R.id.btn4:
gt_fragment.startFragment(Fragment_4.class);//跳转到 Fragment_4 页面
break;
}
}
}
效果数据:
09-16 11:16:34.657 5823-5823/? I/GT_i: ------- key:username
09-16 11:16:34.657 5823-5823/? I/GT_i: ------- key:password
09-16 11:16:40.378 5823-5823/? I/GT_: 单击 1 号
09-16 11:16:41.042 5823-5823/? I/GT_: 单击 2 号
09-16 11:16:41.619 5823-5823/? I/GT_: 单击 3 号
09-16 11:16:43.061 5823-5823/? I/GT_: loginBean: LoginBean{username='1079', password='null', age=21}
09-16 11:16:43.061 5823-5823/? I/GT_: data: 测试数据
09-16 11:16:43.061 5823-5823/? I/GT_: color: -6400
09-16 11:16:43.061 5823-5823/? I/GT_: Drawable: android.graphics.drawable.VectorDrawable@2747f5a3
09-16 11:16:43.061 5823-5823/? I/GT_: TextSize: 10.0
09-16 11:16:43.061 5823-5823/? I/GT_: animation: android.view.animation.AnimationSet@58d70a0
09-16 11:16:43.061 5823-5823/? I/GT_: strArray: [Ljava.lang.String;@3149e459
09-16 11:16:43.061 5823-5823/? I/GT_: intArray: [I@35df881e
09-16 11:16:43.061 5823-5823/? I/GT_: layout: androidx.constraintlayout.widget.ConstraintLayout{30da48ff V.E..... ......I. 0,0-0,0}
09-16 11:16:43.061 5823-5823/? I/GT_: stringList: [111, 222, 333]
09-16 11:16:43.061 5823-5823/? I/GT_: userMap: {username=4444, password=5555}
09-16 11:16:43.061 5823-5823/? I/GT_: booleanSet: [22, 44, 11, 33]
总结:完成啦,如果 GT注解 配合 GT 注解基类 那你的代码将会得到不一样的变化。
项目源码:https://github.com/1079374315/GT_Annotation
GT 第二十一章:真假动画
【注意:GT库需达到1.1.3版本】
效果图:
实现的主要代码如下:
public class MainActivity extends AppCompatActivity {
@GT.Annotations.GT_View(R.id.btn_show)
private Button btn_show;
@GT.Annotations.GT_Object
private GT.GT_Animation gt_animation;//这里其实好比这样创建 new GT.GT_Animation();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
GT.getGT().build(this);//绑定 Activity
}
@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
源码非常容易看懂不信你瞧:
GT 第二十二章:APP更新、APP热修复
【注意:GT库需达到1.1.3版本】
简单的三行代码实现 APP的更新
String url = "https://res.wx.qq.com/open/zh_CN/htmledition/res/dev/download/sdk/Gen_Signature_Android3b8804.apk";
//下载 url 上的 apk 并放在 手机根目录中 GT 文件夹下
GT.AppIteration.UpdateApp.downloadFile(url,"GT/最新版APP.apk");
//安装 手机根目录中 GT 文件夹下的 最新版APP.apk
GT.AppIteration.UpdateApp.installNewApk(this, "GT/最新版APP.apk");
APP更新需要注意的就是配置参数:
添加的权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 写入手机权限 -->
<uses-permission android:name="android.permission.INTERNET" /> <!-- 网络权限 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> <!-- 读取手机权限 -->
添加数据共享
<application>
...
<!--数据共享-->
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="自己包名.fileprovider"
android:grantUriPermissions="true"
android:exported="false">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
...
</<application>
创建xml目录并创建 file_paths.xml.xml 文件
<paths>
<external-path path="." name="external_storage_root" />
</paths>
总结:简洁明了,非常实用。
GT 第二十三章:遥感控件
【注意:GT库需达到1.1.3版本】
效果图:
第一步:写入 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库的初衷。感谢您的关注。
GT 第二十四章:APP数据池
【注意:GT库需达到1.1.5版本】
前言:android的朋友有没有发现在 activity之间传递数据、Fragment之间传递数据、Activity与 Fragment之间传递数据 是一件非常麻烦的事情,Activity之间大多用Intent带Bundle数据去传递,而Fragment之间的传递数据则需要借助寄生的Activity作为桥梁进行传递数据,而A类Activity 去向 B类Activity下的Fragment传递数据时,就更加麻烦了。所以小编对GT工具包封装了
APP数据池,可以在App任何类中使用 save 方法保存数据,在APP任何类中使用 query 方法查询数据,小编还封装了APP之间的数据传递。使用的方法一样的简单,两句代码搞定。
下面就跟小编来看看吧。
APP内部数据池:
保存数据:
/**
* @参数一:当前类的class
* @参数二:key
* @参数三:存储的数据
* @返回: 保存成功:true 保存失败:false
*/
boolean domeKey = GT.AppDataPool.Interior.saveDataPool(AndroidActivity.class,"domeKey","你好,我的世界");//存储数据
读取数据:
/**
* @参数一:获取那个类存储的数据
* @参数二:存储的Key
* @返回: 返回Key对应存储的值
*/
Object keyValue = GT.AppDataPool.Interior.queryDataPool(AndroidActivity.class, "domeKey");
修改数据:
/**
* @参数一:修改那个类存储的数据
* @参数二:存储的Key
* @参数三:修改的数据
* @返回: 修改成功:true 修改失败:false
*/
boolean isDomeKey = GT.AppDataPool.Interior.updateDataPool(AndroidActivity.class,"domeKey","今天真是开心的一天");
删除数据:
/**
* @参数一:删除那个类存储的数据
* @参数二:删除的Key
* @返回: 删除成功:true 删除失败:false
*/
boolean isDomeKey = GT.AppDataPool.Interior.deleteDataPool(AndroidActivity.class, "domeKey");
内部APP数据池 增删查改 使用起来方便简单。
APP外部数据池:
请参考该网址:https://blog.csdn.net/qq_39799899/article/details/105851165
GT 待更新章节: 正在更新的 GT 库
看了源码的大兄弟,应该知晓GT 库今后的更新路线:
声明将 Hibernate 名改为 GT_SQL
更新1:GT_SQL: 已经编辑完,待进行最后的优化
Hibernate 数据库将在 2020年5月1号 正式发布!
具体教程请参考官方教程。
最新更新请 关注 GT 最新版。