Android——GT使用教程(总)

文章介绍:

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

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

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

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

美帝 框架,让创造变得如此简单!

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

更新时间:2020 年 1 月 7 日 

目录

文章介绍:

GT  前  言:依赖教程

GT 第一章:Log 多类型 打印

GT 第二章:Toast 家族

GT 第三章:AlertDialog 的故事

GT 第四章:Notification 通知类 (适配 Android 9.0)

GT 第五章:GT 中  一些不为人知的骚操作

GT 第六章:不一样的 SharedPreferences

GT 第七章:手机 SD 卡 IO 操作

GT 第八章:network 网络类

GT 第九章: 网络请求OkGo/OkHttp3 + JSON 

GT 第十章:Web 快捷键

GT 第十一章:加载 PC 版 Google 地图

GT 第十二章:Date  日期类

GT 第十三章:分享功能、加载图片

GT 第十四章:  Window 窗口 操作类 

GT 第十五章:  GT_Fragment 框架 

GT 第十六章: DeviceListening  设备监听类

GT 第十七章: 超简单的 多媒体

GT 第十八章: Thread 更新UI线程

GT 第十九章: BaseActivity,AnnotationActivity类的继承:

GT 第二十章: GT注解的调用:

GT 第二十一章:真假动画

GT 第二十二章:APP更新、APP热修复

GT 第二十三章:遥感控件

GT 第二十四章:APP数据池

GT 待更新章节: 正在更新的 GT 库





GT  前  言:依赖教程

现在的 Android开发中 几乎离不开 依赖包,别人写好的优秀组件,我们可以直接拿来用,用法也简单,这样大大提高了我们开发Android的效率,有些还在学校的学生如果没有接触过依赖包,我就在这里简单讲一下。

第一步:将以下存储库将其添加到根构建中。存储库末尾的gradle

allprojects {
	repositories {
		...
		maven { url 'https://jitpack.io' }
	}
}

Android——GT使用教程(总)

第二步:添加依赖关系

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

dependencies {
	implementation 'com.github.1079374315:GT:v1.0.2'
}

Android——GT使用教程(总)

最后再进行同步一下 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 的右侧窗口进行日志筛选,再来 看看打印的结果:

Android——GT使用教程(总)

我们试试将 log 筛选 调节的更严一些:

Android——GT使用教程(总)

总结:让你的 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);

运行效果图:

Android——GT使用教程(总)

当然我们还有 简便式 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

效果图:

Android——GT使用教程(总)

总结:有道是 “一次初始化,到处 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();

效果图:

Android——GT使用教程(总)

新建一个空的项目,在项目中的 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();

效果图:

Android——GT使用教程(总)

新建一个空的项目,在项目中的 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();

效果图:

Android——GT使用教程(总)

新建一个空的项目,在项目中的 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();

效果图:

Android——GT使用教程(总)

当然我们还有 自定义 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();

效果图:

Android——GT使用教程(总)

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

/**
             * @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();//关闭
                }
            });
        }

    }

}

效果图:

Android——GT使用教程(总)

总结:写更少代码,做更多功能。小帅哥们,快来玩呀。

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);

效果图:

Android——GT使用教程(总)

总结:你问我自定义的呢, 自定义 通知? 下一个版本更新加上去,小编写过一个类似酷狗音乐通知栏的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>

效果图:

Android——GT使用教程(总)

总结:小编是有多懒...

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();//清空当前所有存储数据

效果图:

Android——GT使用教程(总)

当前支持存储的类型有:String、Integer、Long、Float、Boolean、Set、Object 没错,用法都差不多:

增加:save

删除:delete

查询:query

修改:updata

 LoginBean loginBean = new LoginBean(user, paw);
 gt_sp.save("LoginBean",loginBean);//保存对象

小编特意写了一个 保存 Object 的dome 请看效果图:

Android——GT使用教程(总)

项目源码:https://github.com/1079374315/GT_SP_Login

如果组件摆放的位置不如意,就随便托托,皮皮更健康。

Android——GT使用教程(总)

总结:增删查改 简单 功能 增强 ,实乃 编程居家 好配方。

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);//打印 取出的 数据

效果图:

Android——GT使用教程(总)

当然还有存储到 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" />

效果图:

Android——GT使用教程(总)Android——GT使用教程(总)

还有专门针对于 手机清理的 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" />

效果图:

Android——GT使用教程(总)

总结:网络类有点少,后面慢慢更新,如果你有更多好的网络源码请参与编辑吧——少年郎。

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("请求失败!");
            }
        });

    }

}

效果图:

Android——GT使用教程(总)

请求: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"/>

效果图:

Android——GT使用教程(总)

总结:有时有项目需要强行加载 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>

效果图:

Android——GT使用教程(总)

接下来看看分享功能:

在项目中的 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("标题","我分享的内容");
            }
        });

    }

}

效果图:

Android——GT使用教程(总)

总结: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>

效果图:

Android——GT使用教程(总)

Android——GT使用教程(总)

给颗糖豆:

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版本】

Android——GT使用教程(总)

新建 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;
        }
    }
}

看看效果图:

Android——GT使用教程(总)              Android——GT使用教程(总)

《少量 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 之间切换的小实例

效果图:                                                                             项目目录

    Android——GT使用教程(总)                         Android——GT使用教程(总)

第一步:添加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版本】

效果图:

Android——GT使用教程(总)

实现的主要代码如下:

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

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

Android——GT使用教程(总)

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版本】

效果图:

Android——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="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 最新版

上一篇:vue使用Geetest进行滑动验证


下一篇:RDD:离散变量可以作为断点回归的分配变量吗?