安卓开发之动态设置网络访问地址

news2025/1/25 8:57:58

之前开发程序联测测接口的时候,因为要和不同的后台人员调接口,所以经常要先把程序里的ip地址改成后台人员给我的。每次都要先修改ip地址,之后编译运行一下,才能测试。但要是换了个后台人员,或者同时和2个后台人员测接口,又要再修改ip后重新编译,重新运行,很繁琐,包括后期测试也是一样。

测试人员总是问我能不能弄个功能,可以让他们在dat环境下测完一个功能后,可以在应用里手动切换网络地址,继续测uat网络环境下此功能是否正常,之前忙着别的事儿,而且对这个功能也没什么头绪,就一直没弄。最近时间闲下来了,而且关于这个功能,我也有了一些自己的见解,所以在此把这个功能展示一下,嘿嘿。

多余的话就不说了,直接上图~

核心原理:这个输入框里可以随时设置网络地址和端口号(如果不需要输入端口号,直接空着就行),设置的网址会在点击保存按钮后直接替换app里面通用的网络地址前缀,同时将数据存入SharedPreferences中,每次启动app时,都会从Application中先检查SharedPreferences中是否存在保存的数据,如果有存储的数据,就将通用url修改成存储的url,达到这次保存,下次就不用修改了的功能。

下面开始直接贴代码

1.MainActivity.java

 public class MainActivity extends AppCompatActivity {
    private TextView tv_url_ma, tv_changeurl_ma, tv_refresh_ma;
    private WebView wv_showurl_ma;
    private static final int INTERNETCODE = 001;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();//代码初始化
        tv_url_ma.setText(PublicInfo.appurl);
        setClick();//设置点击方法
        checkPermissions();//检查用户是否给予网络权限,如果没有,就不启用
        initwv();//webview设置
    }

    /*8
    检查用户是否给予网络权限
     */
    private void checkPermissions() {
        if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.INTERNET) != PackageManager.PERMISSION_GRANTED) {//用户没有进行网络授权
            ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.INTERNET}, INTERNETCODE);
            return;
        } else {
            //已经获取到网络权限,可以显示默认网址中的数据
            wv_showurl_ma.loadUrl(PublicInfo.appurl);//设置网络地址
        }

    }

    /**
     * 用户权限返回结果
     *
     * @param requestCode
     * @param permissions
     * @param grantResults
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case INTERNETCODE://网络权限的返回值
//if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {//证明得到了用户授权
                    checkPermissions();//再次调用检查权限的方法,如果没问题,就会启动网络请求
                } else {
                    Toast.makeText(MainActivity.this, "当前设备未获取网络权限,无法联网", Toast.LENGTH_SHORT).show();
                }
                break;
            default:
                break;
        }
    }

    /**
     * webView设置
     */
    private void initwv() {
        wv_showurl_ma.getSettings().setJavaScriptEnabled(true);//如果网页中使用js,不加这行代码不显示
        wv_showurl_ma.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
//                return super.shouldOverrideUrlLoading(view, url);
                view.loadUrl(url);
                return true;//返回值为true时在WebView中打开,为false时调用浏览器打开
            }
        });
    }

    /**
     * 设置点击方法
     */
    private void setClick() {
        tv_changeurl_ma.setOnClickListener(new MainActivityClicm());
        tv_refresh_ma.setOnClickListener(new MainActivityClicm());
    }

    /**
     * 代码初始化
     */
    private void init() {
        tv_url_ma = findViewById(R.id.tv_url_ma);//url地址展示
        tv_changeurl_ma = findViewById(R.id.tv_changeurl_ma);//修改url地址按钮
        tv_refresh_ma = findViewById(R.id.tv_refresh_ma);//刷新页面按钮
        wv_showurl_ma = findViewById(R.id.wv_showurl_ma);//展示当前url所对应的网站详情
    }

    /**
     * 设置本页的点击方法
     */
    private class MainActivityClicm implements View.OnClickListener {

        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.tv_changeurl_ma://修改url地址
//                    Toast.makeText(MainActivity.this,"修改url地址",Toast.LENGTH_SHORT).show();
                    DialogUtils dialogUtils = new DialogUtils(MainActivity.this);
                    if (!dialogUtils.isShow()) {//判断弹出框是否已经打开了,如果没打开过,才运行打开代码
                        dialogUtils.showDialog("这里输入弹出框的展示标题");
                    }
                    break;
                case R.id.tv_refresh_ma://刷新页面
                    Toast.makeText(MainActivity.this, "刷新页面", Toast.LENGTH_SHORT).show();
                    wv_showurl_ma.loadUrl(PublicInfo.appurl);//设置网络地址
                    tv_url_ma.setText(PublicInfo.appurl);//展示当前的网络地址
                    break;
                default:
                    break;

            }
        }
    }
}

2.DialogUtils.java

 /**
 * 这个类里设置弹出框的数据
 */
public class DialogUtils extends Dialog {
    private Context context;
    private Dialog dialog;
    private SharedPreferences mSharedPreferences;
    private TextView tv_iptitle_udg, tv_title_udg, tv_nowurl_udg;
    private Spinner sp_checkurl_udg;
    private AppCompatEditText et_ipurl_udg, et_port_udg;
    private AppCompatButton btn_ok_udg, btn_cancel_udg;
    private ArrayAdapter<String> arrayAdapter;
    //下面这三个参数,可以放到项目values下的string中,这里为了看着方便就直接写这里了
    private static final String url_dat = "测试环境DAT";
    private static final String url_uat = "测试环境UAT";
    private static final String url_pre = "测试环境准生产";
    //为SharedPreferences设置一些必要的参数
    public static final String URLSETTINGINFO = "URLSETTINGINFO";
    public static final String URLSETTINGIP = "URLSETTINGIP";
    public static final String URLSETTINGPORT = "URLSETTINGPROT";

    private SharedPreferences sharedPreferences;


    public DialogUtils(@NonNull Context context) {
        super(context);
        this.context = context;//拿到上下文
        sharedPreferences = context.getSharedPreferences(URLSETTINGINFO, Context.MODE_PRIVATE);
    }


    /**
     * 显示dialog窗口的方法
     */
    public void showDialog(String title) {
        dialog = new Dialog(context);
        dialog.setCancelable(false);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.setContentView(R.layout.utils_dialog);
        final Window window = dialog.getWindow();
        window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));//设置背景透明
        initView(dialog);//设置dialog的参数
        tv_title_udg.setText(title);//设置标题
        tv_nowurl_udg.setText("当前url地址为:" + PublicInfo.appurl);//设置当前url地址
        tv_iptitle_udg.setText("ip地址" + PublicInfo.urltitle);
        initSpinner();//设置spinner参数
        setClick();//设置点击方法
        dialog.show();
    }

    /**
     * 设置点击方法
     */
    private void setClick() {
        btn_ok_udg.setOnClickListener(new DUtilsClick());
        btn_cancel_udg.setOnClickListener(new DUtilsClick());
    }

    /**
     * 设置spinner参数
     */
    private void initSpinner() {
        ArrayList<String> arrayList = new ArrayList<>();
        arrayList.add(url_dat);
        arrayList.add(url_uat);
        arrayList.add(url_pre);
        //设置适配器
        arrayAdapter = new ArrayAdapter<String>(context, android.R.layout.simple_spinner_item, arrayList);
        arrayAdapter.setDropDownViewResource(R.layout.spinner_layout);//这个是设置自定义view时使用的方法,如果使用默认就可以的话,可以不用写这行代码
        sp_checkurl_udg.setAdapter(arrayAdapter);
        sp_checkurl_udg.setOnItemSelectedListener(new DUtilsSpinnerClick());
    }

    /**
     * 设置dialog中的参数
     *
     * @param dialog
     */
    private void initView(Dialog dialog) {
        tv_title_udg = dialog.findViewById(R.id.tv_title_udg);//标题栏
        tv_nowurl_udg = dialog.findViewById(R.id.tv_nowurl_udg);//显示当前url地址
        sp_checkurl_udg = dialog.findViewById(R.id.sp_checkurl_udg);//可以设置默认地址的下拉框
        tv_iptitle_udg = dialog.findViewById(R.id.tv_iptitle_udg);//ip地址段的标题,用来显示当前的请求头是hppt还是https
        et_ipurl_udg = dialog.findViewById(R.id.et_ipurl_udg);//ip地址
        et_port_udg = dialog.findViewById(R.id.et_port_udg);//端口号
        btn_ok_udg = dialog.findViewById(R.id.btn_ok_udg);//确认按钮
        btn_cancel_udg = dialog.findViewById(R.id.btn_cancel_udg);//取消按钮

    }

    /**
     * 设置spinner的点击方法
     */
    private class DUtilsSpinnerClick implements AdapterView.OnItemSelectedListener {

        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            String itemname = arrayAdapter.getItem(position);
            switch (itemname) {
                case url_dat://选择dat标签
                    setInfo(PublicInfo.rul_dat);//根据选择不同的标签,为输入框中赋予不同的网络地址
                    break;
                case url_uat://选择uat标签
                    setInfo(PublicInfo.rul_uat);//根据选择不同的标签,为输入框中赋予不同的网络地址
                    break;
                case url_pre://选择pro标签
                    setInfo(PublicInfo.rul_pro);//根据选择不同的标签,为输入框中赋予不同的网络地址
                    break;
                default:
                    break;
            }
        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {
            Toast.makeText(context, "没有选择任何数据", Toast.LENGTH_SHORT).show();
        }
    }

    /**
     * 设置弹出框的点击方法
     */
    private class DUtilsClick implements View.OnClickListener {

        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.btn_ok_udg://确定按钮
                    btn_ok_udg.setClickable(false);//先关闭点击功能,防止用户重复点击
                    saveUrlInfo(et_ipurl_udg.getText().toString().trim(), et_port_udg.getText().toString().trim());//保存用户选择的url地址值
                    setLocalInfo(et_ipurl_udg.getText().toString().trim(), et_port_udg.getText().toString().trim());//将默认的url地址替换为用户修改的url
                    Toast.makeText(context, "IP地址修改成功", Toast.LENGTH_SHORT).show();
                    dissmissDialog();//修改完成后关闭弹窗
//                    android.os.Process.killProcess(android.os.Process.myPid());//IP地址修改成功后关闭程序,再次开启时启用新的IP地址(代码可用可不用,根据实际情况来决定)
                    break;
                case R.id.btn_cancel_udg://取消按钮
                    dissmissDialog();//关闭弹出框
                    break;
                default:
                    break;
            }
        }

        /**
         * 将默认的url地址替换为用户修改的url
         */
        private void setLocalInfo(String ip, String port) {
            if (TextUtils.isEmpty(port)) {
                PublicInfo.appurl = PublicInfo.urltitle + ip;
            } else {
                PublicInfo.appurl = PublicInfo.urltitle + ip + ":" + port;
            }
        }
    }

    /**
     * 设置用户选择的url地址值
     */
    private void saveUrlInfo(String ip, String port) {
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putString(URLSETTINGIP, ip);
        editor.putString(URLSETTINGPORT, port);
        editor.commit();
    }

    /**
     * 设置对应的网络地址
     */
    private void setInfo(String baseUrl) {
        String[] url = baseUrl.split("\\:");
        et_ipurl_udg.setText(url[0]);
        et_port_udg.setText(url[1]);
    }

    /**
     * 判断dialog是否显示
     *
     * @return
     */
    public boolean isShow() {
        if (null != dialog) {
            return dialog.isShowing();
        }
        return false;
    }


    /**
     * 关闭弹出框
     */
    public void dissmissDialog() {
        if (null != dialog) {
            dialog.dismiss();
        }
    }
}

3.MyApplication.java

/**
 * 调用SharedPreferences时需要这个文件
 */
public class MyApplication extends Application {
    private SharedPreferences sharedPreferences;
    public static MyApplication application;

    @Override
    public void onCreate() {
        super.onCreate();
        application = this;
        initBaseUrl();//设置默认的url地址值
    }

    /**
     * 设置默认的url地址值
     */
    private void initBaseUrl() {
        sharedPreferences = getSharedPreferences(DialogUtils.URLSETTINGINFO, Context.MODE_PRIVATE);
        String localip = "";
        String localport = "";

        try {
            String[] port = PublicInfo.baseurl.split("\\:");
            localip = sharedPreferences.getString(DialogUtils.URLSETTINGIP, port[0]);
            localport = sharedPreferences.getString(DialogUtils.URLSETTINGPORT, port[1]);
            if(TextUtils.isEmpty(localport)){//如果前一次端口号存储为空,就不在网址后面追加端口号。
                PublicInfo.appurl = PublicInfo.urltitle + localip;//将本地存储的URL地址设置为程序中默认的网络请求地址。
            }else{
                PublicInfo.appurl = PublicInfo.urltitle + localip + ":" + localport;//将本地存储的URL地址设置为程序中默认的网络请求地址。
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

4.PublicInfo.java

/**
 * 这个类里存储需要调用的地址
 */
public class PublicInfo {
    public static String urltitle = "https://";
    public static String rul_dat = "www.baidu.com:80";
    public static String rul_uat = "www.zhihu.com:80";
    public static String rul_pro = "www.sina.com:80";

    public static String basetitle=urltitle;//设置默认的请求头(http或者https)
    public static String baseurl=rul_dat;//设置默认地址(dat,uat或者其他的)

    public static String appurl=basetitle+baseurl;//这里设置app的默认网络请求地址



}

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"
    tools:context=".MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="登录界面" />

        <TextView
            android:id="@+id/tv_url_ma"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:layout_marginTop="20dp"
            android:text="当前网络地址" />

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dp"
            >

            <TextView
                android:id="@+id/tv_changeurl_ma"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:padding="10dp"
                android:background="#00ff00"
                android:layout_marginLeft="30dp"
                android:text="修改地址" />

            <TextView
                android:id="@+id/tv_refresh_ma"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:padding="10dp"
                android:background="#ff0000"
                android:layout_alignParentRight="true"
                android:layout_marginRight="30dp"
                android:text="刷新页面" />
        </RelativeLayout>
        <WebView
            android:id="@+id/wv_showurl_ma"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"/>
    </LinearLayout>


</androidx.constraintlayout.widget.ConstraintLayout>

6.spinner_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="spinner里面每个选项的布局"
    android:gravity="center"
    android:padding="10dp"
    >

</TextView>

7.utils_dialog.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="340dp"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:background="#ffffff"
    android:orientation="vertical">

    <TextView
        android:id="@+id/tv_title_udg"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:padding="10dp"
        android:text="标题栏"
        android:textSize="20sp" />

    <TextView
        android:id="@+id/tv_nowurl_udg"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:padding="10dp"
        android:text="当前的url地址:" />

    <Spinner
        android:id="@+id/sp_checkurl_udg"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginTop="10dp" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:padding="10dp">
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:layout_weight="3"
            >
            <TextView
                android:id="@+id/tv_iptitle_udg"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="ip地址:"
                />
            <androidx.appcompat.widget.AppCompatEditText
                android:id="@+id/et_ipurl_udg"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:hint="ip地址" />
        </LinearLayout>

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:layout_weight="1"
            android:gravity="center"
            >
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="端口号:"
                />
            <androidx.appcompat.widget.AppCompatEditText
                android:id="@+id/et_port_udg"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentRight="true"
                android:hint="端口号" />
        </LinearLayout>

    </LinearLayout>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="10dp">

        <androidx.appcompat.widget.AppCompatButton
            android:id="@+id/btn_ok_udg"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="确定" />

        <androidx.appcompat.widget.AppCompatButton
            android:id="@+id/btn_cancel_udg"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:text="取消" />
    </RelativeLayout>

</LinearLayout>

8.AndroidManifest.xml(这个很重要,一个是添加了网路权限,另一个是将app默认的Application设置为上面自己设置的MyApplication,这个是很重要的,别偷懒啊)

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.loginactivity">

<!--    设置用户网络权限-->
    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:name=".MyApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/396743.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android提词器实现富文本样式

前提前一段时间做了一个程序&#xff0c;提词器APP&#xff0c;结合greendao保存数据。最近新增了一个需求&#xff0c;实现部分文字富文本的展现。师傅找了一个网上的SDK&#xff0c;但是在集成的时候总是出问题&#xff0c;我又不想把项目挪进来&#xff0c;感觉很麻烦&#…

Oracle P6 Professional相比与Microsoft Project的8个优势

目录 引言 1. 自上而下的调度 2. 努力程度 (LOE) 活动 3. 最长路径 4. 多浮动路径分析功能 6.预算材料成本 7. 开始和完成里程碑 8. 工作公式类型 概括 引言 哪种日程安排工具更适合您的情况&#xff0c;Oracle Primavera P6 还是 Microsoft Project(MSP) 经常有一些…

MySQL8.0Linux安装及主从的搭建

MySQL8.0Linux安装教程 下载并安装 需要说明的一点是我使用的是SSH secure shell Client连接linux系统的&#xff0c;它的用法和命令窗口差不多。界面如图&#xff1a;一样的使用Linux命令操作。 话不多说 第一步&#xff1a; 1&#xff09;、切换到 /usr/local下 cd /usr/…

已解决hint : See above for output from the failure.

已解决&#xff08;pip install wxPython安装失败&#xff09;error: legacy-instal1-failure Encountered error while trying to install package.wxPython note: This is an issue with the package mentioned above&#xff0c;not pip. hint : See above for output from …

关于世界坐标系,相机坐标系,图像坐标系,像素坐标系的一些理解

关于世界坐标系&#xff0c;相机坐标系&#xff0c;图像坐标系&#xff0c;像素坐标系的一些理解前言一、各坐标系的含义二、坐标系转换1.世界坐标系与相机坐标系&#xff08;旋转与平移&#xff09;2.相机坐标系与图像坐标系&#xff08;透视&#xff09;3.图像坐标系与像素坐…

【UE4 RTS游戏】02-摄像机运动_完成摄像机在X轴上运动的相关步骤

效果通过控制键盘WS键使得“CameraPawn”进行前后移动步骤将landscape的Z轴位置更改为0删除“PostProcessVolume”将“LightmassImportanceVolume”移入Lighting文件夹内新建一个蓝图类&#xff0c;父类是Pawn&#xff0c;命名为“CameraPawn”将“MyController”重命名为“Cam…

详解JVM

详解JVM 最近学习了&#xff1a;周志明《深入理解高并发编程》&#xff1b;&#xff1b; 特此简要对学习做了部分总结&#xff0c;方便后续对JVM相关知识的完善和巩固&#xff1b; 若想深入了解学习&#xff0c;可阅读上述参考原著&#xff1b; Java内存区域与OOM 运行时数据…

大数据 | (三)centos7图形界面无法执行yum命令

大家好&#xff0c;今天是三八女神节了&#xff01; 你知道吗&#xff1f;世界上第一位电脑程序设计师是名女性&#xff0c;Ada Lovelace (1815-1852)。 她是一位英国数学家兼作家&#xff0c;第一位主张计算机不只可以用来算数的人&#xff0c;也发表了第一段分析机用的演算…

vector中迭代器失效的问题及解决办法

目录 vector常用接口 vector 迭代器失效问题 vector中深浅拷贝问题 vector的数据安排以及操作方式&#xff0c;与array非常相似。两者的唯一差别在于空间的运用的灵活性。array 是静态空间&#xff0c;一旦配置了就不能改变&#xff1b;要换个大(或小) 一点的房子&#x…

CorelDRAW Graphics Suite2023更新内容介绍

懂设计的职场人都知道这款软件&#xff0c;CorelDRAW是一款非常高效的矢量图形设计软件。CorelDRAW操作界面简洁易懂&#xff0c;能够为用户提供精确地创建物体的尺寸和位置的功能&#xff0c;减少点击步骤&#xff0c;提高设计效率&#xff0c;节省设计时间。功能比普通的美图…

简单理解TransFormer

背景:听了李宏毅老师关于transformer的讲解&#xff0c;觉得有必要记录一下&#xff0c;里面的PPT都是李宏毅老师的内容(不喜勿喷)1.self-attention在介绍transformer之前&#xff0c;必须先了解self-attention(1) 先将X输入Embedding(a Wx), 然后a乘相关的权重&#xff0c;生…

Day11-网页布局实战-CSS3动画

文章目录一 CSS3动画1 2D动画案例1-鼠标输入移入DIV 让图片旋转90度案例2-鼠标输入移入DIV 缩放图片案例3-贯穿项目-DIV移动2 animation动画播放器案例1-基础案例案例2-使用百分比关键帧定义动画案例3-旋转的图片案例4-贯穿案例-轮播图3 多余文本省略号...代替案例1-多余文本..…

一 Go环境搭建

1. 下载地址 https://golang.google.cn/dl/ 傻瓜式安装&#xff0c;自动会配置path的变量&#xff0c;安装完成后可以使用go version 查看当前安装的版本 本文使用目前最新的1.20.2版本 2. 配置go环境 cmd控制栏打开输入以下命令&#xff08;如果cmd有问题可以尝试powershe…

340秒语音芯片,轻松实现语音交互,畅享智能生活WTV380语音ic方案

随着智能家居、安防报警、宠物用品 等&#xff0c;智能设备的普及&#xff0c;语音交互技术正在逐渐成为人机交互的主要方式之一。而如何实现稳定高效的语音交互&#xff0c;就需要借助先进的语音芯片技术。今天&#xff0c;我们介绍的是一款高性能的语音芯片——WTV380&#x…

Gamma矫正

Gamma 曲线Gamma校正被使用在8位RGB图中。用来解决在有限的存储空间中保存尽可能多的人类感受敏感的色彩内容。Gamma 矫正Gamma校正的方式就是采样时,和输出到显示器给人类看时,对亮度进行的调整.如采样时 Gamma1/2.2 调亮Gamma&#xff0c;如显示时 Gamma2.2 调暗Gamma实际亮度…

【Redis】Redis慢查询

文章目录慢查询记录慢查询两个配置参数修改配置参数慢查询日志慢查询记录 我们都知道像mysql等持久化数据库会有慢查询日志&#xff0c;其实Redis中也有慢查询日志的功能。慢查询就是系统在执行命令的前后计算每条命令的执行时间&#xff0c;如果超过我们预设的时间&#xff0c…

登录接口-简约版(工作日记4)

前提条件&#xff1a; 1、jmeter接口测试工具 2、接口信息 获取验证码信息 登录接口信息 题外话&#xff1a; 接口返回的数据中如果有文字就会乱码 怎么解决 1、进入jmter文件–进入bin文件夹&#xff0c;找到jmeter.properties文件 2、右键打开&#xff0c;可以用文本模…

基于遗传算法的CVRP建模求解(Python)

带容量约束的车辆路径优化问题&#xff0c;CVRP&#xff0c;对一系列装卸货点进行适当的路径规划&#xff0c;在满足约束条件&#xff08;客户需求、车辆载重和容积、车型、车辆行驶里程、配送中心数量等限制&#xff09;和目标最优化&#xff08;路程最短、成本最低、使用车辆…

点灯大师--点个正点原子阿尔法开发板的灯

点灯大师–点个正点原子阿尔法开发板的灯 文章目录点灯大师--点个正点原子阿尔法开发板的灯正点原子阿尔法开发板点灯1、使能 GPIO1 时钟2、设置 GPIO1_IO03 的复用功能3、配置 GPIO1_IO034、设置 GPIO5、控制 GPIO 的输出电平五种点灯的方法1.在一个驱动文件中实现寄存器初始化…

【C语言】编译+链接

一、程序的翻译环境和执行环境 在ANSI C的任何一种实现中&#xff0c;存在两个不同的环境。 第1种是翻译环境&#xff0c;在这个环境中源代码被转换为可执行的机器指令。 第2种是执行环境&#xff0c;它用于实际执行代码。详解编译链接翻译环境1.组成一个程序的每个源文件通过…